ResNet이 무엇인지에 대한 내용은 다른 분들 블로그에 많으니 자세한 설명은 하지 않겠습니다.

 

어쨌든 CNN보다 성능이 좋다는 것이 정설처럼 되어 있는 구조입니다.

 

앞선 CNN에서는 95% 정도가 나왔었는데, 같은 데이터로 ResNet을 사용했을 때는 어떻게 되는 지 실행해봤습니다.

 

ResNet은 직접 구현할 수도 있지만 라이브러리에도 존재합니다. 층의 개수에 따라 ResNet50, 101, 152 ... 등이 있습니다. 저 또한 직접 구현하지 않고 라이브러리를 사용했습니다.

 

ResNet50

from keras.applications import ResNet50, ResNet101, ResNet152

이렇게 상단에 import를 시켜주고

resnet50 = ResNet50(weights=None, include_top=False, input_shape=(64, 64, 3))

이렇게 작성해주시면 됩니다. 위의 코드에 보면 weights와 include_top이 있는데 사용한 것과 안한 것의 차이가 있으니 자신에게 맞게 사용해주시면 됩니다.

with K.tf_ops.device('/device:GPU:0'):
    model = Sequential()
    model.add(resnet50)
    model.add(Flatten())
    model.add(Dense(nb_classes, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])


    food = model.fit(X_train, y_train, batch_size=64, epochs=100, validation_split=0.1)

모델은 이렇게 작성했습니다. 

 

그리고 보기 편하게 그래프를 만드는 코드는 아래와 같습니다.

%matplotlib inline
import matplotlib.pyplot as plt

fig, loss_ax = plt.subplots()

acc_ax = loss_ax.twinx()

loss_ax.plot(food.history['loss'], 'y', label='train loss')
loss_ax.plot(food.history['val_loss'], 'r', label='val loss')

acc_ax.plot(food.history['accuracy'], 'b', label='train acc')
acc_ax.plot(food.history['val_accuracy'], 'g', label='val acc')

loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')
acc_ax.set_ylabel('accuray')

loss_ax.legend(loc='upper left')
acc_ax.legend(loc='lower left')

plt.show()

 

그래서 정확도는 평균 94%가 나왔습니다.

 

CNN보다 더 떨어졌습니다. 분명히 ResNet은 CNN보다 성능이 좋다고 했습니다. 혹시 층의 개수가 적어서 그런게 아닐까라는 생각이 들어서 ResNet101, ResNet152까지 실행시켜 봤습니다.

 

ResNet101

 

ResNet101은 평균 정확도가 92%로 더 떨어졌습니다. 게다가 그래프 수치도 더 안좋아 보입니다.

 

 

ResNet152

 

 

결론

저는 왜 층의 개수를 늘리면 늘릴 수록 정확도가 더 떨어지는 지 알아보다가 한 포스팅을 보고 이유를 알았습니다. 

https://oi.readthedocs.io/en/latest/computer_vision/cnn/resnet.html

CNN을 진행하면서 조심해왔지만 간과했던 "과적합"이 문제였던 것 같습니다.  

제 데이터의 양은 그대로인데 층만 깊어지니 과적합이 발생해 오히려 정확도가 더 떨어질 수 밖에 없었습니다. 게다가 제 데이터의 양은 보통 CNN치고는 적은 편이었인데다 ResNet은 구조적으로 과적합을 방지할 수 있지만 데이터의 양이 적으면 과적합을 피하기 어렵습니다.

 

그러니, 데이터 양에 맞게 layer 수를 조절할 것, 무작정 좋다는 알고리즘을 사용할게 아니라 데이터셋에 알맞은 알고리즘을 사용해야 한다는 것을 배울 수 있었습니다.

'CNN' 카테고리의 다른 글

CNN 용어 정리  (0) 2020.10.03
CNN  (0) 2020.09.29