### What is Tensorflow ?

- It is a
**free and open-source platform for high-performance numerical computation**, specifically for ML and Deep Learning. - Has a
**flexible architecture**and can be deployed across a variety of platforms (CPUs, GPUs and TPUs) as well as mobile and edge devices. - Makes it
**easy to build and deploy Machine Learning solutions**.

### Applications of Tensorflow :

Tensorflow is used in applications such as Search Engines, Text Translation, Image Captioning, Recommendation Systems, etc

### Installation of Tensorflow :

#### 1. Installing tensorflow in python3

```
$ pip3 install tensorflow
```

#### 2. Installing tensorflow in python2

```
$ pip install tensorflow
```

#### 3. Install Tensorflow 2.0

```
$ pip install tensorflow==2.0.0-alpha0
```

#### 4. Install Tensorflow in Anaconda Environment

```
$ conda install tensorflow
```

### Tensor

A tensor is a **typed multi-dimenstional array**. It can be 0-dimensional, 1-dimensional, 2-dimensional and 3-dimensional or n-dimensional.

### Types of Tensors :

- Zero-dimensional - Scalar (magnitude only)
- One-dimensional - Vector (magnitude and direction)
- Two-dimensional - Matrix (table of numbers)
- Three-dimensional - Matrix (cube of numbers)
- N-dimensional - Matrix

### Important Keywords :

#### 1. Shape of a tensor :

- It is the
**number of elements in each dimension**. - To get the shape of a tensor we use :

```
>> tensor.shape
```

#### 2. Constant :

- It is a data structure in Tensorflow which when assigned,
**its values can't be changed at the execution time**. - Its initialization is with a value, not with an operation.

```
a = tf.constant([[1, 2], [3, 4]])
```

#### 3. Variable :

- They
**store the state of graph in Tensorflow**and**are mutable (i.e. can be changed during execution)**. - They need to be initialized while declaring it.

```
new_variable = tf.Variable([.5], dtype=tf.float32)
new_variable = tf.get_variable("my_variable", [1, 2, 3])
```

- Here its value can be changed using tf.assign().

#### 4. Placeholder :

- It is a variable which
**doesn't hold a value initially and value to it can be assigned later**. - The Data type of placeholder must be specified during the creation of placeholder.

#### 5. Rank :

- The rank of a tf.Tensor object is its number of dimensions. It is also called
**order**or**degree**.

### Important Components of Tensorflow:

#### 1. Graph:

- It is the backbone of any Tensorflow program.
- A Graph is
**composed of a series of nodes connected to each other by edges**. - Each node represents unit of computation and the edges represent the data consumed or produced by computation.

```
tf.get_default_graph()
# Creating a new graph
graph = tf.graph()
# Printing all operations in a graph
print(graph.get_operations())
```

##### Advantages of Graphs :

- Parallelism
- Distributed execution
- Compilation
- Portability

#### 2. Session:

- It
**allocates resources**. - Stores the actual values of intermediate results.

```
with tf.Session() as sess: # Creating a session
# Perform operations here
```

**Mathematical operations of Tensorflow**

```
>> tf.add(x,y) # Add two tensors of same type, x+y
>> tf.sub(x, y) # Subtract two tensors of same type, x-y
>> tf.mul(x, y) # Multiply two tensors element-wise
>> tf.pow(x, y) # Element-wise power of x to y
>> tf.exp(x) # Equivalent to pow(e, x)
>> tf.sqrt(x) # Equivlent to pow(x, 0.5)
>> tf.div(x, y) # Element wise division of x and y
>> tf.truediv(x, y) # Same as tf.div, but casts the arguments as float
>> tf.floordiv(x, y) # Same as truediv, excepts rouds final answer to an integer
>> tf.mod(x, y) # Element wise remainder from division
```

#### 3. Graph Visualizer

It is a component of TensorBoard that **renders the structure of your graph visually in browser**.

```
# Saving a graph for visualization
with tf.Session() as sess:
writer = tf.summary.FileWriter("/tmp/log/...", sess.graph)
```

### Imperative Programming Environment used by Tensorflow

#### Eager Execution

- Using eager execution
**you can run your code without a session**. - It evaluates operations immediately, without building graphs.

```
tf.enable_eager_execution() # To enable eager execution in old versions of Tensorflow
```

## Discussion (2)

very helpful

Thanks :D