[논문 구현] AlexNet

Leo Moon·2023년 11월 3일
0

레퍼런스: <ImageNet Classification with Deep Convolutional Neural Networks(2021)>

주요 특이사항

  • Tensorflow 구현
  • 싱글 GPU 기준으로 수정

아키텍쳐

alexnet 구조도 AlexNet 구조도(2 GPU 기준)

Subclass형 모델 구현

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
  • Summary 확인
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)
  • plot_model
tf.keras.utils.plot_model(model)

plot_model(subclass) plot_model(subclass)

Sequential형 모델 구현

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
  • summary 확인
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

    plot_model(sequential) plot_model(sequential)

profile
안녕하세요, AI 엔지니어입니다

0개의 댓글