딥러닝

개와 고양이를 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값이고 오른쪽은 정확도이다.