Custom Models#
Advanced and specialized model architectures.
Inception-Style Module#
A model inspired by GoogLeNet’s Inception module:
import tensorflow as tf
from tensorflow import keras
import visualkeras
inputs = keras.Input(shape=(224, 224, 3))
# 1x1 convolution
branch1 = keras.layers.Conv2D(96, (1, 1), activation='relu')(inputs)
# 1x1 -> 3x3
branch2 = keras.layers.Conv2D(96, (1, 1), activation='relu')(inputs)
branch2 = keras.layers.Conv2D(128, (3, 3), activation='relu', padding='same')(branch2)
# 1x1 -> 5x5
branch3 = keras.layers.Conv2D(16, (1, 1), activation='relu')(inputs)
branch3 = keras.layers.Conv2D(32, (5, 5), activation='relu', padding='same')(branch3)
# Max pooling
branch4 = keras.layers.MaxPooling2D((3, 3), strides=(1, 1), padding='same')(inputs)
branch4 = keras.layers.Conv2D(32, (1, 1), activation='relu')(branch4)
# Concatenate all branches
output = keras.layers.Concatenate()([branch1, branch2, branch3, branch4])
model = keras.Model(inputs=inputs, outputs=output)
visualkeras.graph_view(model).show()
Dense Inception Stack#
Multiple Inception-like modules stacked together:
def inception_module(x, name=None):
"""Simple Inception module"""
branch1 = keras.layers.Conv2D(96, (1, 1), activation='relu')(x)
branch2 = keras.layers.Conv2D(96, (1, 1), activation='relu')(x)
branch2 = keras.layers.Conv2D(128, (3, 3), activation='relu', padding='same')(branch2)
branch3 = keras.layers.Conv2D(16, (1, 1), activation='relu')(x)
branch3 = keras.layers.Conv2D(32, (5, 5), activation='relu', padding='same')(branch3)
return keras.layers.Concatenate()([branch1, branch2, branch3])
inputs = keras.Input(shape=(224, 224, 3))
x = inception_module(inputs, name='inception_1')
x = inception_module(x, name='inception_2')
x = keras.layers.GlobalAveragePooling2D()(x)
outputs = keras.layers.Dense(1000, activation='softmax')(x)
model = keras.Model(inputs=inputs, outputs=outputs)
visualkeras.graph_view(model).show()
Encoder-Decoder Architecture#
An encoder-decoder model for tasks like semantic segmentation:
inputs = keras.Input(shape=(256, 256, 3))
# Encoder
x = keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same')(inputs)
x = keras.layers.MaxPooling2D((2, 2))(x)
x = keras.layers.Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = keras.layers.MaxPooling2D((2, 2))(x)
# Decoder
x = keras.layers.UpSampling2D((2, 2))(x)
x = keras.layers.Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = keras.layers.UpSampling2D((2, 2))(x)
x = keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same')(x)
# Output
outputs = keras.layers.Conv2D(3, (1, 1), activation='sigmoid')(x)
model = keras.Model(inputs=inputs, outputs=outputs)
visualkeras.graph_view(model).show()
See Also#
Functional Models for other complex models
Tutorials for tutorials