5. Convolutional Neural Network (이미지용 M.L.N.N.) - Convolution Filter / Max Pooling / keras 의 등장
지금까지 x1, x2, x3, .. 등의 feature데이터가 주어지고 + 정답인 y이라는 label데이터가 주어진 상황에서
답을 아는 상황이므로 Machine Learning 중 supervised learning에 해당하고,
그 가운데 위의 데이터를 Regression모델( Linear,Logistic, A.N.N.) 중 컴퓨터의 뉴럴네트워크인 A.N.N.알고리즘를 사용하여 푸는데
가장 효율적으로 문제를 해결(weight와 bias를 구하는 optimalization)하는 Gradient Descent을 통해 학습시켰다.
1. Regression문제 by Single-Layer N.N. (보스턴 집값예측)
2.3. Classification문제 by Single-Layer -> Multi-Layer ( MNIST -> MNIST 정확도향상)
이 Multi-Layer Neural Network가 바로 딥러닝의 prototype이라 할 수 있다. 보통은 3개 이상의 hidden layer가 들어간 것이 딥러닝이다.
이번 시간에는 Multi-Layer Neural Network 를 이미지전용으로 개선한 Convolutional Neural Network에 대해 학습해보자.
Multi-Layer Neural Network는 여러종류가 있으며, 그 중 하나가 Convolutional Neural Network라 생각하면 된다.
Convolutional N. N.
딥러닝을 가장 실용적으로 쓸 수 있는 알고리즘으로서, Multi-Layer Neural Network의 응용이다.
여태껏 A.N.N.을 python으로만 짜왔으나, 너무 복잡한 코드가 나오기 때문에, keras라는 툴을 사용하여 코드를 작성할 것이다.
Convolutional N.N.은 원리는 어렵지 않으나, 차원의 개념(4차원)이 어렵다.
4. 저번시간에 했던 Multi-Layer Neural Network는 Feed-forward N. N. or fully-connected N.N.이다.
MNIST dataset(28*28)은 흑백사진(0~255)으로, 픽셀단위(784)로 집어넣으면 ---> ouput은 0부터 9까지 10개가 나왔다.
M.L.N.N.의 이미지용 버전인 C.N.N.를 사용하면 아래와 같은 컬러사진을 binary classification으로 풀 수 있다.
어떤 칼라사진(28*28*3) (RGB, 3개가 각각 0~255)을 집어넣어서 ---> output 고양이 or 개인지 1개만 나오면 되는 binary classification을 풀 수있다.
얼굴사진도 인식 가능하다.
input Layer로 360*270pixel의 컬러사진(3)을 input으로 넣으면 output으로 특정사람인지/아닌지을 binary classification하는 모델이다.
여태껏 사용한 M.L.N.N.인 Fully-connected = feed-forward N.N.는 이미지를 분류하는데 있어서 나쁘진 않지만 비효율적인 면이 있다.
컬러 얼굴사진을 인식한다는 것은 RGB로 구성된 pixel이 있고,
해당pixel과 주변pixel을 출력함으로써--> 눈이구나 코이구나 입이구나를 먼저 알 수 있고,
눈, 코, 입의 구분을 조합함으로써 ---> 어떤 사람인지를 알 수 있게 된다.
이미지 데이터의 저장과 표현 중에서 반대로 locally-connected라는 것이 있다.
1) 특정 픽셀에 대해서 거리가 가까운 pixel은 연관성이 있어서 계산을 하고,
2) 거리가 먼 pixel은 연관성이 없는 것으로 보고서 계산하지 않는 방식이다..
fully-connected N.N. ( feed-forward) 방식의 문제점 살펴보기
만약, 위의 컬러얼굴사진을 Multi-Layer Neural Network의 input으로 집어넣었다고 가정해보자.
왼쪽위의 픽셀은 x1으로 들어가고, 오른쪽아래의 픽셀은 bias바로 위의 xn으로 들어갈것이다.
만약, fully-connect N.N.에서는 x1과 xn를 담당하는 w1과 wn사이의연관 관계를 계산해 줄것이다.
하지만 일반적인 이미지데이터에 있어서, weight는 필요가 없을 것이다. 그러므로 이미지를 fully-connected N.N.에 넣어서 계산하는 것은 매우 비효율적이 된다.
한편, 이미지라는 것은 해당 object의 위치만 바꾸면, 똑같은 pixel(feature)임에도 다른 위치의 input으로 위치하게 된다.
만약, fully-connect N.N.는 feature의 위치에 민감하여 다른 입으로 인식할 것이다.
아래의 입의 첫pixel이 fully-connected N.N.의 위쪽으로 올라가서 위쪽의 feature로 인식될 것이다.
즉, input의 위치를 중요하게 여겨 weight로 연산된다.
하지만, 사람이 사진을 인식하는데 있어서, 입의 위치는 중요하지 않다.
즉, 똑같은 pixel은 다른 위치에 있더라도 똑같은 feature로 input되어야하는데,
fully-connected은 위치가 바뀐 동일 feature(pixel)에 대해서 hidden-Layer에서 동일한 feature을 중복해서 뽑아내게 된다.
요약하자면,
1)지금까지의 Multi-Layer Neural Network(fully-connected N.N.)는 이미지의 모든 픽셀의 연관관계를 한번에 모두 연산했다.
- > 이미지용 M.L.N.N.인 Convolutional N.N.는 검사하고 있는 특정픽셀이 선택된 시점에서, 주변픽셀과의 연관관계만 연산한다.
2) full-connected는 input으로 들어가는 pixel의 위치에 대한 weight가 중요하게 계산되어 동일 pixel이라도 다른것으로 인식되어 똑같은 feature를 extracor되었다.
- > C.N.N.은 input의 위치가 중요한게 아니라 입(object)을 뽑아내는 weight가 이미지를 돌아다니는 shared weight가 모든 이미지의 pixel을 돌아다니면서 해당 입(obejct)를 판별한다.
이러한 2가지 fully-connected의 문제점을 극복한 것이 바로 Convolutional N.N.이다. C.N.N.은 2가지 특징외에
1.
한번에 모두 검사하는 fully-connected는 가로 x 세로의 개념이 없었다. -> MNIST dataset처럼 다 펼쳐서 한번에 계산했다.
그러나 C.N.N.부터는 가로 x 세로의 개념이 있다.
2.
C.N.N.에는 Convolutional Filter가 있는 것이 핵심이다. 이 Convolutional Filter도 가로x세로의 개념이 있고, 돌아다니면서 연산한다.
32by32 이미지에다가 5by5의 컨볼루셔널 필터가 있다고 가정해보자.
이 필터는 좌상단에서부터 시작한다. 이러한 필터는 5by5만큼의 주변픽셀들만 연산하게 된다.
이미지의 좌상단 5by5 pixel과 필터 5by5가 서로 연산한다.
이미지의 5,5픽셀은 input * 필터의 5,5픽셀은 shared weight의 개념으로서 dot product하게 되면 output의 좌상단 1pixel이 된다.
연산의 순서는 좌상단에서 -> 오른쪽으로 1pixel씩 이동하며, 좌측으로 내려가 -> 오른쪽으로 진행된다.
이러한 방식을 sliding window라 한다.
참고) 인풋 이미지의 가로세로 32 - ( 필터가로세로5 -1) = output의 가로세로 가 된다.
이러한 Convolutional Filter는 이미지가 locally-conntected한 이미지데이터라는 것을 가정해야 나타나는 개념이다.
그래서 Filter는 현재위치의 1pixel과 그 1) 가로세로의 크기만큼의 주변pixel의 연관관계를 계산하게 되는 것이다.
2)인풋의 위치와 관계없이, 자기가 돌아다니는 shared weight로서 sliding window방식으로 돌아다니면서 dot product연산하여, 똑같은 feature라면 위치와 상관없이 해당feature를 잘 뽑아낼 수있게 된다.
정리하자면
C.N.N.은 가로*세로의 개념을 가지면서, Convolutional Filter(shared weight)가 sliding windwo방식으로 돌아다니면서 dot product한다.
나머지의 과정은 M.L.N.N.과 마찬가지로
#forward propagation을 통해 h(x) - y_predict -> L(y,h(x))까지 나오고
#back propagation을 통해 편미분하여 filter의 weight와 bias의 변화량을 알 수 있게 되고
Graident Descent로 반복해서 학습시킨다면, 최적의 w와 b가 나와서 이미지의 특성을 뽑아 줄 것이다.
C.N.N.의 Convolutional Filter가 효과가 있는지 판단해보자.
M.L.N.N.에 의한 딥러닝의 hidden Layer는 input에서 feature를 스스로 뽑아낸다고 했다.
즉, C.N.N.도 효과가 있는지 없는지에 대해서 판단하라면 hidden-Layer처럼 Convolution Filter가 스스로 feature를 뽑아내는지 확인하면 된다.
누군가가 C.N.N.의 각 Layer를 시각화 한 것이다.
- C.N.N.의 Layer는 앞쪽일수록 저차원의 linear한 feature를 뽑아내고, 뒤로 갈 수록 고차원의 feature를 뽑아낸다.
- Layer1은 선형을, Layer2는 타원모양으로 점점 feature를 뽑아내는 것을 알 수 있다.
-Layer3에서는 벌집모양의 feature를 뽑아낸다. 마지막 Layer에서는 자동차class에서 자동차의 특징인 본넷과 타이어를 뽑아내는 것을 알 수 있다.
결과적으로 C.N.N.의 Filter가 스스로 feature를 잘 뽑아내는 것을 알 수 있다.
그리고 그 방식은 M.L.N.N.보다 더 효율적이었다.
개별적인 6개의 Convolutional Filter 의 묶음 : Convolutional Layer
앞에서 본 Convolutional Filter는 2,2 혹은 5,5으로 weight가 작았다.
관례적으로 하나의 Filter당 하나의 feature를 뽑아낸다 고 얘기한다. 그러므로 여러개의 feature를 뽑아내기 위해서는 여러개의 Filter를 써야한다.
이 여러개의 Convolution Filter를 묶어놓은 것을 Convolution Layer라고 한다.
가로세로5 인 C. filter 6개를 묶어놓은 것을 Convolutional Layer라고 하며, Filter가 6개이므로 6개의 feature를 뽑아낸다.
기본적으로 weight처럼 6개의 Convolutional Filter는 서로 다른 랜덤 초기화 필터이다.
Convolutional filter는 sliding window방식으로 하나의 feature를 뽑아내는데,
하나로는 부족하니까 6개를 묶어서 쓴다. 그것을 Convolutional Layer라고 하는 것이다.
여기서 가장 많이 헤깔리는 것이 filter_size에 대한 것이다.
input은 컬러이미지로서, 가로32세로32 RGB3개이다. 여기에 데이터의 갯수가 더 붙을 것이다.
- 여기서 RGB 3개를 input Filter size라고 한다. 인풋으로 넣는 데이터의 필터(RGB)의 갯수가 3개인 것이다.
Convolutional Filter는 shared weight로서, 가로5,세로5를 가지며, filter size도 붙는다.
- Convolutional Filter의 filter size는 그것은 input filter size(데이터필터갯수ex>RGB)와 하다.
인풋이미지와 연산을 할 때, 흑백이면 흑백 (1), 칼라면 칼라(RGB, 3)이 같은 상태로 연산해야되기 때문이다.
하지만 그 값은 output으로 나갈 때, 1이 되어버린다.
즉, input_filter_size(3) 과 convolution filter_size(3)는 같아야하며 연산결과는 1로 고정되어, 무조건 1이다.
하지만, Filter가 모여있는 Layer안에서는 총 필터 갯수가 6개이므로 output_filtersize는 6이 될 것이다.
Output의 연산 결과는 ouput size가 input size와 같거나(나중 나올 개념) 작아진다(앞에서 나온 개념) 32*32 -> 28*28
- output_Filter_size는 Filter 6개가 모인, Convolutional Layer의 전체 연산결과로서, 1+1+1+1+1+1 = 6이다.
요약하자면)
Filter_size : intput(3) = convolutional Filter(3) ---> 연산 후 (1) ---> 6개가 모인 Convolutional Layer (6) = output (6)
이제 Filter_size의 개념이 제대로 이해가 되었다면, input에 넣는 데이터 4가지를 살펴보자. (여기서는 데이터의 갯수 제외하고 3가지만)
1. input으로 (세로, 가로, input_filter_size) ( 32, 32, 3 )에서 맨마지막input_filter_size는 컬러라면 3으로 고정
2. Convolution Filter(weight)는 처음인자가 늘어나서 (output_filter_size, input_filter_size, 세로, 가로) ( 6, 3, 5, 5)인데,
output_filter_size는 C.N.N.이라면 Convolutional Layer 속 filter갯수만큼 6으로 고정이다.
3. output도 input과 비슷한 형태의 (세로, 가로, output_filter_size)인데, 맨 마지막 output_filter_size는 1짜리 6개로 6으로 고정
이렇게 input과 Convolution Filter의 데이터를 정확히 맞춰주어야 -> C.N.N.가 돌아가서 연산되고 -> output이 나오게 된다.
여기서 헤깔리는 개념은
각 Convolutional Filter는 6개가 각각 연산해서 각각 6개의 output을 만들어내는 것이다. 그리고 그 output은 새로운 feature로서 6개가 쌓이는데 output feature라고 부른다.
input은 비록 이미지를 넣어줬지만(input feature), output feature는 더이상 이미지가 아니게 된다. 그러므로 resizing 코드들이 먹지않는다.
이 때, Convolution Layer의 갯수는 임의로 지정할 수 있다. 나중에 학습할 것이다.
여러개의 Convolutional Layer로 구성할 수 도 있다는 것만 알아두자. 각각의 input feature - Convolution Filter 6개의 Convolution Layer - 6개 각각의 연산결과의 6개 output feature 정도의 구성이다.
여기서 이해해할 개념은 input_fillter_size와 output_filter_size를 이해하는 것이 먼저이다.
- input_filter_size와 convolutional filter의 filter_size는 똑같이 가야한다.
- output_filter_size와 convolutional Layer의 filter개수는 똑같아야한다.
Max Pooling
예전에는 이 Max pooling을 많이 사용하면서 권장하였지만, 요즘의 실용적인 접근에 있어서 많이 안쓰려고 하는 추세이다.
연구쪽에서는 특히나 많이 빼는 추세이다.
Max Pooling은 데이터의 사이즈를 강제로 줄이는 개념이다. 구체적으로 Max한 큰값만 챙기고 작은 값은 버리는 개념이다.
마치 Convolution Filter(shared weight)처럼, Pooling이라는 것이 sliding window방식으로 우측으로 가면서,
이 때, 1 pixel씩 우측으로 가는 것이 아니라, 자기의 size만큼 우측으로 가거나/하단으로 내려간다. 기본적인 Pooling Filter의 크기는 2by2이므로 2칸씩 가게 된다.
그러면서 Pooling의 사이즈안에 있는 값 중 가장 큰값만 챙기고 다른 작은값들은 버린다.
( Filter는 우측으로 1pixel씩 가면서 dot product로 연산하였다면, Pooling은 자기 사이즈씩 가면서 큰 값만 취한다.)
예를 들어, Input feature가 (4,4)이고, Pooling이 (2,2)--> output feature가 (2,2)라고 가정해보자.
여기서 Max Pooling을 하면서 왜 꼭 값을 버려야하냐는 의문이 제기 될 수 있다.
고양이 사진을 예를 들어보자.
고양이의 사진 중에서 고양이의 특징을 나타내는 픽셀은 그렇게 많지 않다. 연산을 효율적으로 하기 위한 방법 중 하나가 이 사진이 고양인지 아닌지 나타내는 중요한 pixel부터 먼저 뽑아놓고 연산하는 방식이 있을 것이다.
Max Pooling의 위치는 가능한 Convolution Layer 다음에 집어넣어서 ,
CONVolutional L. -> Max Pooling -> CONVolutional L. -> Max Pooling -> CONVolutional L. -> Max Pooling을 반복하여 쌓는다.
아니면 CONVolutional L. -> CONVolutional L. -> Max Pooling ->CONVolutional L. -> CONVolutional L. -> Max Pooling 식으로 쌓는다.
이렇게 되면, Convolutional Layer의 연산을 거친 output feature 중에서 값이 큰 것만을 남겨서 다음 Convolutional Layer에 들어가게 된다.
앞에 위치한 Convolutional Layer에서는 중요한 고양이 feature가 발견되면 값을 크게 주게 될 것이다.
즉, 필요없는 feature를 버려서, 남은 메모리는 다음 Conv Layer를 쌓는데 쓰는, 연산을 효율적으로 만든다는 뜻이다.
여기서, Activation(앞에서 배운 sigmoid처럼, output feature의 값이 0~1사이로 나타내는, a(x), h(x)전에 z(x)에서 씌우는 것)까지 생각해보면,
Conv L. -> ActV -> Conv L. -> ActV -> MaxPooling 또는
Conv L. -> ActV -> MaxPooling -> Conv L. -> ActV -> MaxPooling 의 방식으로 반복되어서 층을 쌓는다.
마지막으로 맨 마지막 층에는 한번에 모든 픽셀을 다 검사하는 fully-connected Neural Network(기본적인 Multi-Layer Neural Network)를 넣는다.
요약하자면
Convolutional Neural Network는,
여태껏 배운 Multi-Layer Neural Network(fully-connected) 앞에 Convolutional Layer(locally-connected)가 여러개 들어간다.
실습 - keras
빅3 모듈 : tensorfow / keras / pytorch가 있는데, 요즘은 pytorch가 잘나가고 있다.
- keras의 단점은 조금 느리나, 엄청 심플하다는 것이 특징이다. 나중에 고성능으로 딥러닝을 짜야한다면, tensorflow나 python를 배우면 된다.
keras로 MNIST를 튜닝해보자.
keras로 가장 default한 딥러닝 모델( Single-Layer ) 구성해보기
(Single-Layer나 Multi-Layer는 fully connected N.N.로서, (세로,가로)의 개념이 없기 때문에 pixel을 다 펼친다 (세로*가로))
1) keras/numpy/pandas모듈 가져오기
2) keras.datasets모듈에서 mnist데이터셋 가져오기 -> shape확인하기
3) 가져온y_train의 10개만 확인해보고 -> X_train(feature)를 10개도 시각화해서 label과 매칭해보기
4) Single-Layer나 Multi-Layer는 fully-connected로서 나눠진 세로,가로 픽셀을 reshape로 펼치기
5) keras.utils모듈 속 to_categorical로 쉽게 label들(y_train, y_test) 원핫인코딩 하기-->y_train_hot, y_test_hot
6) Single-Layer그림을 생각해보고, keras로 Single-Layer 구현하기
- 딥러닝 model구현을 위한 default model인 Sequential()받아오기
mode.add()를 통해 dense(weight층)을 집어넣어준다.
- keras의 Dense - fully-connected N.N.의 weight --> model.add를 통해 weight에 해당하는 Dense( , , )인자로 3가지를 지정해줘야한다.
(1)먼저 output_size인 10을 units인자에준다. (units=10,
(2) input_size인 784는 input_shape 인자로 준다.(input_shape=(784,)
(3) 마지막으로 weight인 Dense에다가 actvation도 함께 지정해준다.
- keras의 compile - add해준 모델을 최종 생성하는 역활 -> compile(, ,)에서는 2가지 인자를 지정해줘야한다.
(1) 편미분시켜서 최종적인 w와 b를 찾아가는 기법인 optimizer를 지정
(여태껏 배운 가장 기본적인 gradient descent인 sgd - stochastic gradient descent 를 배웠다)
(2) loss함수 지정 -> multi-classification문제이므로, classification용 loss함수인 'categorical_crossentropy'를 지정해준다.
- keras의 fit - 생성한 모델의 학습을 시작 -> fit( , , )의 필수 3가지 인자로는
(1) feature데이터(input feature, X_train) ,
(2) 핫버전의 label데이터 ( y_train_hot )
(3) epoch인자로 학습 수 지정( epoch = 20 )
(4) 선택적으로 검증데이터가 있다면 검증데이터의 feature데이터 + hot버전의 label데이터 지정 ( validation_data = ( X_train, y_train_hot))
- 정확도 비교가 아니라 gradient 태워서 학습하는 중이므로 hot버전의 label데이터로 학습시킨다.
여기까지가 keras로 single-Layer를 구성하는 default를 구성이다.
default + accuracy 출력(compile시) + 검증데이터 이용(fit시)
여기에 complie로 모델을 생성할 때, 학습과정 중에 해당항목을 출력해주는 metrics(측정항목)을 통해 accuracy를 지정출력해보자.
fit.으로 학습시킬 때, 검증데이터를 집어넣어주는 validation_data를 통해 test set을 검증데이터로 지정해보자.
- epoch을 돌 때마다, train 과 validation set의 loss / accuracy가 같이 표시된다.
- 앞으로도 train시킬 때는, train data를 / validate할 때는 test data를 집어넣자.!
keras.optimizers모듈로 특정 Optimizer 사용하면서 learning_rate추가해주기
- from keras.optimizers import SGD 로 사용할 특정 optimizer를 추가해준다.
- optimizer변수로 따로 받음과 동시에 learning_rate를 지정해 줄 수 있다.
optimizer = SGD(lr = 0.00001)
아직까지는 loss값이나 accuracy가 너무 좋지않다.( 1/10씩 줄거나 마지막자리수를 올리는 방법을 써봐도 별로 개선되지 않았음)
learning_rate를 조절해도 개선되지 않을 때는, weight를 조절해주는 방법을 쓸 수 있다.
앞에서 python으로 딥러닝모델을 만들 때는, -1 ~ 1까지 weight의 사이즈를 임의로 지정해서 랜덤초기화 하였다.
다음시간에는 구체적인 weight 범위조절 및 초기화 방식을 알아볼 것이다.
지금은 가볍게 weight초기화를 조절하여 loss를 줄이고 accuracy를 올리는 것을 구현해보자.
keras.initializers 모듈의 RandomUniform를 통해 weight초기화 조절해보기
- from keras.initializers import RandomUniform 를 통해 주사위를 던지는 것과 동일하게 1,2,3,4,5,6을 균등하게 랜덤으로 가져오는 모듈사용
- compile로 학습모델 생성시,weight에 해당하는 Dense의 인자로 kernel_initializer = RandomUniform(minval = 0.0, maxval = 0.001)를 추가해주자. 범위는 임의로 최소값(minval=) 0.0부터 최대값(maxval=)0.001 까지의 weight를 가지도록 지정해주자.
loss가 급격히 줄면서 accuracy가 결국에는 87%까지 올라갔다.!!!
Keras로 MNIST(multi-classification)문제를 풀기 위한 Multi-Layer Neural Network 구성해보기
위 사진과 같이 Dense가 2개가 들어간다.
1. 먼저 그림속 weight의 input / output을 생각하면서 ---> Dense를 작성한다.
- 여기서 재밌는 것은 2번째 Dense(Layer)의 input(intput_shape)부터는 이전의 Dense이 output(units)와 동일하기 때문에
input_shape를 생략한다.
2. keras라도, Multi-Layer N.N.부터는 오래걸리니 epoch수를 1/2로 줄였다.
3. 똑같이 fit해준다.
Keras로 MNIST(multi-classification)문제를 풀기 위한 C.N.N. 구성해보기
single-Layer, Multi-Layer N.N.와 다르게 C.N.N.부터는 세로 * 가로의 개념이 있게되어, shape계산을 잘해야한다.
1. feature 데이터(X_train, X_test)를 다시 reshape해준다.
input(input feature, feature데이터)이 기본적으로 4가지가 들어가야한다. ( 데이터, 세로, 가로, 필터사이즈 )
- MNIST는 기본적으로 흑백이므로 input_filter_size가 1이다
2. keras로 C.N.N. 모델을 만들어보자.
- 멀티레이어 N.N.의 코드를 복붙한다음,
- keras.layers 모듈에서 가져왔던 Dense(weight) 이외에 Conv2D, MaxPooling2D, Flatten 모듈도 가져온다.
컨브투D는 컨볼루셔널 레이어 / 맥스풀링투D는 맥스풀링 레이어 /
플래튼은 C.N.N. 마지막 층에 들어가는 Single or Multi-Layer로 변환하기 위해 세로*가로개념을 하나로 펼쳐준다. 펼쳐준다.
즉, (세로,가로,필터사이즈) 의 개념이 있는 Convolutional Layer에서--> 세로가로개념이 없는 fully-connected인 Single-/Multi-Layer에 넣어주기 위해 펼쳐준다
- 이제 Sequential()에서 가져온 model변수에 .add( Dense가 아닌 Conv2D를 추가한다.
3. Conv2D(Convolutional Layer)에서는 먼저
(1) filters 인자에 filter의 개수를 정할 수 있다. 기본적으로 filter는 6개를 쓰고 그결과 output feature의 필터사이즈도 6이었다.
(2) kernel_size는 filter의 (세로,가로) size이다. 위에서 본대로 (5,5) 필터를 사용하자.
(3) 다음으로 activation인자로 activation function을 지정해준다. ( 따로 .add해도 된다 Conv->Activ->Conv->Activ-> Pool )
(4) intput_shape로 input_size(세로,가로)를 정해준다.
* Single-/Multi-Layer에서는 fully-connected된 weight개념으로 Dense, input_shape가 세로가로 개념이 없어서 (784,)
* Convolutional Layer에서는 locally-connecte된 이미지를 특정한 크기를( kernerl_size(5,5)) Filters 6개가 연산하는 Conv2D, input세로가로 개념이 생기고 input_filter_size(색)의 개념도 생겨서 input_shape(28, 28,1)
--> 내부적으로 Convolutional Layer의 size는 (6, 1, 32, 32) - (output filter_size = filters, input_filter_size, input_size(height), (width))
4. Conv2D (-> Actv) -> Maxpooling2D 차례이다.
(1) pool_size로 Pooling의 사이즈를 지정해준다. 임의로 (2,2)를 사용해보자.
(2) strides로 pooling이 좌상단->우하단으로 점프를 뛰는 것을 지정해준다. 자기 size와 똑같이 (2,2)를 주는 것이 특이하다.한칸 뛰고 싶다면 (1,1)
5. 이제 Conv2D (->Actv ) -> Maxpooling2D를 반복해준다.
- 너무 똑같이 하지말고, Conv2D ( Convolutional Layer의 필터갯수를 12개로 지정해줬다)
- input_shape는 알아서 계산되니, 삭제하자.
6. Conv2D (->Actv ) -> Maxpooling2D를 반복이 끝난 마지막 단계에서는 Single-/Mult-Layer가 들어가는데, Flatten()모듈로 (세로,가로,input_filter_size) 개념을 하나로 펼쳐준다. 즉, Convolution 연산이 끝나면, Flatten()한 다음, fully-connected에 넣어준다는 개념!
7. Multi-Layer N.N.를 작성할 때 쓴 Dense코드를 가져와서 mode.add(Flatten())다음에, Multi-Layer N.N.를 구성해준다.
- 노드는 임의로 128개로 주자. output feature이므로 units 인자에 들어갈 것임. 뒤쪽Layer이므로 input_shape는 필요없다.
8. 마지막으로 X_test로 모델검증을 하려면 model.predict( X_test) 를 통해 예측값(hot버전)을 array를 반환받는다.
실제데이터와 비교를 통해서 정확도를 평가하려면 롤백해야한다.
- keras의 모델생성(compile)/학습(fit)/검증(predict)은 모두 hot버전인 상태이다. 정확도 평가를 위해서는 argmax(axis=1)로 롤백 해야한다.