HyeM

각 Layer별 살펴보기 본문

Study/AI&DeepLearning

각 Layer별 살펴보기

Hailey_HyeM207 2021. 1. 11. 19:55

실습 : jupyter notbook의 해설코드 : 강사님이 진행한 코드 그대로 넣어놓음 

단 설명은 part2 폴더에 있음 . 

 

 

 

0. 필요한 패키지 로드

import tensorflow as tf
import os

import matplotlib.pyplot as plt
%matplotlib inline

from tensorflow.keras import datasets

 

1. 데이터를 가져와서, 차원수를 맞춰준다. 

-> 데이터셋 가져와서 shape, 채널 개수 확인하는 거 습관화하기.

(train_x, train_y), (test_x, test_y) = datasets.mnist.load_data()
image = train_x[0]

 

이미지 shape을 확인해보면, 다음과 같다. 

image 시각화

[batch_size, height, width, channel ] 이런 구조여야 돼서 아래 명령어로 차원수(channel)를 높인다.

 

2. Feature Extraction

특징뽑기

2-01. Convolution 

이미지들이 weight에 따라 합성을 하면 오른쪽과 같이 특징이 두드러짐.

- filters: layer에서 나갈 때 몇 개의 filter를 만들 것인지 (a.k.a weights, filters, channels)  
- kernel_size: filter(Weight)의 사이즈  
- strides: 몇 개의 pixel을 skip 하면서 훑어지나갈 것인지 (사이즈에도 영향을 줌)   (1,1)이 기본
- padding: zero padding을 만들 것인지. VALID는 Padding이 없고, SAME은 Padding이 있음 (사이즈에도 영향을 줌)  
                      SAME으로 설정하면, 제로패딩이 있어서 크기 변환이 없다. (만약 valid로 하면 사이즈에 변환있음)
- activation: Activation Function을 만들것인지. 당장 설정 안해도 Layer층을 따로 만들 수 있음
 

 

stride(1,1)이면 이미지에 변화는 없음.(기본) _ 만약 2,2로 하면 이미지가 반으로 줄어들기도 함. 

*filter 개수만큼 channel수가 바뀜. 

 

시각화(Visualization)

1. tf.keras.layers.Conv2D

: Conv2D된 layer층에 image를 넣어 결과물은 output에 넣은다.

이를 시각화로 확인하면 다음과 같다.

(좌) 적용 전 (우) 적용 후
convolution을 거치면서 최소값과 최대값이 달라짐을 확인할 수 있음

 

 

442. weight 불러오기 _layer.get_weights()

 

weight를 불러와서 보면 다음과 같다. 

길이가 2인것을 확인할 수 있는데, [0]은 weight이고 ,[1]은 bias다.

 

이는 원본의 이미지로 (다음이미지 참고)
중앙의 필터를 거쳐 맨 우측의 output이 됨. 

위에서 나온 range값을 확인해보면, 음수값도 있는것을 확인할 수 있다. 이를 ReLU로 없애주자.

 

2-02. Activation Function 

 

2-02_1. ReLU()로 음수 값을 없애준다. 

ReLU
ReLU결과값을 확인해보면, shape는 일정한 것을 확인할 수 있다. 
값의 최소값과 최대값을 살펴보면, 음수는 사라진 것을 확인할 수 있다. 

 

 

2-02_2. 시각화 해보면, 음수값이 사라진 것을 확인할 수 있다. 

==> convultion과 activat function하면 0이하 값 사라지고, 이미지가 다음과 같이 변경됨.

 

 

2-03. Pooling

이미지를 앞에서 받으면, 이미지를 반으로 줄여서 중요한 것만 압축시킴 ( 압축시킬 때 max pooling 함)

2바이 2로 많이 함, (poolsize와 stride를 말함)

pool_layer에서 위에서 나온 act_output을 넣어준다. 

 

반으로 줄어든 것을 확인할 수 있다. 

 

 

시각화

1.0부분은 pooling전의그래프와 비교했을 때 더 줄어듦.

 

**문제 : 오른쪽 그림은 더 특징이 도드라져야되는데 그렇지 않음,,,흠

 

 

3. Classification

3-01. Fully Connected 

선 하나 하나에 weight 들이 들어감 y= wX + b x는 input b는 bias y는 초록

input에는 1차원으로 쫙펴져야 되고, 다음노드하고 선 하나하나씩 연결되고, 선하나하나에는 weight가 있음. 연결된 후에는 bias를 더해줌. 이런식으로 연결하면, 또 연결연결,,, 어떤 경우에는 연결하고 ReLU를 실행하고 연결하기도 함. 

 

 

3-01_01. Flatten

1차원으로 바꿔준다.

flatten 함
shaped을 확인해보면, 3920(=28*28*5)으로 쫙 펼쳐진 것을 확인할 수 있다. 

 

 

 

시각화해주면 다음과 같다. 

(0에 몰려있어서 표시가 잘 안난다.)

 

 

3-01_02. Dense

위에서는 1차원으로 펼치기만 하고, 아무것도 안 들어간 상태이다. 

Dense는 하나하나 연결하겠다는 의미이다. 

32는 뒤에 연결할 노드 몇개 할 건지(unit의 개수)

즉, 앞에서 flatten 한게 3920개 였는데 ,이를 뒤에 32개와 연결하겠다.  그리고, activation function relu로, 앞에서 dense로 연결한 것을 relu로 내보낸다.

 

shape확인하면 32임

 

3-01_03. DropOut

fully하게 연결하면, 오버피팅 되니까 끊을 건 끊고 살릴건 살린다. 학습할때만 저절로 알아서 끊어줌.ㅁ 

 

 

 

4. 총정리 

inputs = layers.Input(shape = input_shape)  #input하고 output 필요
# Feature Extraction
# convoltion -> activate function 반복하다가 -> pooling -> ,,,,
# 사람들마다 32대신 64등등 가능함. 하지만 처음에는 모델을 간단하게 하는것이 좋음 
net = layers.Conv2D(32, (3, 3), padding='SAME')(inputs) #Convolution _ 첫 레이어만 input (바로 지정 가능) 
net = layers.Activation('relu')(net) 
net = layers.Conv2D(32, (3, 3), padding='SAME')(net)
net = layers.Activation('relu')(net)
net = layers.MaxPooling2D(pool_size=(2, 2))(net)
net = layers.Dropout(0.25)(net)

# 여기까지가 convolution 블록 1임 

net = layers.Conv2D(64, (3, 3), padding='SAME')(net)
net = layers.Activation('relu')(net)
net = layers.Conv2D(64, (3, 3), padding='SAME')(net)
net = layers.Activation('relu')(net)
net = layers.MaxPooling2D(pool_size=(2, 2))(net)
net = layers.Dropout(0.25)(net)

# Fully conncected 
net = layers.Flatten()(net)
net = layers.Dense(512)(net)
net = layers.Activation('relu')(net)
net = layers.Dropout(0.5)(net)
net = layers.Dense(num_classes)(net)  # 마지막은 클래스 개수 만큼 노드를 만들어줘야 됨 -> num_classes 사용
net = layers.Activation('softmax')(net)  # softmax : 결과값을 다 더하면 1이 됨. (확률로 표현 가능)

model = tf.keras.Model(inputs=inputs, outputs=net, name='Basic_CNN')

'Study > AI&DeepLearning' 카테고리의 다른 글

Evaluating & Prediction  (0) 2021.01.18
Optimization & Training (Beginner / Expert)  (0) 2021.01.18
MNIST 불러오기  (0) 2021.01.11
시각화 기초(그래프, 이미지)  (0) 2021.01.11
Numpy 기초  (0) 2021.01.11
Comments