합성곱 신경망(CNN)과 데이터 변형
- 합성곱(COnvolution)
- 합성곱의 의미, 배경지식 파악
- Pooling
Convolution
- Convolution을 사용하면 3차원 데이터의 공간적 정보를 유지한채 다음 레이어로 보낼 수 있음.
- 이미지와 컨볼루션 필터를 곱해서 새로운 이미지를 얻는 과정
- 필터는 가중치의 역할을 함 특징을 뽑아서, 분류를 진행
- 합성곱
- 특정(높이, 너비)를 갖은 필터(Filter, Kernel)를 일정간격(Stride)로 이동해가며 입력 데이터에 적용
- 합성곱 필터의 효과
- 합성곱 + 편향
- 필터를 적용한 후, 모든 원소에 편향을 더함(BroadCast)
- Padding
- 합성곱 수행전 입력과 출력의 데이터의 크기를 맞추기 위해서 사용
- Stride
- 필터를 적용하는 위치 간격
- 1이면 1칸씩 이동하고, 2면 2칸씩 이동을 시킨다.
Stride 계산
- 입력크키:(H(높이),W(너비))
- 필터크기 : (FH,FW)
- 출력크기 : (OH,OW)
- 패딩 : P
- 스트라이드 : S ex) input(4,4), Filter (3,3), stride 1 이때 출력 데이터는?
4+패딩(2*1)-3 / 1 = 4
CNN 참고자료 : 밑바닥 부터 시작하는 딥러닝 chapter7
Pooling
- 세로 * 가로 방향의 공간을 줄이는 연산, Sampling 이라고도 불림
- 주로 풀링의 위도우 크기과 Stride값은 같게 설정
- Max pooling이 효율적 크기에서 가장 큰값을 뽑아 사용하는 방법
CNN을 이용한 mnist 데이터 학습
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.utils import to_categorical
mnist = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
print(train_images.shape,test_images.shape)
print(train_labels.shape,test_labels.shape)
train_images = train_images.astype(np.float32) / 255.
test_imaegs = test_images.astype(np.float32) / 255.
# shape를 맞추기 위해 1차원 Dimension하나 추가
train_images = np.expand_dims(train_images, axis = -1) #[Num of data, width, height, Channel]
print(train_images.shape)
test_images = np.expand_dims(test_images, axis = -1)
# 0~9 사이 값을 클래스화 하기위해 one hot encoding 진행
train_labels = to_categorical(train_labels, 10)
test_labels = to_categorical(test_labels, 10)
def CNN():
model = keras.Sequential()
model.add(keras.layers.Conv2D(filters = 16, kernel_size= 3, activation = tf.nn.relu, padding = 'SAME',input_shape = (28,28,1)))
model.add(keras.layers.MaxPool2D(padding='SAME'))
model.add(keras.layers.Conv2D(filters=16, kernel_size=3, activation=tf.nn.relu, padding='SAME'))
model.add(keras.layers.MaxPool2D(padding='SAME'))
model.add(keras.layers.Conv2D(filters=16, kernel_size=3, activation=tf.nn.relu, padding='SAME'))
model.add(keras.layers.MaxPool2D(padding='SAME'))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(64, activation=tf.nn.relu))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(10))
return model
model = CNN()
model.summary()
# 모델을 학습할 방법과 Error 계산 방법, 평가 방법을 설정합니다.
model.compile(optimizer = 'adam', loss = 'mse', metrics = ['accuracy'])
history = model.fit(train_images, train_labels, epochs = 3,batch_size = 500,validation_data= (test_images,test_labels), verbose = 2)
loss, test_acc = model.evaluate(test_images, test_labels)
print(model.predict_classes(test_images))
'공부 > AI School 인공지능 여름캠프' 카테고리의 다른 글
딥러닝 데이터 변형, 과대적합(Overfitting) & 과소적합(Underfitting), Dropout - [AI School] (0) | 2021.05.04 |
---|---|
딥러닝 심층 신경망 최적화, 기울기소실(Gradient Vanishing) - [AI School] (0) | 2021.05.04 |
딥러닝 ANN(Artificial Neural Network), 손실함수, 역전파법 (0) | 2021.05.03 |
딥러닝 텐서플로우 소개 및 기본 사용법 - [AI School] (0) | 2021.05.03 |
딥러닝 시작, 신경망 기초 - [AI School] (0) | 2021.05.03 |