레퍼런스: <ImageNet Classification with Deep Convolutional Neural Networks(2021)>
AlexNet 구조도(2 GPU 기준)
import tensorflow as tf
from tensorflow.keras import datasets, layers, models
class AlexNet(tf.keras.Model):
def __init__(self):
super().__init__()
initializer = tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.01)
self.alexnet = models.Sequential([
layers.experimental.preprocessing.Resizing(227, 227, input_shape=train_images.shape[1:]),
layers.Conv2D(filters=96, kernel_size=(11, 11), strides=4, padding='valid', activation='relu', kernel_initializer=initializer, name='Conv-1'), # 1층
layers.Lambda(tf.nn.local_response_normalization, name='LRN-1'),
layers.MaxPooling2D(pool_size=(3, 3), strides=2, padding='valid', name='Pooling-1'),
layers.Conv2D(filters=256, kernel_size=(5, 5), strides=1, padding='same', activation='relu', kernel_initializer=initializer, bias_initializer='ones', name='Conv-2'), # 2층
layers.Lambda(tf.nn.local_response_normalization, name='LRN-2'),
layers.MaxPooling2D(pool_size=(3, 3), strides=2, padding='valid', name='Pooling-2'),
layers.Conv2D(filters=384, kernel_size=(3, 3), strides=1, padding='same', activation='relu', kernel_initializer=initializer, name='Conv-3'), # 3층
layers.Conv2D(filters=384, kernel_size=(3, 3), strides=1, padding='same', activation='relu', kernel_initializer=initializer, bias_initializer='ones', name='Conv-4'), # 4층
layers.Conv2D(filters=256, kernel_size=(3, 3), strides=1, padding='same', activation='relu', kernel_initializer=initializer, bias_initializer='ones', name='Conv-5'), # 5층
layers.MaxPooling2D(pool_size=(3, 3), strides=2, padding='valid', name='Pooling-3')
], name='Alexnet')
self.fc = models.Sequential([
layers.Flatten(name='Flatten'),
layers.Dense(units=4096, activation='relu', kernel_initializer=initializer, bias_initializer='ones'), # hidden layer
layers.Dropout(rate=0.5, name='Dropout-1'),
layers.Dense(units=4096, activation='relu', kernel_initializer=initializer, bias_initializer='ones'), # hidden layer
layers.Dropout(rate=0.5, name='Dropout-2'),
layers.Dense(units=1000, activation='softmax', name='Classifier') # output layer
], name='Fully_connected')
def call(self, x):
return self.fc(self.alexnet(x))
def build_model(self):
x = tf.keras.layers.Input(shape=(227, 227, 3))
model = tf.keras.Model(inputs=[x], outputs=self.call(x))
return model
alexnet = AlexNet()
model = alexnet.build_model()
model.summary()
Model: "model_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_5 (InputLayer) [(None, 227, 227, 3)] 0
Alexnet (Sequential) (None, 6, 6, 256) 3747200
Fully_connected (Sequentia (None, 1000) 58631144
l)
=================================================================
Total params: 62378344 (237.95 MB)
Trainable params: 62378344 (237.95 MB)
Non-trainable params: 0 (0.00 Byte)
tf.keras.utils.plot_model(model)
plot_model(subclass)
initializer = tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.01)
model = models.Sequential()
# 227 x 227 x 3으로 resize
model.add(layers.experimental.preprocessing.Resizing(227, 227, input_shape=train_images.shape[1:]))
model.add(layers.Conv2D(filters=96, kernel_size=(11, 11), strides=4, padding='valid', activation='relu', kernel_initializer=initializer, name='Conv-1')) # 1층
model.add(layers.Lambda(tf.nn.local_response_normalization, name='LRN-1'))
model.add(layers.MaxPooling2D(pool_size=(3, 3), strides=2, padding='valid', name='Pooling-1'))
model.add(layers.Conv2D(filters=256, kernel_size=(5, 5), strides=1, padding='same', activation='relu', kernel_initializer=initializer, bias_initializer='ones', name='Conv-2')) # 2층
model.add(layers.Lambda(tf.nn.local_response_normalization, name='LRN-2'))
model.add(layers.MaxPooling2D(pool_size=(3, 3), strides=2, padding='valid', name='Pooling-2'))
model.add(layers.Conv2D(filters=384, kernel_size=(3, 3), strides=1, padding='same', activation='relu', kernel_initializer=initializer, name='Conv-3')) # 3층
model.add(layers.Conv2D(filters=384, kernel_size=(3, 3), strides=1, padding='same', activation='relu', kernel_initializer=initializer, bias_initializer='ones', name='Conv-4')) # 4층
model.add(layers.Conv2D(filters=256, kernel_size=(3, 3), strides=1, padding='same', activation='relu', kernel_initializer=initializer, bias_initializer='ones', name='Conv-5')) # 5층
model.add(layers.MaxPooling2D(pool_size=(3, 3), strides=2, padding='valid', name='Pooling-3'))
# FC layer
model.add(layers.Flatten(name='Flatten'))
model.add(layers.Dense(units=4096, activation='relu', kernel_initializer=initializer, bias_initializer='ones')) # hidden layer
model.add(layers.Dropout(rate=0.5, name='Dropout-1'))
model.add(layers.Dense(units=4096, activation='relu', kernel_initializer=initializer, bias_initializer='ones')) # hidden layer
model.add(layers.Dropout(rate=0.5, name='Dropout-2'))
model.add(layers.Dense(units=1000, activation='softmax', name='Classifier')) # output layer
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
resizing (Resizing) (None, 227, 227, 3) 0
Conv-1 (Conv2D) (None, 55, 55, 96) 34944
LRN-1 (Lambda) (None, 55, 55, 96) 0
Pooling-1 (MaxPooling2D) (None, 27, 27, 96) 0
Conv-2 (Conv2D) (None, 27, 27, 256) 614656
LRN-2 (Lambda) (None, 27, 27, 256) 0
Pooling-2 (MaxPooling2D) (None, 13, 13, 256) 0
Conv-3 (Conv2D) (None, 13, 13, 384) 885120
Conv-4 (Conv2D) (None, 13, 13, 384) 1327488
Conv-5 (Conv2D) (None, 13, 13, 256) 884992
Pooling-3 (MaxPooling2D) (None, 6, 6, 256) 0
Flatten (Flatten) (None, 9216) 0
dense (Dense) (None, 4096) 37752832
Dropout-1 (Dropout) (None, 4096) 0
dense_1 (Dense) (None, 4096) 16781312
Dropout-2 (Dropout) (None, 4096) 0
Classifier (Dense) (None, 1000) 4097000
=================================================================
Total params: 62378344 (237.95 MB)
Trainable params: 62378344 (237.95 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
plot_model(sequential)