HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
장지원 페이지/
📝
AI Advanced
/
Basic of Transfer Learning

Basic of Transfer Learning

파일과 미디어
간단한 설명
전이 학습 기초
태그
Transfer L
📌
전이 학습에 관한 설명이다.
 

[Link]

전이학습(Transfer Learning)이란? - DACON
Transfer learning from pre-trained models | by Pedro Marcelino | Towards Data Science
 

[Transfer Learning]

What
전이 학습이란?
학습된 모델을 다른 데이터 셋에 대한 문제에 적용 시켜 푸는 것
전이 학습과 파인 튜닝의 차이?
전이 학습: 입력층에 가까운 파라미터는 변화 시키지 않음
파인 튜닝: 모든 층의 파라미터 다시 학습
Utilization
활용
VGG, GoogleNet, ResNet 등의 모델은 image net 등의 대량 데이터 셋을 바탕으로 만들어 졌고, 이들이 다른 모델들의 기저(basis)가 된다. 즉 다른 모델들은 이를 바탕으로 전이학습 한다.
Data → Foundation → Adaptation (전이 학습은 adaptation)을 위한 학습이다.
How
방법 (1: Pretrain 모델 선택)
Pretrained model: 사전에 대용량 데이터 셋으로 미리 학습된 모델
방법 (2: 데이터 유형에 따른 문제 분류, size와 similarity에 따른 서로 다른 학습 방법을 사용해야 하기 때문이다) (3: 학습)
pretrained model은 이미지 넷을 바탕으로 했다고 가정할 것이다.
학습은 Pretrained model에 FC(fully connected layer)를 연결해서(즉, 출력 층만 바꿔서) 학습 시킨다.
  1. 데이터가 많지만, 이미지 넷과 다를 때
    1. → FC와 함께 전체 모델을 학습 시킨다. (= 파인 튜닝?)
  1. 데이터가 적고, 이미지 넷과 다를 때
    1. → Pretrained의 일부를 frozen하고, FC와 함께 some layer만 학습 시킨다.
  1. 데이터가 많고, 이미지 넷과 유사할 때
    1. → Pretrained의 일부를 frozen하고(2. 보다 더 forzen), FC와 함께 some layer만 학습 시킨다.
  1. 데이터가 적지만, 이미지 넷과 유사할 때
    1. → Pretrained의 모두를 forzen 하고, FC만 학습 시킨다..
Other classifier

CNN에서 전이학습을 할 때는 두 가지가 중요해 진다. (아마 다른 딥러닝에서도 마찬가지 일 듯..)
  • Convolutional Base
  • Classifier
전이 학습에서는 Classifier에 초점을 맞춘다.
위에서는 FC를 얹어서 모델을 학습 시켰다. 이 외에도 여러 방법이 있다.
  1. Fully-connected layers
    1. : 완전 연결 층 (새로운 분류 층) + soft max 활성화 층을 추가한다.
  1. Global average pooling
    1. : Global average pooling 층을 추가한다(?)
  1. Linear support vector machines
    1. : SVM 분류기를 추가한다.
2.3.의 자세란 건 두 번째 링크 레퍼런스 참고…

notion image
 
Example
전이학습, 그리고 서로 다른 classifier의 성능 비교를 해보는 예제이다.
Dataset 구성 (계산량 이슈로 인한, 일부 sample 추출)
# Create smaller dataset for Dogs vs. Cats import os, shutil original_dataset_dir = '/Users/macbook/dogs_cats_dataset/train/' base_dir = '/Users/macbook/book/dogs_cats/data' if not os.path.exists(base_dir): os.mkdir(base_dir) # Create directories train_dir = os.path.join(base_dir,'train') if not os.path.exists(train_dir): os.mkdir(train_dir) validation_dir = os.path.join(base_dir,'validation') if not os.path.exists(validation_dir): os.mkdir(validation_dir) test_dir = os.path.join(base_dir,'test') if not os.path.exists(test_dir): os.mkdir(test_dir) train_cats_dir = os.path.join(train_dir,'cats') if not os.path.exists(train_cats_dir): os.mkdir(train_cats_dir) train_dogs_dir = os.path.join(train_dir,'dogs') if not os.path.exists(train_dogs_dir): os.mkdir(train_dogs_dir) validation_cats_dir = os.path.join(validation_dir,'cats') if not os.path.exists(validation_cats_dir): os.mkdir(validation_cats_dir) validation_dogs_dir = os.path.join(validation_dir, 'dogs') if not os.path.exists(validation_dogs_dir): os.mkdir(validation_dogs_dir) test_cats_dir = os.path.join(test_dir, 'cats') if not os.path.exists(test_cats_dir): os.mkdir(test_cats_dir) test_dogs_dir = os.path.join(test_dir, 'dogs') if not os.path.exists(test_dogs_dir): os.mkdir(test_dogs_dir) # Copy first 1000 cat images to train_cats_dir fnames = ['cat.{}.jpg'.format(i) for i in range(100)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(train_cats_dir, fname) shutil.copyfile(src, dst) # Copy next 500 cat images to validation_cats_dir fnames = ['cat.{}.jpg'.format(i) for i in range(200, 250)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(validation_cats_dir, fname) shutil.copyfile(src, dst) # Copy next 500 cat images to test_cats_dir fnames = ['cat.{}.jpg'.format(i) for i in range(250,300)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(test_cats_dir, fname) shutil.copyfile(src, dst) # Copy first 1000 dog images to train_dogs_dir fnames = ['dog.{}.jpg'.format(i) for i in range(100)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(train_dogs_dir, fname) shutil.copyfile(src, dst) # Copy next 500 dog images to validation_dogs_dir fnames = ['dog.{}.jpg'.format(i) for i in range(200,250)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(validation_dogs_dir, fname) shutil.copyfile(src, dst) # Copy next 500 dog images to test_dogs_dir fnames = ['dog.{}.jpg'.format(i) for i in range(250,300)] for fname in fnames: src = os.path.join(original_dataset_dir, fname) dst = os.path.join(test_dogs_dir, fname) shutil.copyfile(src, dst) # Sanity checks print('total training cat images:', len(os.listdir(train_cats_dir))) print('total training dog images:', len(os.listdir(train_dogs_dir))) print('total validation cat images:', len(os.listdir(validation_cats_dir))) print('total validation dog images:', len(os.listdir(validation_dogs_dir))) print('total test cat images:', len(os.listdir(test_cats_dir))) print('total test dog images:', len(os.listdir(test_dogs_dir)))
CNN을 통한 특징 추출
  1. import
  1. 데이터 전처리
  1. CNN을 통한 데이터 처리
# Extract features import os, shutil from keras.preprocessing.image import ImageDataGenerator datagen = ImageDataGenerator(rescale=1./255) batch_size = 32 def extract_features(directory, sample_count): features = np.zeros(shape=(sample_count, 7, 7, 512)) # Must be equal to the output of the convolutional base labels = np.zeros(shape=(sample_count)) # Preprocess data generator = datagen.flow_from_directory(directory, target_size=(img_width,img_height), batch_size = batch_size, class_mode='binary') # Pass data through convolutional base i = 0 for inputs_batch, labels_batch in generator: features_batch = conv_base.predict(inputs_batch) features[i * batch_size: (i + 1) * batch_size] = features_batch labels[i * batch_size: (i + 1) * batch_size] = labels_batch i += 1 if i * batch_size >= sample_count: break return features, labels train_features, train_labels = extract_features(train_dir, train_size) # Agree with our small dataset size validation_features, validation_labels = extract_features(validation_dir, validation_size) test_features, test_labels = extract_features(test_dir, test_size)
FC layer
  1. 위에서 구한 Feature 가지고, FC layer 추가해 학습
# Define model from keras import models from keras import layers from keras import optimizers epochs = 100 model = models.Sequential() model.add(layers.Flatten(input_shape=(7,7,512))) model.add(layers.Dense(256, activation='relu', input_dim=(7*7*512))) model.add(layers.Dropout(0.5)) model.add(layers.Dense(1, activation='sigmoid')) model.summary() # Compile model model.compile(optimizer=optimizers.Adam(), loss='binary_crossentropy', metrics=['acc']) # Train model history = model.fit(train_features, train_labels, epochs=epochs, batch_size=batch_size, validation_data=(validation_features, validation_labels))
Global Average Pooling
Linear SVM