728x90
Alexnet은 컨볼루션 레이어와 완전 연결 레이어(fully-connected layer)를 연결한 모델입니다.
이 모델의 목표는 입력 이미지를 분류하는 것입니다.
컨볼루션 연산에서 입력된 이미지의 특징을 추출하고
완전 연결 연산에서 특징을 분류합니다.
레이어가 순차적으로 진행되어 추론 과정이 단순합니다.
현재까지 변형된 형태로 쓰이는 relu 활성화 함수를 사용한 것과
과적합 완화를 위한 dropout 기법이 특징입니다.
코드는 아래 글을 참고했습니다.
AlexNet with TensorFlow. AlexNet is an important milestone in… | by mrgrhn | The Startup | Medium
AlexNet with TensorFlow
AlexNet is an important milestone in the visual recognition tasks in terms of available hardware utilization and several architectural…
medium.com
주석 추가, 체크 포인트 저장 부분 추가
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras import datasets, layers, models, losses
import os
#mnist 데이터 불러오기. numpy.ndarray 자료형으로 반환
(x_train,y_train),(x_test,y_test) = datasets.mnist.load_data()
#좌우, 상하 2픽셀 씩 zero-padding을 합니다. 28*28 이미지 -> 32*32 이미지
x_train = tf.pad(x_train, [[0, 0], [2,2], [2,2]])/255
x_test = tf.pad(x_test, [[0, 0], [2,2], [2,2]])/255
#마지막에 1차원 추가해서 4차원 ndarray 자료형으로 변형
x_train = tf.expand_dims(x_train, axis=3, name=None)
x_test = tf.expand_dims(x_test, axis=3, name=None)
#마지막 차원을 3개로 늘림(3채널 컬러 형태로 변환)
x_train = tf.repeat(x_train, 3, axis=3)
x_test = tf.repeat(x_test, 3, axis=3)
#2000개를 평가용 데이터로 사용(x_val, y_val), 58000개가 학습으로 사용
x_val = x_train[-2000:,:,:,:]
y_val = y_train[-2000:]
x_train = x_train[:-2000,:,:,:]
y_train = y_train[:-2000]
#모델 생성, 입력은 32*32 -> 224*224로 리사이징
model = models.Sequential()
model.add(layers.experimental.preprocessing.Resizing(224, 224, interpolation="bilinear", input_shape=x_train.shape[1:]))
model.add(layers.Conv2D(96, 11, strides=4, padding='same'))
model.add(layers.Lambda(tf.nn.local_response_normalization))
model.add(layers.Activation('relu'))
model.add(layers.MaxPooling2D(3, strides=2))
model.add(layers.Conv2D(256, 5, strides=4, padding='same'))
model.add(layers.Lambda(tf.nn.local_response_normalization))
model.add(layers.Activation('relu'))
model.add(layers.MaxPooling2D(3, strides=2))
model.add(layers.Conv2D(384, 3, strides=4, padding='same'))
model.add(layers.Activation('relu'))
model.add(layers.Conv2D(384, 3, strides=4, padding='same'))
model.add(layers.Activation('relu'))
model.add(layers.Conv2D(256, 3, strides=4, padding='same'))
model.add(layers.Activation('relu'))
model.add(layers.Flatten())
model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(10, activation='softmax'))
model.summary()
model.compile(optimizer='adam', loss=losses.sparse_categorical_crossentropy, metrics=['accuracy'])
# 파일 이름에 에포크 번호를 포함시킵니다(`str.format` 포맷)
checkpoint_path = "training_1/cp-{epoch:04d}.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)
# 모델의 가중치를 저장하는 콜백 만들기
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
save_weights_only=True,
verbose=1, period=5)
history = model.fit(x_train, y_train, batch_size=64, epochs=40, validation_data=(x_val, y_val), callbacks=[cp_callback])
model.evaluate(x_test, y_test)
'Python' 카테고리의 다른 글
ellipsis(...) (0) | 2022.01.19 |
---|---|
Visual Studio 2022 + Python3.9.5(64bit) (0) | 2021.11.15 |
OpenCV Mat 한글 출력(PIL 사용) (0) | 2021.10.24 |
OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. (0) | 2021.10.15 |