Debug School

rakesh kumar
rakesh kumar

Posted on

Listout Tensorflow and Tensorflow pipeline commands

Why use Tensor
Tensorflow basic operation
Tensorflow Pipeline commands

Why use Tensor

In TensorFlow, tensors are the primary data structure, similar in some ways to lists or NumPy arrays but designed specifically for operations in deep learning and optimized for parallel computing, especially on GPUs. Here's a breakdown of how tensors differ from Python lists and NumPy arrays:

Image description

TensorFlow tensors are more rigid but also much faster for computation-heavy tasks, especially in deep learning. Lists, by contrast, are more flexible but slower and don’t support advanced mathematical operations directly

Image description

Key Differences Summary
Device Compatibility: Tensors can run on GPUs and TPUs, whereas NumPy is typically limited to the CPU.
Execution Model: Tensors can use "graph execution," optimizing and compiling the operations for performance, while NumPy arrays only support direct, immediate operations.
Automatic Differentiation: TensorFlow tensors support automatic differentiation, crucial for training machine learning models. NumPy arrays don’t inherently support this.
Interoperability: TensorFlow can interconvert with NumPy easily, allowing the use of NumPy arrays in tensor operations when needed.

Tensorflow basic operation

  1. tf.add (Addition) Purpose: Adds two tensors element-wise. Example:
a = tf.constant([1, 2, 3])
b = tf.constant([4, 5, 6])
result = tf.add(a, b)
Enter fullscreen mode Exit fullscreen mode

Output:

[5, 7, 9]
Enter fullscreen mode Exit fullscreen mode
  1. tf.subtract (Subtraction) Purpose: Subtracts one tensor from another, element-wise. Example:
result = tf.subtract(a, b)
Enter fullscreen mode Exit fullscreen mode

Output:

[-3, -3, -3]
Enter fullscreen mode Exit fullscreen mode
  1. tf.multiply (Element-wise Multiplication) Purpose: Multiplies two tensors element-wise. Example:
result = tf.multiply(a, b)
Enter fullscreen mode Exit fullscreen mode

Output:

[4, 10, 18]
Enter fullscreen mode Exit fullscreen mode
  1. tf.divide (Element-wise Division) Purpose: Divides elements of one tensor by another, element-wise. Example:
result = tf.divide(a, b)
Enter fullscreen mode Exit fullscreen mode

Output:

[0.25, 0.4, 0.5]
Enter fullscreen mode Exit fullscreen mode
  1. tf.reduce_sum (Summation) Purpose: Sums up all elements in a tensor along a specified axis. Example:
result = tf.reduce_sum(a)
Enter fullscreen mode Exit fullscreen mode

Output:

6
Enter fullscreen mode Exit fullscreen mode
  1. tf.reduce_mean (Mean/Average) Purpose: Computes the mean of elements in a tensor. Example:
result = tf.reduce_mean(a)
Enter fullscreen mode Exit fullscreen mode

Output:

2.0
Enter fullscreen mode Exit fullscreen mode
  1. tf.reshape (Reshaping) Purpose: Changes the shape of a tensor without changing its data. Example:
tensor = tf.constant([[1, 2], [3, 4]])
result = tf.reshape(tensor, [4])
Enter fullscreen mode Exit fullscreen mode

Output:

[1, 2, 3, 4]
Enter fullscreen mode Exit fullscreen mode
  1. tf.transpose (Transpose) Purpose: Transposes a tensor, switching its dimensions. Example:
tensor = tf.constant([[1, 2], [3, 4]])
result = tf.transpose(tensor)
Enter fullscreen mode Exit fullscreen mode

Output:

[[1, 3], [2, 4]]
Enter fullscreen mode Exit fullscreen mode
  1. tf.matmul (Matrix Multiplication) Purpose: Multiplies two matrices. Example:

tensor_a = tf.constant([[1, 2], [3, 4]])
tensor_b = tf.constant([[2, 0], [1, 2]])

result = tf.matmul(tensor_a, tensor_b)
Enter fullscreen mode Exit fullscreen mode

Output:

[[4, 4], [10, 8]]
Enter fullscreen mode Exit fullscreen mode
  1. tf.argmax (Argmax) Purpose: Finds the index of the maximum value along an axis.
result = tf.argmax(a)
Enter fullscreen mode Exit fullscreen mode

Output:

2
Enter fullscreen mode Exit fullscreen mode
  1. tf.cast (Type Casting) Purpose: Changes the data type of a tensor.
result = tf.cast(a, tf.float32)
Enter fullscreen mode Exit fullscreen mode

Output:

[1.0, 2.0, 3.0]
Enter fullscreen mode Exit fullscreen mode
  1. tf.concat (Concatenation) Purpose: Concatenates two or more tensors along a specified axis. Example:
tensor_b = tf.constant([7, 8, 9])
result = tf.concat([a, tensor_b], axis=0)
Enter fullscreen mode Exit fullscreen mode

Output:

[1, 2, 3, 7, 8, 9]
Enter fullscreen mode Exit fullscreen mode
  1. tf.expand_dims (Add Dimension) Purpose: Adds an extra dimension to a tensor.
result = tf.expand_dims(a, axis=0)
Enter fullscreen mode Exit fullscreen mode

Output:

[[1, 2, 3]]
Enter fullscreen mode Exit fullscreen mode
  1. tf.squeeze (Remove Dimension) Purpose: Removes dimensions of size 1 from a tensor.
tensor = tf.constant([[[1], [2], [3]]])
result = tf.squeeze(tensor)
Enter fullscreen mode Exit fullscreen mode

Output:

[1, 2, 3]
Enter fullscreen mode Exit fullscreen mode
  1. tf.one_hot (One-Hot Encoding) Purpose: Creates a one-hot encoded tensor.
indices = [0, 1, 2]
result = tf.one_hot(indices, depth=3)
Enter fullscreen mode Exit fullscreen mode

Output:

[[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]
Enter fullscreen mode Exit fullscreen mode

Tensorflow Pipeline commands

tf.data.Dataset.from_tensor_slices
Purpose: Converts a tensor or array into a dataset, slicing along the first dimension.
Example:

data = tf.constant([1, 2, 3, 4, 5])
dataset = tf.data.Dataset.from_tensor_slices(data)
Enter fullscreen mode Exit fullscreen mode

Output:

<Dataset element_spec=TensorSpec(shape=(), dtype=tf.int32)>
Enter fullscreen mode Exit fullscreen mode

Creating a Dataset for Features Only

import tensorflow as tf

features = [1, 2, 3, 4, 5]
dataset = tf.data.Dataset.from_tensor_slices(features)

for item in dataset:
    print(item)
Enter fullscreen mode Exit fullscreen mode

Output: Each item in dataset is an integer from the features list:

tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(2, shape=(), dtype=int32)
Enter fullscreen mode Exit fullscreen mode

Creating a Dataset for Paired Data (Features and Labels)
In supervised learning, from_tensor_slices is often used to create datasets that pair input data (features) with labels.

features = ["TensorFlow", "Keras", "Pandas"]
labels = [1, 0, 1]
dataset = tf.data.Dataset.from_tensor_slices((features, labels))

for feature, label in dataset:
    print(feature.numpy().decode('utf-8'), label.numpy())
Enter fullscreen mode Exit fullscreen mode

Output: Each item is a tuple containing a feature and its label:

TensorFlow 1
Keras 0
Pandas 1
Enter fullscreen mode Exit fullscreen mode
sentences = [
    "TensorFlow is great for machine learning",
    "Natural language processing is fun",
    "I love creating deep learning models",
    "Transformers have revolutionized NLP",
    "TensorFlow Hub provides pre-trained models"
]
labels = [1, 0, 1, 0, 1]  # Example binary labels

# Create a tf.data Dataset from sentences and labels
data = tf.data.Dataset.from_tensor_slices((sentences, labels))
for sentence, label in data:
    print("Sentence:", sentence.numpy().decode('utf-8'))
    print("Label:", label.numpy())
Enter fullscreen mode Exit fullscreen mode

output

Image description

Dataset.map
Purpose: Applies a transformation function to each element in the dataset.
Example:

def add_one(x):
    return x + 1
dataset = dataset.map(add_one)
Enter fullscreen mode Exit fullscreen mode

Output:

2, 3, 4, 5, 6
Enter fullscreen mode Exit fullscreen mode

Create tf dataset from a list

import tensorflow as tf

daily_sales_numbers = [21, 22, -108, 31, -1, 32, 34,31]

tf_dataset = tf.data.Dataset.from_tensor_slices(daily_sales_numbers)
tf_dataset
Enter fullscreen mode Exit fullscreen mode

output

<TensorSliceDataset shapes: (), types: tf.int32>
Enter fullscreen mode Exit fullscreen mode

Iterate through tf dataset

for sales in tf_dataset:
    print(sales.numpy())
Enter fullscreen mode Exit fullscreen mode

output

Image description

Iterate through elements as numpy elements

for sales in tf_dataset.as_numpy_iterator():
    print(sales)
Enter fullscreen mode Exit fullscreen mode

Image description

Iterate through first n elements in tf dataset

for sales in tf_dataset.take(3):
    print(sales.numpy())
Enter fullscreen mode Exit fullscreen mode

Image description

Filter sales numbers that are < 0

tf_dataset = tf_dataset.filter(lambda x: x>0)
for sales in tf_dataset.as_numpy_iterator():
    print(sales)
Enter fullscreen mode Exit fullscreen mode

output

Image description

Convert sales numbers from USA dollars ($) to Indian Rupees (INR) Assuming 1->72 conversation rate


tf_dataset = tf_dataset.map(lambda x: x*72)
for sales in tf_dataset.as_numpy_iterator():
    print(sales)
Enter fullscreen mode Exit fullscreen mode

Image description

Shuffe

tf_dataset = tf_dataset.shuffle(2)
for sales in tf_dataset.as_numpy_iterator():
    print(sales)
Enter fullscreen mode Exit fullscreen mode

Image description

Batching

for sales_batch in tf_dataset.batch(2):
    print(sales_batch.numpy())
Enter fullscreen mode Exit fullscreen mode

Image description

Perform all of the above operations in one shot

tf_dataset = tf.data.Dataset.from_tensor_slices(daily_sales_numbers)

tf_dataset = tf_dataset.filter(lambda x: x>0).map(lambda y: y*72).shuffle(2).batch(2)
for sales in tf_dataset.as_numpy_iterator():
    print(sales)
Enter fullscreen mode Exit fullscreen mode

Image description

Prefetching

dataset = dataset.prefetch(buffer_size=tf.data.AUTOTUNE)
Enter fullscreen mode Exit fullscreen mode

Explanation: Loads the next batch while the current one is processed.
Performance Improvement: Overlaps data loading with training, minimizing waiting time.

The dataset.prefetch(buffer_size=tf.data.AUTOTUNE) operation is used to improve data loading efficiency by preloading (prefetching) data before it is needed during training. This helps to keep the training pipeline fast by overlapping the data preparation and model training steps, so the model can continuously consume data without waiting.

Here’s a full example that includes the use of .prefetch() in a TensorFlow data pipeline:

Example
Let's start with a simple dataset of sentences and labels, as before, and add some additional processing steps such as mapping, batching, and prefetching.

import tensorflow as tf

# Example dataset: List of sentences and corresponding labels
sentences = [
    "TensorFlow is great for machine learning",
    "Natural language processing is fun",
    "I love creating deep learning models",
    "Transformers have revolutionized NLP",
    "TensorFlow Hub provides pre-trained models"
]
labels = [1, 0, 1, 0, 1]  # Example binary labels

# Step 1: Create a tf.data.Dataset from sentences and labels
dataset = tf.data.Dataset.from_tensor_slices((sentences, labels))

# Step 2: Define a simple map function to encode sentences as lowercase strings
def preprocess_text(sentence, label):
    sentence = tf.strings.lower(sentence)  # Convert to lowercase
    return sentence, label

# Apply the map function to preprocess each sentence
dataset = dataset.map(preprocess_text)

# Step 3: Batch the dataset
dataset = dataset.batch(2)

# Step 4: Add prefetching to the dataset
dataset = dataset.prefetch(buffer_size=tf.data.AUTOTUNE)

# Iterating through the dataset to see the output
for sentence_batch, label_batch in dataset:
    print("Sentence Batch:", [sentence.numpy().decode('utf-8') for sentence in sentence_batch])
    print("Label Batch:", label_batch.numpy())
    print("---")
Enter fullscreen mode Exit fullscreen mode

Image description

Expected Output

Sentence Batch: ['tensorflow is great for machine learning', 'natural language processing is fun']
Label Batch: [1 0]
---
Sentence Batch: ['i love creating deep learning models', 'transformers have revolutionized nlp']
Label Batch: [1 0]
---
Sentence Batch: ['tensorflow hub provides pre-trained models']
Label Batch: [1]
Enter fullscreen mode Exit fullscreen mode

Parallel Mapping

dataset = dataset.map(process_image, num_parallel_calls=tf.data.AUTOTUNE)
Enter fullscreen mode Exit fullscreen mode

Explanation: Applies transformations (e.g., decoding, resizing) in parallel.
Performance Improvement: Speeds up processing by using multiple CPU core

The dataset.map(process_image, num_parallel_calls=tf.data.AUTOTUNE) operation in TensorFlow applies the process_image function to each element in the dataset, with parallelization to improve data processing speed. The num_parallel_calls=tf.data.AUTOTUNE argument lets TensorFlow decide the optimal number of parallel calls to maximize CPU efficiency, enhancing the speed of the data pipeline.

Let’s go through a complete example where we load and preprocess image data. We’ll create a synthetic dataset of image paths and labels, define a preprocessing function (process_image) that resizes and normalizes each image, and then use .map() with num_parallel_calls=tf.data.AUTOTUNE for parallel processing.

import tensorflow as tf

# Simulate a list of image file paths and labels
image_paths = ["image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg"]
labels = [0, 1, 0, 1]  # Example binary labels

# Step 1: Create a tf.data.Dataset from the image paths and labels
dataset = tf.data.Dataset.from_tensor_slices((image_paths, labels))

# Step 2: Define the image processing function
def process_image(file_path, label):
    # Load the image from the file path (simulated here; replace with actual images in practice)
    image = tf.random.uniform(shape=[256, 256, 3], minval=0, maxval=255, dtype=tf.float32)  # Simulating a 256x256 image

    # Resize the image to a fixed size (e.g., 128x128)
    image = tf.image.resize(image, [128, 128])

    # Normalize the image to the range [0, 1]
    image = image / 255.0

    return image, label

# Step 3: Map the process_image function across the dataset with parallel processing
dataset = dataset.map(process_image, num_parallel_calls=tf.data.AUTOTUNE)

# Step 4: Batch the dataset
dataset = dataset.batch(2)

# Step 5: Prefetch for performance
dataset = dataset.prefetch(buffer_size=tf.data.AUTOTUNE)

# Iterate through the dataset and print out the processed images and labels
for image_batch, label_batch in dataset:
    print("Image Batch Shape:", image_batch.shape)
    print("Label Batch:", label_batch.numpy())
    print("---")
Enter fullscreen mode Exit fullscreen mode

Image description

Expected Output
Running this code will output the processed and batched data:

Image Batch Shape: (2, 128, 128, 3)
Label Batch: [0 1]
---
Image Batch Shape: (2, 128, 128, 3)
Label Batch: [0 1]
Enter fullscreen mode Exit fullscreen mode

Resizing Images

dataset = dataset.map(lambda x: tf.image.resize(x, [128, 128]))
Enter fullscreen mode Exit fullscreen mode

Explanation: Resizes images to a fixed size.
Performance Improvement: Reduces memory usage and standardizes inputs, which accelerates training.

The line dataset = dataset.map(lambda x: tf.image.resize(x, [128, 128])) 
Enter fullscreen mode Exit fullscreen mode

is using map to apply a lambda function to each element in the dataset. This lambda function resizes each image in the dataset to a specified shape—in this case, 128x128 pixels.

Let’s walk through a full example where we create a dataset of images, resize each image to a fixed size using tf.image.resize within map, and then view the output.

Example
Here, we will simulate a dataset of images represented by tensors, apply resizing to each image, and observe the output.

import tensorflow as tf

# Step 1: Simulate a dataset of images (each image has a different random size)
image_tensors = [
    tf.random.uniform(shape=[150, 150, 3], minval=0, maxval=255, dtype=tf.float32),  # 150x150 image
    tf.random.uniform(shape=[200, 200, 3], minval=0, maxval=255, dtype=tf.float32),  # 200x200 image
    tf.random.uniform(shape=[300, 300, 3], minval=0, maxval=255, dtype=tf.float32),  # 300x300 image
]

# Step 2: Create a tf.data.Dataset from the list of image tensors
dataset = tf.data.Dataset.from_tensor_slices(image_tensors)

# Step 3: Apply resizing to each image using a lambda function within map
# Resize all images to 128x128
dataset = dataset.map(lambda x: tf.image.resize(x, [128, 128]))

# Step 4: Batch the dataset (optional, for demonstration)
dataset = dataset.batch(2)

# Step 5: Iterate through the dataset and print out the shape of each resized image batch
for image_batch in dataset:
    print("Image Batch Shape:", image_batch.shape)
Enter fullscreen mode Exit fullscreen mode

Image description

Expected Output
Running this code should output:


Image Batch Shape: (2, 128, 128, 3)
Image Batch Shape: (1, 128, 128, 3)
Enter fullscreen mode Exit fullscreen mode

Normalization

dataset = dataset.map(lambda x, y: (x / 255.0, y))
Enter fullscreen mode Exit fullscreen mode

Explanation: Scales image pixel values to [0, 1].
Performance Improvement: Improves model convergence by keeping inputs within a standard range.

he line dataset = dataset.map(lambda x, y: (x / 255.0, y)) applies a transformation to each element in the dataset using map. Specifically, it normalizes the pixel values of images in the dataset by dividing each pixel by 255.0, converting the pixel values from the range [0, 255] to [0, 1]. This normalization step is often used to make data easier to work with in neural networks, as it reduces the range of input values, which can improve training stability.

Let’s walk through a complete example with images and labels, applying this normalization step and examining the output.

Example
Suppose we have a dataset of synthetic images with pixel values in the range 0, 255, and each image has a corresponding label. We will normalize each image and observe how the data changes.

import tensorflow as tf

# Step 1: Simulate a dataset of images with values in the range [0, 255] and corresponding labels
image_tensors = [
    tf.random.uniform(shape=[64, 64, 3], minval=0, maxval=255, dtype=tf.float32),  # Random 64x64 image
    tf.random.uniform(shape=[64, 64, 3], minval=0, maxval=255, dtype=tf.float32),  # Another random 64x64 image
    tf.random.uniform(shape=[64, 64, 3], minval=0, maxval=255, dtype=tf.float32),  # Another random 64x64 image
]
labels = [0, 1, 0]  # Example binary labels

# Step 2: Create a tf.data.Dataset from the images and labels
dataset = tf.data.Dataset.from_tensor_slices((image_tensors, labels))

# Step 3: Apply normalization to each image using a lambda function within map
dataset = dataset.map(lambda x, y: (x / 255.0, y))  # Normalize each image by dividing by 255.0

# Step 4: Batch the dataset (optional, for demonstration)
dataset = dataset.batch(2)

# Step 5: Iterate through the dataset and print out the first few pixel values of each image batch
for image_batch, label_batch in dataset:
    print("Image Batch (Normalized):", image_batch.numpy()[0, :5, :5, 0])  # Print a small section of the first image's first channel
    print("Label Batch:", label_batch.numpy())
    print("---")
Enter fullscreen mode Exit fullscreen mode

Image description

Expected Output

Image description

Purpose of Normalization
Normalizing image pixel values to [0, 1] is beneficial for neural networks because it makes training more stable and efficient. Neural networks tend to converge faster and perform better when input data is on a consistent scale, especially within a smaller range like [0, 1]. This step is therefore essential for image preprocessing in deep learning pipelines.

Image Transformation

Explanation of Each Transformation
Random Horizontal Flip (tf.image.random_flip_left_right):

Randomly flips each image horizontally with a 50% chance. This is useful for images where left-right orientation doesn’t matter (e.g., natural scenes).
Rotate 90 Degrees (tf.image.rot90):

Rotates each image by 90 degrees counterclockwise. Rotating an image adds variety and may help the model become invariant to object orientation.
Random Brightness (tf.image.random_brightness):

Adjusts brightness by a random factor in the range -0.2, 0.2. This helps the model learn to handle lighting variations.
Random Contrast (tf.image.random_contrast):

Adjusts contrast by a random factor between 0.5 and 1.5. Adding contrast variation helps the model learn to generalize across different lighting conditions.
Random Saturation (tf.image.random_saturation):

Randomly adjusts saturation within the range [0.6, 1.4], making the colors more or less intense. This prepares the model to handle variations in color richness.
Per-Image Standardization (tf.image.per_image_standardization):

Normalizes each image so that it has a mean of 0 and a standard deviation of 1. This standardization can help with faster model convergence.
Central Crop (tf.image.central_crop):

Crops out the central 80% of the image (based on the 0.8 parameter), which can help the model focus on central objects and ignore background noise.

Organize Your Image Folder:

/path/to/images/
  ├── class_1/
  │   ├── img1.jpg
  │   ├── img2.jpg
  │   └── ...
  ├── class_2/
  │   ├── img1.jpg
  │   ├── img2.jpg
  │   └── ...
  └── ...
Enter fullscreen mode Exit fullscreen mode

mport TensorFlow and Other Necessary Libraries:

Import TensorFlow and any other libraries needed for your preprocessing.
Load Images Using image_dataset_from_directory:

Use this function to load images from the specified directory and automatically create labels based on the folder structure.
Apply Preprocessing and Augmentation:

Use the map function to apply various preprocessing steps to the dataset.
Example Code
Here’s a complete example demonstrating these steps:

import tensorflow as tf
import os

# Step 1: Define the path to your image folder
image_directory = '/path/to/images/'  # Change this to your folder path

# Step 2: Load images into a TensorFlow dataset
# Using image_dataset_from_directory to load images and create a dataset
dataset = tf.keras.preprocessing.image_dataset_from_directory(
    image_directory,
    image_size=(256, 256),  # Resize all images to 256x256
    batch_size=32,           # Set the batch size
    shuffle=True,            # Shuffle the dataset
)

# Step 3: Apply various preprocessing steps
# Apply data augmentation
dataset = dataset.map(lambda x, y: (tf.image.random_flip_left_right(x), y))
dataset = dataset.map(lambda x, y: (tf.image.rot90(x), y))
dataset = dataset.map(lambda x, y: (tf.image.random_brightness(x, 0.2), y))
dataset = dataset.map(lambda x, y: (tf.image.random_contrast(x, 0.5, 1.5), y))
dataset = dataset.map(lambda x, y: (tf.image.random_saturation(x, 0.6, 1.4), y))
dataset = dataset.map(lambda x, y: (tf.image.per_image_standardization(x), y))
dataset = dataset.map(lambda x, y: (tf.image.central_crop(x, 0.8), y))

# Step 4: Iterate through the dataset and display the shapes of the batches
for image_batch, label_batch in dataset.take(1):  # Take only one batch for demonstration
    print("Image Batch Shape:", image_batch.shape)
    print("Label Batch:", label_batch.numpy())
    # Optionally, print a small section of pixel values from the first image
    print("Sample Pixel Values (First Image):", image_batch[0, :5, :5, 0].numpy())  # Display the fi
Enter fullscreen mode Exit fullscreen mode

Image description

Expected Output

Image description

Top comments (0)