위 제목은 예시 입니다. 회의록 작성 시 “날짜 ‘회의록’ (회의 내용 요약)” 형식으로 제목을 수정해 주세요:)
[회의 주제]
전이학습 공부
[To-do]
[세부 내용 메모]
- TensorFlow(link)
- 사전 학습된 ConvNet에 대해 전이 학습을 통해 고양이, 개 이미지를 분류하는 방법을 알려줌.
- 특성 추출: 새로운 sample에서 의미 있는 특성을 추출하기 위해 기존 네트워크에서 학습한 표현을 사용 > 새 classifier를 추가하기만 하면 기존 dataset으로 학습한 것을 재 사용 가능
- 작은 dataset으로 학습할 때 큰 dataset에서 추출된 특징을 바탕으로 classifing하는 걸 의미하는 듯
- 미세 조정(fine-tuning): 최상위 layer와 새로 추가된 classifier의 layer를 함께 훈련시킴. > 어떠한 작업에 대하여 더 높은 정확도를 가지는 결과를 낼 수 있도록 함.
- Google Colab > 따라해보면 좋을 듯함
- base_model.trainable = True, fine_tune 시작할 layer 설정해서 나머지는 trainable=False로 설정해서 훈련할 수 있는 부분을 다시 설정해줌
- learning_rate를 낮게 시작해서(overfitting방지) fine_tune한 것과 함께 epoch을 키워나감 > 정확도 향상
- 전이 학습 및 미세조정 page(link)
- 전이 학습: 한 가지 문제에 대해 학습한 기능을 가져와서 비슷한 새로운 문제에 활용하는 것으로 구성
- 전체 모델을 처음부터 훈련하기에는 data가 너무 적은 작업에 대해 수행
- Workflow
- tensorflow에서는 Keras library의
trainableAPI를 사용해 동결 여부를 결정 - kaggle > ML dataset community
사전훈련된 모델에서 layer 가져옴 추후 훈련 중 사전 훈련된 정보가 손상되지 않도록 동결 고정된 레이어 위에 훈련할 수 있는 새 레이어 추가 → 기존 기능을 새로운 dataset에 대한 예측으로 전환 새로운 layer 훈련 (선택) - Fine Tuning → 위 과정을 거친 모델을 동결 해제 후 학습률이 매우 낮은 새로운 데이터에 대해 재훈련 ⇒ 더 높은 정확도를 얻게됨
- 블로그 이름(link)(종류)
- 전이학습 정의: 전이학습이란 사전 학습된 모델을 다른 관련 작업을 해결하는데 활용하는 머신러닝 기법이다.
- 사전학습(pre-training): 사전 학습이란 전이학습의 한 과정으로, 대규모의 일반적 데이터셋을 사용해서 모델을 학습시키는 프로세스를 의미한다.
- 미세조정(fine-tuning): 사전 학습된 모델을 새로운 문제에 적용하기 위해서 일부 가중치를 조절하는 학습과정을 의미한다.
- 전이 학습의 종류
- instances-based
- Mapping-based
- Network-based
- Adversarial-based
- 네트워크를 새로운 도메인에 학습시키고자 할 때 ‘학습하고자’ 하는 부분이나 방법에 대한 구분이 필요하다. 이에 대해 각 레이어에 대한 Gradient Optimization 여부를 다음과 같이 구분할 수 있다.
- Re-train: 기존에 학습된 weights를 모두 버리고 새로운 weight로 업데이트 하는 것
- Fine-tuning: 학습된 weight를 그대로 두고, 학습데이터를 이용해 파라미터 조정을 가하는 것
- 일반적으로 fine tuning은 기존에 학습될 때 사용하는 learing rate의 1/10배 혹은 1/100배의 크기를 적용한다. 이 learning rate는 곧 예측과 사실 사이 발생한 오차에 대해 얼마나 weight update를 진행할 것인가에 대한 척도인데, 이 값을 줄임으로써 기존에 학습된 weight를 최대한 보존하고자 한다.
- Frozen: 학습된 weight를 그대로 유지하고 학습과정에서도 이를 보존하는 것.
- https://www.youtube.com/watch?v=4BVNULkThDQ 참고할 수 있는 유튜브 동영상
- https://velog.io/@dlskawns/Deep-Learning-이미지-처리-전이학습Transfer-Learning-이용한-이미지-분류-모델-구현-실습 전이학습 실습 코드
적절한 가중치를 이용한 소스 도메인을 활용한다. 소스 도메인에서 타겟 도메인과 유사한 데이터를 끌어와서 사용한다. 이렇게 소스 도메인에서 데이터를 가져올 경우 데이터 분포의 차이가 있기 때문에 소스 도메인에 적절한 가중치를 부여하여 사용한다.
소스 도메인과 타겟 도메인의 유사성을 이용하여 새로운 데이터를 생성하고 그 데이터 셋으로 모델을 학습한다.
EX) cycleGAN
소스 도메인의 사전 학습된 모델을 사용하는 기법이다. 현재 전이학습에서 가장 많이 사용되는 방법으로 pytorch에서는 Pretrained라는 이름으로 모델을 공유한다.
Adversarial Layer를 통해 도메인 라벨을 생성하고 적대적 네트워크가 도메인을 잘 구분하지 못하는 방향으로 학습하여 다른 도메인으로부터 오는 feature map의 차이를 작게 한다. Adversarial Layer를 만들어서 도메인을 구분할 수 있는 장치를 하나 만든다. GAN의 방식과 많이 유사하다.
데이터셋의 유사도와 크기에 따른 전이학습의 전략

- 블로그 이름(Example) (전이 학습의 방법 및 현 분야)
- 전이학습 정의: 특정한 Task( Classification, Detection, Segmentation 등)에 대하여 학습된 딥러닝 모델을, 다른 Task로 Transfer(전이)하여 해당 모델을 사후적으로 학습하는 개념을 포함한다.
- 모델(ResNet, MobileNet 등)을 불러와 그대로 분류할 데이터 입력 후 분류 진행(학습 x)
- 모델을 불러온 뒤, 최상위 층(분류기)만 용도대로 재 설정하여 학습시키는 방법. 이 때 불러온 전이학습 모델은 가중치를 동결해 학습시키지 않고, 분류기, 또는 이후 추가한 Fully-connected layer의 가중치만 학습하여 이용한다.
- Fine Tuning - 2번과 동일하게 진행한 뒤, 동결해 두었던 전이학습 모델의 가중치를 (일부 또는 전부) 학습 가능상태로 만들고 학습시키도록 한다.
- Fine Tuning 과정에서 동결을 이루는 방식은 결론적으로는 어떤 모델에 어떤 데이터를 어떻게 사용하는가에 따라 이는 모두 달라지며 그때그때 조절해보며 최적의 방법을 이용하는것이 최고이다.
Example //
- Transfer learning from pre-trained models (link)
- 데이터가 많지만, 이미지 넷과 다를 때
- 데이터가 적고, 이미지 넷과 다를 때
- 데이터가 많고, 이미지 넷과 유사할 때
- 데이터가 적지만, 이미지 넷과 유사할 때
- Convolutional Base
- Classifier
- Fully-connected layers
- Global average pooling
- Linear support vector machines
- import
- 데이터 전처리
- CNN을 통한 데이터 처리
- 위에서 구한 Feature 가지고, FC layer 추가해 학습
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)를 연결해서(즉, 출력 층만 바꿔서) 학습 시킨다.
→ FC와 함께 전체 모델을 학습 시킨다. (= 파인 튜닝?)
→ Pretrained의 일부를 frozen하고, FC와 함께 some layer만 학습 시킨다.
→ Pretrained의 일부를 frozen하고(2. 보다 더 forzen), FC와 함께 some layer만 학습 시킨다.
→ Pretrained의 모두를 forzen 하고, FC만 학습 시킨다..
Other classifier
CNN에서 전이학습을 할 때는 두 가지가 중요해 진다. (아마 다른 딥러닝에서도 마찬가지 일 듯..)
전이 학습에서는 Classifier에 초점을 맞춘다.
위에서는 FC를 얹어서 모델을 학습 시켰다. 이 외에도 여러 방법이 있다.
: 완전 연결 층 (새로운 분류 층) + soft max 활성화 층을 추가한다.
: Global average pooling 층을 추가한다(?)
: SVM 분류기를 추가한다.
2.3.의 자세란 건 두 번째 링크 레퍼런스 참고…

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을 통한 특징 추출
# 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
# 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
- 티스토리(link)
- 전이학습 정의: 모델을 처음부터 훈련시키는 대신, 사전 훈련된 딥러닝 모델을 새로운 작업이나 데이터 세트에 재사용하는 프로세스를 일컫는 딥러닝의 설계 패턴이다.
- 전이학습의 주요 아이디어 : ImageNet과 같은 크고 다양한 데이터 세트에서 학습한 지식을 활용하여, 새로운 작업에 대한 딥러닝 모델의 성능과 효율성을 향상하는 것.
- 사전 훈련된 모델에서 유사한 데이터 분포를 가진 새로운 작업으로 모델을 적용
- 사전 훈련된 모델에서 상이한 데이터 분포를 가진 새로운 작업으로 모델을 적용
- 제한된 교육 데이터를 사용하여 사전 훈련된 모델에서 새로운 작업으로 모델을 적용
- 전이 학습에서 대상 작업에 제한된 훈련 데이터가 있는 경우, 사전 훈련된 딥러닝 모델을 fine-tuning 해야한다.
- Load a pre-trained deep learning model: 아키텍처 및 사전 훈련 데이터 분포를 기반으로 대상 작업에 적합한 사전 훈련된 모델을 선택하는 단계.
- Load a pre-trained deep learning model: 사전 학습된 모델의 상위 계층을 새 작업별 계층으로 바꿉니다. 대체할 계층의 수와 새 계층의 아키텍처는 대상 데이터 세트의 크기와 사용 가능한 계산 리소스에 따라 선택할 수 있습니다.
- Fine-tune the model: 제한된 대상 데이터 셋에서 새로운 작업별 계층을 훈련하면서 사전 훈련된 계층을 동결 (freeze)하거나 대상 작업에 맞게 fine-tuning(미세조정) 합니다. 사전 훈련된 기능이 너무 많이 변경되는 것을 방지하기 위해 처음부터 훈련하는 것과 비교하여, 더 작은 학습 속도로 fine-tuning 프로세스를 수행할 수 있습니다.
- Evaluate the model: 대상 데이터 세트에서 fine-tuning 된 모델의 성능을 평가하고 처음부터 훈련된 모델 또는 더 큰 대상 데이터 세트로 fine-tuning 된 모델과 같은 다른 모델과 비교합니다.
다음과 같은 상황에서 전이학습을 주로 적용시킨다.
장점: 제한된 훈련 데이터로 새로운 작업을 위해 사전 훈련된 모델을 fine-tuning하면 처음부터 훈련하는 것과 비교했을때, 모델의 성능과 일반화를 개선할 수 있다.
주의할점: 과적합되지 않도록, 사전 교육된 모델과 fine-tuning 방법을 신중하게 선택하는 것이 중요!! 학습률 조정하기, 파라미터 초기화를 신중하게 하
Transfer Learning은 Pre-trained(사전 훈련)된 모델을 새로운 작업에 대한 몰델의 시작점으로 재사용하는 학습 방식이다. — 개인 블로그(link)
⇒ 방학에 읽자..
전이학습이란!
사전 학습 모델을 새로운 data에 대한 모델을 구축하기 위해 사용하는 ML 기법
Fine Tuning이란!
전이학습의 한 과정
모든 층의 data를 다시 학습 시킴
- 우리 data와 기존 모델로 사용하려는 Image Net 과의 유사도는 어떻게 판단해야할까?
[다음 회의 주제 및 To-do]
draft 써오기
- 연구목표 — 태완
- 연구 진행 상황 및 실적 — 지원, 호진
- 중간성과 및 문제점 — 아현
- 향후계획 — 준수