반응형
DNN (Deep Neural Network)
- DNN은 입력층(input layer)과 출력층(output layer) 사이에 여러 개의 은닉층(hidden layer)들로 이뤄진 인공신경망(Artificial Neural Network, ANN)이다.
- input에 대해서 ouput까지 Layer를 거치돼, input Layer 다음에 W랑 b가 있어서 Wx+b를 거치게 되고 hidden layer1 에서는 활성화 함수가 있다고 보면 된다.
- 그 후 다시 Wx + b를 거치고 활성화 함수를 거친 후, output layer가 만약 분류였다면 마지막에는 softmax를 activation function(활성화 함수)을 활용한다.
DNN 실습
- XOR 실습이랑 거의 비슷함
- tensorflow import
import tensorflow as tf
tf.__version__ #tensorflow library version check
# 2.3.0 version
- tensorflow에서 제공하는 데이터 활용
- mnist라는 데이터 불러올 수 있음
- http://yann.lecun.com/exdb/mnist/ → 여기에서 공개된 mnist dataset
- 0부터 9까지 10개에 대한 손글씨 데이터임 → 이미지 크기는 28 x 28 (흑백이라서 채널도 하나뿐)
- 여기서 학습 set과 test set을 나눠서 제공하기 때문에 학습 set 따로 test set 따로 받음
- x는 이미지 실제 값
# data download
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
- 실제 들어있는 값 확인 (x_train, y_train)
→ 실제로 들어있는 값 확인 가능하다. (한 줄에 28개씩 28 줄! 이렇게 데이터가 숫자로 들어감)
→ uint8 (unsigned int 8) 데이터 꼴로 들어가 있음
→ y_train 에는 5가 들어있음
→ 5번의 숫자에 대한 이미지가 x_train에 들어있음
- 이미지를 분류하는 모델 생성 (XOR-2 모델과 비교)
- XOR 모델에서는 애초에 1줄짜리 리스트가 들어있어서 shape=2 해주고 input을 넣어주면 되는데, 지금은 2차원 데이터가 들어있어서 Dense Layer 앞에서 1차원으로 되어 있어야만 들어갈 수 있는 문제가 있어서 Flatten을 해주면 input이 됨
→ Flatten : 2D 이미지를 1D로 바꾸기 위해 사용 - tf.keras.layers.Dense(128, activation='relu')
→ 위에 실제 학습할 파라미터가 들어있음 - Dropout : 0.2는 노드를 비활성화 시킬 비율
- softmax : 0부터 9까지 10개기 때문에 softmax를 10개로 지정해줌
- XOR 모델에서는 애초에 1줄짜리 리스트가 들어있어서 shape=2 해주고 input을 넣어주면 되는데, 지금은 2차원 데이터가 들어있어서 Dense Layer 앞에서 1차원으로 되어 있어야만 들어갈 수 있는 문제가 있어서 Flatten을 해주면 input이 됨
#model define
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28,28)), # Flatten: 2d image -> 1d
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2), # dropout -> to reduce overfitting problem
tf.keras.layers.Dense(10, activation='softmax')
])
# XOR-2 모델
# model = tf.keras.Sequential([
# tf.keras.layers.Input(shape=2, dtype='float32'),
# tf.keras.layers.Dense(4, activation='relu'),
# tf.keras.layers.Dense(4, activation='relu'),
# tf.keras.layers.Dense(2, activation='softmax')
# ])
반응형
Dropout 설명
→ Dropout 은 일부 노드를 끊어준다.
→ 일부 노드를 끊어주면 Overfitting될 확률이 낮아진다.
→ Dropout도 epochs 돌때마다 비활성화되는 노드들이 바뀌기 때문에 Dropout을 적용하게 되면 머신러닝에서 나왔던 Overfitting 과적합 문제가 많이 줄어든다.
Dropout은 Overfitting 과적합 문제를 줄이기 위해서 사용
- 모델의 파라미터 개수 확인
model.summary() # 784(input_size)*128(w) + 128(b) = 100480
→ 입력 개수 x(784) * W(128) + b(128) = 100480
→ shape 하나당 b가 하나 있기 때문에 128을 더해줌
→ 입력 개수 x(128) * W(10) + b(10) = 1290
- model.compile : 모델을 학습할 때 어떤 방식을 사용할지 정해주는 함수
- loss='sparse_categorical_crossentropy' → cross enttopy인데 분류를 여러 개로 할 때 사용
- metrics=['accuracy'] → 정확도를 보겠다는 것
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
- 학습
- fit() 함수를 호출할 때 추가적으로 넣을 수 있는 게 많다 (https://keras.io/ko/models/sequential/ 참고)
- shuffle : 불리언 (각 세대를 시작하기 전 학습 데이터를 뒤섞을지 여부) 혹은 ('batch'에 넣을) 문자열
- use_multiprocessing : 병렬 처리 관련?
model.fit(x_train, y_train, epochs=10)
→ 90점 넘게 분류가 나옴
- 평가
- test 데이터가 따로 있기 때문에 test 데이터를 넣어서 몇 점이 나오는지 출력
- verbose : 어떤 방법으로 출력할지
model.evaluate(x_test, y_test, verbose=2)
→ 평가는 testset에서 94점이 나온다.
반응형
'AI' 카테고리의 다른 글
[AI] RNN(Recurrent Neural Network)이란? - 개념 및 실습 (0) | 2020.12.15 |
---|---|
[AI] 딥러닝 개요 - 순전파, 역전파 그리고 활성화 함수 (0) | 2020.12.15 |
[AI] 딥러닝의 개요 - 퍼셉트론 (2) | 2020.11.27 |
[AI] SVM 과 k-means clustering 이론 및 실습 (0) | 2020.11.27 |
[AI] 회귀(Regression) 실습 - 선형회귀 및 로지스틱 회귀 (0) | 2020.11.27 |