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개의 댓글

관련 채용 정보