230407 수업 - AI(전이학습)

Yunit·2023년 4월 7일
0

복습

CNN

-> 이미지 학습, 예측에 사용

  • Feature Extraction

    convolution(특징 뽑아내기, Image개수 증가)
    pooling(Image 개개의 size를 축소)

  • 학습(DNN)

실사 이미지 학습은?

  • Data 량이 많아야 된다.
    정제가 잘 된 Data의 경우, Data 량이 적어도 학습이 잘 되기도 한다.

  • Feature의 수가 작아야 한다.

CNN?

결국,

오늘 수업 시작

Pretrained Network

기학습 네트워크 (이미 학습된 네트워크)

  • Google -> Inception(convolution 45개, pooling 20개)
    모델을 만든다.
    Data는 Imagenet

  • MS -> ResNet(규모가 Inception의 3배)

  • 그 외에도 EfficientNet, VGG, MobileNet,... 종류가 많다.

Pretrained Network 실습

다운로드

keras 에서 쉽게 사용 가능하다. 근데 모데이 워낙 크기 때문에 바로 사용은 어렵다. 다운로드를 해야 한다.
colab에서 활용해보자.

이미지 데이터 셋

어제 만들었던 cat_dog_small 폴더의 데이터를 활용하자.

코드 작성

새 파이썬 파일 생성

  • 구글 드라이브 마운트하기
  • 리소스 런타임 형식 GPU로 변경

이미 만들어져 있는 feature들 가져오기

  • 코드
# 전이학습 모델로 VGG16 사용할 예정
#   VGG16 : 전이학습 모델 중 가장 심플한 모델
# 누군가 이미 만들어놓은 VGG16 이라는 이름의 CNN 모델을 이용하자.

from tensorflow.keras.applications import VGG16

model_base = VGG16(weights='imagenet',
                   include_top=False,
                   input_shape=(150, 150, 3))
  # weights='imagenet'
  #   imagenet의 데이터들을 가지고,
  #   VGG16모델을 거쳐서 나온 값들을 weights에 저장해서 가져오라는 의미
  # include_top=False
  #   Top 부분은 우리가 직접 개, 고양이 데이터를 넣어야 하므로,
  #   Top 데이터는 가져올 필요 없다.

print(model_base.summary())
# 출력
  # Total params: 14,714,688
  # Trainable params: 14,714,688
  # Non-trainable params: 0
  # 학습되어있는 데이터 1400만개 보유하게 됨
  • 출력

최초 다운로드

출력

ㅁㄴㅇㄹ 뭐하는거지?

  • 코드
import os
import numpy as np
from tensorflow.keras.preprocessing.image import ImageDataGenerator

base_dir = '/content/drive/MyDrive/한국SW산업협회 교육-Java 과정/파이썬 실습/cat_dog_small'
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')
test_dir = os.path.join(base_dir, 'test')

datagen = ImageDataGenerator(rescale=1/255)
batch_size=20

def extract_feature(directory, sample_count):
    features = np.zeros(shape=(sample_count,4,4,512))
    labels = np.zeros(shape=(sample_count,))
    
    generator = datagen.flow_from_directory(
        directory,
        target_size=(150,150),
        batch_size=batch_size,
        class_mode='binary')

    i = 0

    for x_data_batch, t_data_batch in generator:
        feature_batch = model_base.predict(x_data_batch)
        features[i*batch_size:(i+1)*batch_size] = feature_batch
        labels[i*batch_size:(i+1)*batch_size] = t_data_batch
        
        i += 1
        if i * batch_size >= sample_count:
            break;
    
    return features, labels

train_features, train_labels = extract_feature(train_dir,2000)
validation_features, validation_labels = extract_feature(validation_dir,1000)
test_features, test_labels = extract_feature(test_dir,1000)
  • 출력

수행시간 약 7분

ㅁㄴㅇㄹ

  • 코드
# 위에서 이미지의 특징을 뽑아내서 학습할 데이터 생성

train_features = np.reshape(train_features, (2000,4 * 4 * 512))
validation_features = np.reshape(validation_features, (1000,4 * 4 * 512))
test_features = np.reshape(test_features, (1000,4 * 4 * 512))

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import RMSprop

model = Sequential()
model.add(Dense(256,
                activation='relu',
                input_shape=(4 * 4 * 512,)))
model.add(Dropout(0.5))
model.add(Dense(1,
                activation='sigmoid'))

model.compile(optimizer=RMSprop(learning_rate=2e-5),
              loss='binary_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_features,
                    train_labels,
                    epochs=30,
                    batch_size=20,
                    validation_data=(validation_features, validation_labels))
  • 출력

수행시간 15초

만약 25,000장의 데이터로 시작하면, 정확도가 96%정도까지 올라갈 수 있다.

Machine Learning(지도학습) 정리

  • Regression

  • Deep Learning(비정형)

    Vision
    NLP (자연어처리)

profile
배우는 중

0개의 댓글