반응형

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개로 지정해줌
#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

 

→ 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점이 나온다.

반응형

+ Recent posts