딥러닝
개와 고양이를 ResNet을 이용해서 학습해보자.
파이썬초보만
2019. 9. 29. 21:32
import os
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 위노그라드 알고리즘 설정
os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1'
rootPath = '데이터폴더의 경로'
#학습이미지에 조금씩 변화를 주어 학습을시켜 과적합을 방지하는것이다.
#마지막 파라미터 validation_split=.1 을주어서 train_data와 validation_data의 비율을 조정할수있다.
imageGenerator = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.1,
height_shift_range=0.1,
brightness_range=[.2, .2],
horizontal_flip=True,
validation_split=.1
)
# rootPath로 들어가서 train폴더에있는 이미지들을 하나씩불러오는것이다.
trainGen = imageGenerator.flow_from_directory(
os.path.join(rootPath, 'train'),
target_size=(64, 64),
subset='training'
)
validationGen = imageGenerator.flow_from_directory(
os.path.join(rootPath, 'train'),
target_size=(64, 64),
subset='validation'
)
먼저 위노그라드 알고리즘에 대해 간단히 설명해보고자 한다.
텐서플로우tensorflow에서 훈련 성능을 높일 수 있는 위노그라드Winograd 콘볼루션 알고리즘이 디폴트로 활성화되어 있지 않습니다.
ResNet을 비롯하여 요즘 규모의 콘볼루션 모델들에서 3×3 필터가 대세로 자리잡고 있습니다. 위노그라드 알고리즘은 3×3 행렬 계산의 연산 횟수를 줄여 줌으로써 모델 훈련 성능이 크게 증가됩니다.
이미 NVIDIA는 cuDNN5에서 부터 위노그라드 콘볼루션을 지원하고 있습니다.
일례로 Wide ResNet 에서 CIFAR10 데이터로 훈련시킬 때 K80 GPU에서 35%정도 빨라졌다고 합니다. 하지만 성능 개선의 정도는 GPU에 따라 다릅니다.
파이썬에서 아래와 같이 환경변수 TF_ENABLE_WINOGRAD_NONFUSED 를 지정하면 된다.
os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1'
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from keras.layers import Dropout, Flatten, Dense
model = Sequential()
model.add(ResNet50(include_top=True, weights=None, input_shape=(224, 224, 3), classes=2))
model.summary()
RenNet50을 불러와서 학습시킬 것 이다.
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['acc'],
)
모델은 불러온후 반드시 컴파일을 해야한다.
epochs = 32
history = model.fit_generator(
trainGen,
epochs=epochs,
steps_per_epoch=trainGen.samples / epochs,
validation_data=validationGen,
validation_steps=trainGen.samples / epochs,
)
model.save("model_weight.h5")
epochs는 32로 두고 학습을 시키고 마지막에는 학습한 가중치를 저장을 하였다.
이런식으로 학습이 진행되는것을 볼 수 있다.
testGenerator = ImageDataGenerator(
rescale=1./255
)
testGen = imageGenerator.flow_from_directory(
os.path.join(rootPath, 'test1'),
target_size=(224, 224),
)
model.evaluate_generator(testGen)
테스트데이터를 가지고 모델을 평가하면
이런출력값을 얻을 수 있는데 왼쪽이 loss값이고 오른쪽은 정확도이다.