[code] AlexNet
ImageNet Classification with Deep Convolutional Neural Networks 구현Permalink
위의 layer 구조를 보고 코드로 구현하였다.
앞서 해석한 논문을 보면 디테일한 설명을 볼 수 있다. ImageNet Classification with Deep Convolutional Neural Networks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import tensorflow as tf | |
import datetime | |
from tensorflow.keras.preprocessing.image import ImageDataGenerator | |
from keras.optimizers import SGD | |
#데이터셋 설정 | |
train_datagen = ImageDataGenerator(rescale=1./255,width_shift_range=0.2,height_shift_range =0.2, | |
zoom_range=0.2, horizontal_flip =True, vertical_flip = True) | |
train_generator = train_datagen.flow_from_directory( | |
'./catdog/training_set/training_set/', | |
target_size=(227, 227), | |
batch_size=16, | |
class_mode='categorical') | |
test_datagen = ImageDataGenerator(rescale=1./255,width_shift_range=0.2,height_shift_range =0.2, | |
zoom_range=0.2, horizontal_flip =True, vertical_flip = True) | |
test_generator = test_datagen.flow_from_directory( | |
'./catdog/test_set/test_set/', | |
target_size=(227, 227), | |
batch_size=16, | |
class_mode='categorical') | |
model = tf.keras.models.Sequential([ | |
# C1 (first layer) | |
tf.keras.layers.Conv2D(filters=96, kernel_size=(11,11), strides=4, activation='relu', input_shape=(227,227,3)), | |
tf.keras.layers.BatchNormalization(), # currently use batch normalization instead local response normalization | |
# overlapping | |
tf.keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2), padding='valid', data_format=None), | |
# C2 | |
tf.keras.layers.Conv2D(filters=256, kernel_size=(5,5), strides=1, activation='relu', padding="same"), | |
tf.keras.layers.BatchNormalization(), # currently use batch normalization instead local response normalization | |
tf.keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2), padding='valid', data_format=None), | |
# C3 | |
tf.keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=1, activation='relu',padding="same"), | |
tf.keras.layers.BatchNormalization(), | |
# C4 | |
tf.keras.layers.Conv2D(filters=384, kernel_size=(3,3), strides=1, activation='relu',padding="same"), | |
tf.keras.layers.BatchNormalization(), | |
# C5 | |
tf.keras.layers.Conv2D(filters=256, kernel_size=(3,3), strides=1, activation='relu',padding="same"), | |
tf.keras.layers.BatchNormalization(), | |
tf.keras.layers.MaxPool2D(pool_size=(3,3), strides=(2,2), padding='valid', data_format=None), | |
# Flatten! | |
tf.keras.layers.Flatten(), | |
# F6 | |
tf.keras.layers.Dense(4096, activation='relu'), | |
tf.keras.layers.Dropout(0.5), | |
# F7 | |
tf.keras.layers.Dense(4096, activation='relu'), | |
tf.keras.layers.Dropout(0.5), | |
# outputlayer, Softmax | |
tf.keras.layers.Dense(2, activation='softmax') | |
]) | |
sgd = SGD(lr=0.01,decay=5e-4, momentum=0.9) | |
model.compile(loss='binary_crossentropy', optimizer='sgd',metrics=['accuracy']) | |
log_dir="logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") | |
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir) | |
callback_list = [tensorboard_callback] | |
model.summary() | |
# start training | |
model.fit_generator(train_generator, steps_per_epoch=50, epochs=10) | |
#모델 저장하기 | |
model.save('my_Alexnet.h5') | |
#모델 평가하기 | |
print("-------------Evaluate-----------------") | |
scores = model.evaluate_generator(test_generator,steps=1) | |
print("%s : %.2f%%" %(model.metrics_names[1],scores[1]*100)) |
-
local response normalization은 요즘 사용하지 않고 대부분 batch normalization을 사용한다고 함.
-
compile 부분을 보면 optimizer을 SGD(stochastic gradient descent)를 사용하였다.
-
원래는 cifar-10 데이터 셋으로 10개의 클래스를 분류하고자 하였지만 GPU 메모리 부족으로 2개의 클래스를 분류해보았다.
[학습결과]Permalink
accuracy는 56.67%.
cat, dog 이미지라서 accurate가 박살난것일까..
참고Permalink
[1] http://datahacker.rs/tf-alexnet/
[3] https://medium.com/swlh/alexnet-with-tensorflow-46f366559ce8
댓글남기기