batch size : 몇 개 단위로 epochs 수행할 건지. 1이라면 1개 넣고 결과보고 값 수정-> 1 epochs 지나감
convolution : 인접한 픽셀에 convolution 필터를 곱해서 얻어지는 출력값. 인접한 픽셀값의 영향력 값. 특징 추출을 위해 사용
padding : input 이미지와 convolution 필터가 곱해질 때 이미지가 작아지는데 출력되는 값을 input 이미지와 같도록 유지해주는 것. 해주지 않으면 몇 차례만 지나도 이미지가 너무 작아져버림. 사방으로 확장되기 때문에 (1,1) 해주면 (10,10)->(12,12) 됨
activation : convolution으로 특징 추출되었다면 활성화 함수를 적용해 값 활성화 시킴. 이 특징을 가지고 있다/없다로 구분해줌. 대표적으로 sigmoid, relu가 있으나 sigmoid는 계층 깊어지면 그라디언트 소실 발생. 주로 relu 사용
pool_size : 영역을 정해서 그 안에서 값을 찾는 것(ex (2,2)). max-pooling, average-pooling이 있는데 이미지에서는 주로 max(최대값 채택) 사용. 특징의 위치 변화에 대한 영향을 덜 받기위해 사용
dense(fully connected, fc) : 활성화 함수와 이전 계층이 완전히 연결된 계층. CNN에서는 convolution layer, pooling layer를 활성화 함수 앞뒤에 배치하나 출력에 가까운 층은 fc layer를 사용할 수 있음
softmax : fc layer에서 이미지가 어떤 레이블을 가질 가능성이 높은지 나타냄
loss : 손실 함수. 학습 시 손실을 최소로 만들어주는 가중치를 찾음. 종류가 다양하므로 적합한 것 선택하면 됨
optimizer : 학습 속도를 빠르고 안정적이게 하는 것. 종류 다양해 맞는 거 쓰면 됨. adam
ImageDataGenerator를 이용해 데이터셋을 늘리는 여러 코드들이 나와있지만 저는 이 블로그(jeongmin-lee.tistory.com/5)를 참고해서 경로와 데이터 생성 갯수만 수정해서 사용했습니다.
import numpy as np
import os
from os import listdir
from os.path import isfile, join
from PIL import Image
from google.colab import drive # 코랩 구글드라이브 연동
drive.mount('/gdrive', force_remount=True)
np.random.seed(3)
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
data_datagen = ImageDataGenerator(rescale=1./255)
data_datagen = ImageDataGenerator(rescale=1./255,
rotation_range=30,
shear_range=5.5,
# width_shift_range=0.1,
# height_shift_range=0.1,
zoom_range=0.,
horizontal_flip=True,
vertical_flip=True,
fill_mode='nearest')
filename_in_dir = []
for root, dirs, files in os.walk('/gdrive/My Drive/data/dataset/gobchang92'):
for fname in files:
full_fname = os.path.join(root, fname)
filename_in_dir.append(full_fname)
for file_image in filename_in_dir:
img = load_img(file_image)
x = img_to_array(img)
x = x.reshape((1,) + x.shape)
i = 0
for batch in data_datagen.flow(x,save_to_dir='/gdrive/My Drive/data/dataset/datagenerator/gobchang', save_prefix='gobchang', save_format='jpg'):
i += 1
if i > 16:
break