CNN
CNN
"""
Parameters:
Returns:
"""
# Get dimensions
if padding > 0:
image = padded_image
# Perform convolution
y_pos = y * stride
x_pos = x * stride
return output
def relu(x):
return np.maximum(0, x)
"""
Parameters:
Returns:
"""
# Get dimensions
# Initialize output
for y in range(output_height):
for x in range(output_width):
y_pos = y * stride
x_pos = x * stride
# Extract window
output[y, x] = np.max(window)
return output
# Create a simple 8x8 image (grayscale)
horizontal_edge_kernel = np.array([
[0, 0, 0],
[1, 1, 1]
])
vertical_edge_kernel = np.array([
[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1]
])
diagonal_edge_kernel = np.array([
[-1, 0, 1],
[0, 1, 1]
])
# Apply convolutions
horizontal_feature_map_relu = relu(horizontal_feature_map)
vertical_feature_map_relu = relu(vertical_feature_map)
diagonal_feature_map_relu = relu(diagonal_feature_map)
horizontal_feature_map_pooled = max_pooling(horizontal_feature_map_relu)
vertical_feature_map_pooled = max_pooling(vertical_feature_map_relu)
diagonal_feature_map_pooled = max_pooling(diagonal_feature_map_relu)
plt.figure(figsize=(12, 4))
plt.subplot(1, 4, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')
plt.subplot(1, 4, 2)
plt.imshow(horizontal_edge_kernel, cmap='viridis')
plt.axis('off')
plt.subplot(1, 4, 3)
plt.imshow(vertical_edge_kernel, cmap='viridis')
plt.axis('off')
plt.subplot(1, 4, 4)
plt.imshow(diagonal_edge_kernel, cmap='viridis')
plt.tight_layout()
plt.show()
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(horizontal_feature_map, cmap='gray')
plt.axis('off')
plt.subplot(1, 3, 2)
plt.imshow(vertical_feature_map, cmap='gray')
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(diagonal_feature_map, cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.show()
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(horizontal_feature_map_relu, cmap='gray')
plt.title('Horizontal Feature Map (ReLU)')
plt.axis('off')
plt.subplot(1, 3, 2)
plt.imshow(vertical_feature_map_relu, cmap='gray')
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(diagonal_feature_map_relu, cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.show()
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(horizontal_feature_map_pooled, cmap='gray')
plt.axis('off')
plt.subplot(1, 3, 2)
plt.imshow(vertical_feature_map_pooled, cmap='gray')
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(diagonal_feature_map_pooled, cmap='gray')
plt.title('Diagonal Feature Map (Pooled)')
plt.axis('off')
plt.tight_layout()
plt.show()
# Let's create a second layer of filters that operate on the pooled feature maps
second_layer_filter = np.array([
[1, 0],
[0, 1]
])
second_layer_h_relu = relu(second_layer_h)
second_layer_v_relu = relu(second_layer_v)
second_layer_d_relu = relu(second_layer_d)
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.imshow(second_layer_h_relu, cmap='gray')
plt.subplot(1, 3, 2)
plt.imshow(second_layer_v_relu, cmap='gray')
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(second_layer_d_relu, cmap='gray')
plt.axis('off')
plt.tight_layout()
plt.show()
flattened_features = np.concatenate([
second_layer_h_relu.flatten(),
second_layer_v_relu.flatten(),
second_layer_d_relu.flatten()
])
# Visualize the flattened features (what would be fed to fully connected layers)
plt.figure(figsize=(10, 4))
plt.bar(range(len(flattened_features)), flattened_features)
plt.xlabel('Feature Index')
plt.ylabel('Feature Value')
plt.tight_layout()
plt.show()
# Simple demonstration of how a fully connected layer would process these features
# Define some random weights (in a real CNN these would be learned)
def softmax(x):
class_probabilities = softmax(fc_output)
plt.figure(figsize=(8, 4))
plt.bar(range(num_classes), class_probabilities)
plt.xlabel('Class')
plt.ylabel('Probability')
plt.xticks(range(num_classes))
plt.tight_layout()
plt.show()
print("and fully connected layers, showing how a CNN processes an image step by step.")