반응형
폭풍수정예정...
목표
- CNN으로 간단한 학습 모델을 만들어 training set, test set 을 통해 evaluate해본다.
- 적은 data set을 부풀려 overfitting을 만든다.
- 간단한 이미지(circle, rec, tri)를 학습한다.
- 복잡한 이미지를 학습한다. : 컴퓨터가 견딜까?
- 동영상 베이스로 학습한다. : 목표 ㅋㅅㅋ
- 문서를 학습한다.
환경설정
사용 언어 : python3.6.1, tensorflow(keras 필요)
Tutorial
1. 파일 구성
app.py
dataset
- test_set
- circle
- rectangular
- triangle
- training_set
- circle
- rectangular
- triangle
2. 음
1. 데이터 생성
# 랜덤시드 고정
np.random.seed(3)
train_datagen = ImageDataGenerator(rescale=1./255,
rotation_range=15,
width_shift_range=0.1,
height_shift_range=0.1,
shear_range=0.5,
zoom_range=[0.8, 2.0],
horizontal_flip=True,
vertical_flip=True,
fill_mode='nearest')
train_generator = train_datagen.flow_from_directory('./dataset/training_set',
target_size=(500, 500),
batch_size=3,
class_mode='categorical')
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory('./dataset/test_set',
target_size=(500, 500),
batch_size=3,
class_mode='categorical')
training generator, test generator
ImageDataGenerator와 flow_from_directory를 사용해 generator 각각 생성.
ImageDataGenerator
- training data가 부족할 때 임의로 변형을 하여 다양한 데이터셋을 얻을 수 있다.
- 객체를 생성한다
- rotation_range = n : 0~n 각도 내에서 임의로 이미지를 회전시킨다.
- width_shift_range = 0.1 : 수평방향 내에서 이미지를 이동시킨다. 전체 넓이가 100일 경우 100*0.1=10 만큼 좌우 이동한다.
- height_shift_range = 0.1 : 수직방향 내에서 이미지를 이동시킨다. 전체 넓이가 100일 경우 100*0.1=10 만큼 상하 이동한다.
- shear_range = 0.5 : 밀림 강도. 시계 반대 방향으로 0.5라디안 만큼 변형시킨다.
- zoom_range = [a,b] : 확대/축소를 한다. zoom_range=a 라면 1-a ~ 1+a 만큼 확대, 축소를 한다.
- horizontal_flip = True : 수평뒤집기를 한다.
- vertical_flip = True : 수직뒤집기를 한다.
flow_from_directory
- generator를 생성한다
- 첫번째 인자 : 이미지 경로
- target_size=(x,y) : 패치 이미지 크기를 설정한다. 원본 이미지와 상관 없이 target_size에 맞춰 수정된다.
- batch_size : 한번에 사용하는 training data의 수
- class_mode : 분류 방식.
- categorical : 2차원 one-hot 부호화된 라벨 반환
- binary : 1차원 이진 라벨 반환
- sparse : 1차원 정수 라벨 반환
- None : 라벨을 반환하지 않는다
batch 크기의 설정
training class의 데이터 수로 batch_size * batch실행수 설정
2. 모델 구성
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(500,500,3)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(3, activation='softmax'))
Convolution layer (위 함수에선 2개)
- 32 : 필터 수
- kernel_size = (3,3) : 필터 크기 3*3
- activation = 'relu' : activation 함수 ReLu
- input_shape(500,500,3) : 입력 이미지 크기 500*500, 입력 이미지 채널 3개
Maxpooling layer
- pool_size(2,2) : pool크기 2*2
Flatten layer
- Flatten layer추가
Dense layer
- 128 : 출력 뉴런 수 128개
- activation : activation function
3. 모델 학습과정 설정
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
- 모델 정의 후 손실함수와 최적화 알고리즘으로 엮는다.
- loss : 가중치 세트를 평가하는데 쓰이는 손실 함수. 다중 클래스에선 categorical_crossentropy
- optimizer : 최적의 가중치를 검색하는 데 사용되는 최적 알고리즘 중 하나인 아담 사용
- metrics : 평가 척도. 분류 문제는 일반적으로 accuracy 사용
4. 모델 학습시키기
model.fit_generator(train_generator, steps_per_epoch=15, epochs=50,
validation_data=test_generator, validation_steps=5)
- keras에서 모델 학습시킬 때는 주로 fit()를 사용한다.
- generate로 생성된 batch로 학습시킬 때는 fit_gerator()를 사용한다.
- 첫번째 인자 : training data set을 제공할 generator 지정. 위에서 만든 train_generator 사용
- steps_per_epoch : 한 epoch에 사용한 step 수. (여기선 샘플 45개일 때 batch_size 5라서 15step으로 임시 사용)
- epochs : 전체 dataset 반복 학습 횟수
- validation_data : validate data set을 제공할 generator 지정. 위에서 만든 test_generator 사용
- validation_steps : 한 epochs 종료 시마다 검증할 때 사용되는 검증 스텝 수. (test data set 15개, batch_size 3라서 5step 사용)
5. 모델 평가하기
print("-- Evaluate(정확도) --")
scores = model.evaluate_generator(test_generator, steps=5)
print("%s: %.2f%%" %(model.metrics_names[1], scores[1]*100))
- evaluate_generator 사용
6. 모델 사용하기
print("-- Predict --")
output = model.predict_generator(test_generator, steps=5)
np.set_printoptions(formatter={'float': lambda x: "{0:0.3f}".format(x)})
print(test_generator.class_indices)
print(output)
print(test_generator.filenames)
- 예측 결과는 클래스(폴더) 별 확률 벡터로 나타난다.
반응형
'Model > Layer' 카테고리의 다른 글
U Net (0) | 2020.04.12 |
---|---|
CNN 모델 (0) | 2020.04.12 |
CNN(Convolution Neural Network)이란? (0) | 2020.04.12 |
RNN/LSTM/GRU (0) | 2020.04.12 |
DNN (Deep Neural Network, 심층 신경망) (0) | 2020.04.12 |