반응형

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

반응형
반응형

퍼셉트론(Perceptron)

  • 퍼셉트론은 초기 형태의 인공 신경망으로, 다수 입력으로부터 하나의 결과를 내보내는 알고리즘
  • 뉴런을 흉내내어 만든 구조

→ 이런 수식을 보여주는데 , 여기서 i가 한개밖에 없으면 결국 선형회귀랑 똑같음 !!

  • 인공신경망은 퍼셉트론을 여러층 쌓고 이렇게 만듬
  • 결국 선형회귀랑 로지스틱회귀를 여러개 겹쳐서 사용하면 인공신경망에 쓰는 딥러닝이 되는 구조
그래서 선형회귀랑 로지스틱 회귀를 잘 이해하고 넘어가야 함
거의 선형회귀랑 로지스틱회귀가 딥러닝의 밑거름

 

XOR 문제

→ AND 나 OR 같은 경우 선을 하나만 그으면 분류가 가능함 (선형회귀, 로지스틱 회귀)

→ XOR 는 선 하나만 가지고 분류가 불가능함

 

왜 인공지능에 딥러닝이 나왔는가 ?? (XOR 문제)

  • 하나의 퍼셉트론은 선형으로만 분리할 수 있어, XOR은 풀 수 없음
  • 퍼셉트론을 여러 층으로 쌓으면 곡선으로도 분리할 수 있음,, 그래서 딥러닝이 등장함!
    다층 퍼셉트론 (MultiLayer Perceptron, MLP) - 딥러닝의 제일 시초
  • 다층 퍼셉트론처럼 은닉층이 2개 이상인 경우, 심층 신경망 (Deep Neural Network, DNN)이라고 부름

 

XOR 문제 실습 1

  • 단순 로지스틱 회귀 → XOR 문제를 해결할 수 없음
import numpy as np
import tensorflow as tf

 

  • Input 정의
    • 00 → 0 , 01 → 1 , 10 → 1 , 11 → 0
input = np.array([[0,0], [0,1], [1,0], [1,1]]).astype(np.float)
output = np.array([[0], [1], [1], [0]]).astype(np.float)

 

  • tensorflow 를 활용해서 모델 생성
    • Input 데이터가 두개가 들어오면 거기에 대해서 Dense 라는 Layer를 추가
    • → 퍼셉트론이라고 생각하면 됨
    • → sigmoid 함수를 썼는데 1층만 있으면 결국 Logistic regression이랑 똑같음
model = tf.keras.Sequential([
    tf.keras.layers.Input(shape=2, dtype='float32'), # Input 정의
    tf.keras.layers.Dense(1, activation='sigmoid') # 실질적인 층
])

model.summary() # param:3 -> W:2, b:1

→ parameter 수가 3개라고 나옴,, Input 에서 두개가 들어오기때문에 두개에 대한 각각의 W가 생성이 되고 W 두개에 b가 한개 !!

 

  • 로지스틱 회귀랑 선형회귀에서 계속 학습할 때 썼던 GD를 SGD이라고 생각하면 됨
    • SGD는 Gradient Descent 위에 momentum이라고 생각하면 됨
optimizer = tf.keras.optimizers.SGD(lr=0.01, decay=0, momentum=0.99, nesterov=True)
model.compile(optimizer=optimizer, loss='mse', metrics=['accuracy']) 

# 학습 fit() 함수 호출
model.fit(input, output, epochs=10)

→ 파라미터 3개에 대해서 10번 학습하는데 계속 정확도가 50밖에 안나옴

→ XOR 문제를 풀 수가 없어서 50밖에 안나옴

 

아무리 학습을 해도 50점밖에 안되는 구조가 있어서 그런 부분을 수학적으로 풀어주기 위해서 층을 더 쌓으면 풀 수 있다 !!
반응형

XOR 문제 실습 2

  • 다층 퍼셉트론 → XOR 문제 해결 가능
import numpy as np
import tensorflow as tf

input = np.array([[0,0], [0,1], [1, 0], [1,1]]).astype(np.float)
output = np.array([[1,0], [0, 1], [0, 1], [1, 0]]).astype(np.float)

 

  • 모델 생성
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')
                             ])
                             
model.summary()

 

  • binary_crossentropy
optimizer = tf.keras.optimizers.SGD(lr=0.01, decay=0, momentum=0.99, nesterov=True)
model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])

 

  • 학습
model.fit(input, output, epochs=30)

→ 30번쯤 돌리니 정확도가 1점이 나옴 !! 드디어 !!!

 

XOR-1 에서는 모델에서 층을 하나만 줬음
XOR-2 에서는 모델에서 층을 3개를 쓰고, loss function도 binary_crossentropy 으로 바꿔줌
→ cross entropy가 분류에서 많이 씀
→ 멀티 Layer로 모델을 바꿔주고 학습을 하니깐 성능이 좋아짐
→ 이런식의 문제를 풀기 위해서 처음에는 단층을 썼었는데 XOR 문제도 당장 못풀기때문에 그부분을 해결하기 위해 다층 퍼셉트론으로 바꾸면서 DNN이 등장함 !!

 

반응형

+ Recent posts