일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ctf-d
- MapReduce 실습
- leetcode 234
- leetcode125
- 빅데이터를 지탱하는 기술
- webcrawler
- leetcode 344
- 데이터레이크와 데이터웨어하우스
- 문자열 조작
- 컴퓨터구조
- leetcode
- 올바른 변수명 짓기
- leetcode 937
- docker로 airflow 설치하기
- 배열
- airflow docker
- 머신러닝
- wargame.kr
- leetcode 15
- 스파크 완벽 가이드
- Python
- leetcode 238
- leetcode 561
- leetcode 49
- leetcode 819
- leetcode 5
- leetcode 121
- Hadoop
- 블로그 이전했어요
- Hortonworks Sandbox
- Today
- Total
HyeM
각 Layer별 살펴보기 본문
실습 : 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을 확인해보면, 다음과 같다.
[batch_size, height, width, channel ] 이런 구조여야 돼서 아래 명령어로 차원수(channel)를 높인다.
2. Feature Extraction
특징뽑기
2-01. Convolution
- 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에 넣은다.
이를 시각화로 확인하면 다음과 같다.
442. weight 불러오기 _layer.get_weights()
길이가 2인것을 확인할 수 있는데, [0]은 weight이고 ,[1]은 bias다.
위에서 나온 range값을 확인해보면, 음수값도 있는것을 확인할 수 있다. 이를 ReLU로 없애주자.
2-02. Activation Function
2-02_1. ReLU()로 음수 값을 없애준다.
2-02_2. 시각화 해보면, 음수값이 사라진 것을 확인할 수 있다.
==> convultion과 activat function하면 0이하 값 사라지고, 이미지가 다음과 같이 변경됨.
2-03. Pooling
이미지를 앞에서 받으면, 이미지를 반으로 줄여서 중요한 것만 압축시킴 ( 압축시킬 때 max pooling 함)
pool_layer에서 위에서 나온 act_output을 넣어준다.
시각화
**문제 : 오른쪽 그림은 더 특징이 도드라져야되는데 그렇지 않음,,,흠
3. Classification
3-01. Fully Connected
input에는 1차원으로 쫙펴져야 되고, 다음노드하고 선 하나하나씩 연결되고, 선하나하나에는 weight가 있음. 연결된 후에는 bias를 더해줌. 이런식으로 연결하면, 또 연결연결,,, 어떤 경우에는 연결하고 ReLU를 실행하고 연결하기도 함.
3-01_01. Flatten
1차원으로 바꿔준다.
시각화해주면 다음과 같다.
(0에 몰려있어서 표시가 잘 안난다.)
3-01_02. Dense
위에서는 1차원으로 펼치기만 하고, 아무것도 안 들어간 상태이다.
Dense는 하나하나 연결하겠다는 의미이다.
즉, 앞에서 flatten 한게 3920개 였는데 ,이를 뒤에 32개와 연결하겠다. 그리고, activation function relu로, 앞에서 dense로 연결한 것을 relu로 내보낸다.
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 |