import tensorflow as tf
from tensorflow.keras import layers, models
# Define an Inception module
class InceptionModule(layers.Layer):
def __init__(self, filters_1x1, filters_3x3_reduce, filters_3x3, filters_5x5_reduce, filters_5x5, filters_pool_proj):
super(InceptionModule, self).__init__()
self.conv_1x1 = layers.Conv2D(filters_1x1, (1,1), padding='same', activation='relu')
self.conv_3x3_reduce = layers.Conv2D(filters_3x3_reduce, (1,1), padding='same', activation='relu')
self.conv_3x3 = layers.Conv2D(filters_3x3, (3,3), padding='same', activation='relu')
self.conv_5x5_reduce = layers.Conv2D(filters_5x5_reduce, (1,1), padding='same', activation='relu')
self.conv_5x5 = layers.Conv2D(filters_5x5, (5,5), padding='same', activation='relu')
self.pool_proj = layers.Conv2D(filters_pool_proj, (1,1), padding='same', activation='relu')
self.max_pool = layers.MaxPooling2D((3,3), strides=(1,1), padding='same')
def call(self, x):
path1 = self.conv_1x1(x)
path2 = self.conv_3x3(self.conv_3x3_reduce(x))
path3 = self.conv_5x5(self.conv_5x5_reduce(x))
path4 = self.pool_proj(self.max_pool(x))
return layers.concatenate([path1, path2, path3, path4], axis=-1)
# Build the model with Inception modules
inputs = layers.Input(shape=(64, 64, 3))
x = layers.Conv2D(64, (7,7), strides=(2,2), padding='same', activation='relu')(inputs)
x = layers.MaxPooling2D((3,3), strides=(2,2), padding='same')(x)
x = InceptionModule(64, 96, 128, 16, 32, 32)(x)
x = InceptionModule(128, 128, 192, 32, 96, 64)(x)
x = layers.MaxPooling2D((3,3), strides=(2,2), padding='same')(x)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.4)(x)
outputs = layers.Dense(10, activation='softmax')(x)
model = models.Model(inputs, outputs)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Assume X_train, y_train, X_val, y_val are preloaded datasets
# For demonstration, we use dummy data
import numpy as np
X_train = np.random.rand(1000, 64, 64, 3).astype('float32')
y_train = np.random.randint(0, 10, 1000)
X_val = np.random.rand(200, 64, 64, 3).astype('float32')
y_val = np.random.randint(0, 10, 200)
history = model.fit(X_train, y_train, epochs=20, batch_size=32, validation_data=(X_val, y_val))