Transfer learning with ResNet

eunbi kim·2024년 7월 14일
0

데이터 출처: https://aihub.or.kr/aihubdata/data/view.do?currMenu=115&topMenu=100&aihubDataSe=realm&dataSetSn=51
패션 이미지의 스타일을 분류하는 모델링을 진행하였다.

리조트, 모던, 페미닌, 스포티, 컨트리 총 5개의 스타일을 분류하여 예측하는 모델
이미지는 각 10000장씩 사용 - train:val:test 6:2:2
학습 데이터 총 30000장

train = "/content/drive/MyDrive/dataset_tmp/result/train"
val = "/content/drive/MyDrive/dataset_tmp/result/val"
test = "/content/drive/MyDrive/dataset_tmp/result/test"
class_list = ['리조트', '모던', '스포티', '컨트리', '페미닌']

train = tf.keras.preprocessing.image_dataset_from_directory(
    train,
    labels="inferred",
    label_mode="categorical",
    class_names=class_list,
)

val = tf.keras.preprocessing.image_dataset_from_directory(
    val,
    labels="inferred",
    label_mode="categorical",
    class_names=class_list,
)

test = tf.keras.preprocessing.image_dataset_from_directory(
    test,
    labels="inferred",
    label_mode="categorical",
    class_names=class_list,
)
  1. ResNet50 전이학습
resnet = ResNet50(input_shape= (256,256,3), weights='imagenet')

for layer in resnet.layers:
    layer.trainable = False

x = resnet.output
x = GlobalAveragePooling2D()(x)
x = Dense(512, activation='relu')(x)
predictions = Dense(5, activation='softmax')(x)
model = Model(resnet.input, predictions)

model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate = 0.001),
              loss='categorical_crossentropy', metrics=['accuracy'])

history = model.fit(train, validation_data=[val], epochs=10, batch_size=32)
  1. fine tuning - 140번째 층부터 튜닝가능하게 설정, 이어서 학습
resnet.trainable=True
fine_tune_at = 140
for layer in resnet.layers[:fine_tune_at]:
  layer.trainable=False
  
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate = 0.0001), loss='categorical_crossentropy', metrics=['accuracy'])

loss: 1.7704 - accuracy: 0.6104

40~50%대의 정확도에서 조금 개선되었다.
하지만 train 데이터에 과적합, 어느 시점에서 loss 증가 등의 문제가 있어서
trainable을 여러 층에서 조정 시도해보고, learning rate도 바꾸어 보고
dropout도 추가해보았으나 나아지지가 않았다.

0개의 댓글