멀티캠퍼스 AI과정/06 Deep Learning

Deep Learning 01 DNN (Deep Neural Network)

jhk828 2020. 10. 15. 16:04

201015

Perceptron

  • 뇌의 기능 (뉴런)을 모델링한 하나의 학습 기계
  • 다수의 신호를 입력받아서 하나의 신호를 출력하는 구조

활성화 함수 (Activation function)

  • 다음 신경망에 정할지, 일정 수준이 넘는지 판단하는 함수

 

  • 이런 Perceptron을 이용하면 사람처럼 생각하는 기계를 만들 수 있을 것이다
  • Perceptron으로 AND, OR, NAND, XOR GATE을 학습, 판단
    • XOR은 하나의 Perceptron으로 구현할 수 없는 문제 발생
    • MLP (Multi Layer Perceptron)으로 가능하나 너무 어려워서 학습이 거의 안됨

 

GATE 연산 수행하는 Logistic Regression 구현

# TF 1.15 버전
# GATE 연산 수행하는 Logistic Regression 구현

import numpy as np
import tensorflow as tf
from sklearn.metrics import classification_report

print(tf.__version__) # 1.15.0

# Training Data Set
x_data = np.array([[0, 0],
                  [0, 1],
                  [1, 0],
                  [1, 1]], dtype=np.float32)

# # AND GATE
#  t_data = np.array([[0], [0], [0], [1]], dtype=np.float32) # 2차원

# #OR GATE
# t_data = np.array([[0], [1], [1], [1]], dtype=np.float32) # 2차원

# # NAND GATE
# t_data = np.array([[1], [1], [1], [0]], dtype=np.float32) # 2차원

# XOR GATE
t_data = np.array([[0], [1], [1], [0]], dtype=np.float32) # 2차원

# placeholder
X = tf.placeholder(shape=[None, 2], dtype=tf.float32)
T = tf.placeholder(shape=[None, 1], dtype=tf.float32)

# Weight & bias
# 독립변수 2, 종속변수 1개 (= Output 1개 = Logistic 1개)
W = tf.Variable(tf.random.normal([2, 1], name='weight')) 
b = tf.Variable(tf.random.normal([1], name='bias'))   # bias는 1개 

# Hypothesis
logit = tf.matmul(X, W) + b # Linear Regression
H = tf.sigmoid(logit) # 0~1로 표현, 활성화 함수

# loss function
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit,
                                                              labels=T))

# train
train = tf.train.GradientDescentOptimizer(learning_rate=1e-2).minimize(loss)

# session, 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())

# 학습
for step in range(30000):
    # train 학습 -  결과값 확인x, loss는 확인
    _, loss_val = sess.run([train, loss],
                           feed_dict={X:x_data,
                                      T:t_data}) 
    
    if step % 3000 == 0:
        print('loss: {}'.format(loss_val))

 

# 성능평가 (Accuracy)

# tf.cast : boolean값을 0,1 실수로 변환
accuracy = tf.cast(H >= 0.5, dtype=tf.float32)
result = sess.run(accuracy, feed_dict={X: x_data})

# classification_report(정답, 예측값) - 1차원으로 변환하여 입력
print(classification_report(t_data.ravel(), result.ravel()))

# 나머지 GATE들은 1.0의 정확도를 보이나 XOR는 그렇지 않다.

 

Nueral Netowrk (신경망)과 Artificial Neural Network(인공 신경망)

 

Deep Learning

  • 1개의 Logistic Regression을 나타내는 node가 서로 연결되어 있는 (인공) 신경망 구조를 기반으로
    • 입력층 (Input Layer)
    • 은닉층 (Hidden Layer) 1개 이상
    • 출력층 (Output Layer)
  • 구조로 구축한, 출력층의 오차를 이용해서 각 node의 가중치를 학습시키는 machine learning의 방법
  • 이러한 기본 딥러닝 구조가 DNN (Deep Neural Network)
  • 은닉층의 수가 많을 수록 학습이 잘 되고/ 시간이 오래 걸리고/ Overfitting의 위험이 있다.
  • FC layer (Fully Connected layer) : 완전 연결층
  • Feed Forward (= Propagation)

 

 

GATE 연산 수행하는 Deep Learning 구현

DNN (Deep Neural Network)

%reset

# TF 1.15 버전
# GATE 연산 수행하는 Deep Learning 구현

import numpy as np
import tensorflow as tf
from sklearn.metrics import classification_report

# print(tf.__version__) # 1.15.0

# Training Data Set
x_data = np.array([[0, 0],
                  [0, 1],
                  [1, 0],
                  [1, 1]], dtype=np.float32)

# XOR GATE
t_data = np.array([[0], [1], [1], [0]], dtype=np.float32) # 2차원

### placeholder => Input Layer 역할
X = tf.placeholder(shape=[None, 2], dtype=tf.float32)
T = tf.placeholder(shape=[None, 1], dtype=tf.float32)


### Hidden Layer 역할
# Weight & bias
# 독립변수 2, 종속변수 100 => Logistic 100개
W2 = tf.Variable(tf.random.normal([2, 100], name='weight2')) 
b2 = tf.Variable(tf.random.normal([100], name='bias2'))     
layer2 = tf.sigmoid(tf.matmul(X, W2) + b2) # layer2의 결과값 100개

# 입력값 100개, 로지스틱 6개
W3 = tf.Variable(tf.random.normal([100, 6], name='weight3')) 
b3 = tf.Variable(tf.random.normal([6], name='bias3'))     
layer3= tf.sigmoid(tf.matmul(layer2, W3) + b3) # layer3의 결과값 6개


### Output Layer => 최종 결과물은 0 아니면 1 한개
W4 = tf.Variable(tf.random.normal([6, 1], name='weight4')) 
b4 = tf.Variable(tf.random.normal([1], name='bias4'))     

# Hypothesis
logit = tf.matmul(layer3, W4) + b4 # Linear Regression
H = tf.sigmoid(logit)    # 0~1로 표현, 활성화 함수

# loss function
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit,
                                                              labels=T))

# train
train = tf.train.GradientDescentOptimizer(learning_rate=1e-2).minimize(loss)

# session, 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())

# 학습
for step in range(30000):
    # train 학습 -  결과값 확인x, loss는 확인
    _, loss_val = sess.run([train, loss],
                           feed_dict={X:x_data,
                                      T:t_data}) 
    
    if step % 3000 == 0:
        print('loss: {}'.format(loss_val))
        
        
## 성능평가 (Accuracy)

# tf.cast : boolean값을 0,1 실수로 변환
accuracy = tf.cast(H >= 0.5, dtype=tf.float32)
result = sess.run(accuracy, feed_dict={X: x_data})

# classification_report(정답, 예측값) - 1차원으로 변환하여 입력
print(classification_report(t_data.ravel(), result.ravel()))

#  accuracy                           1.00  

 

GATE 연산 수행하는 Deep Learning 구현

tensorflow 2.0 keras

%reset

# TF 2.11 버전
# GATE 연산 수행하는 Deep Learning구현

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import SGD
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt

print(tf.__version__) # 

# Training Data Set
x_data = np.array([[0, 0],
                  [0, 1],
                  [1, 0],
                  [1, 1]], dtype=np.float32)


# XOR GATE
t_data = np.array([[0], [1], [1], [0]], dtype=np.float32) # 2차원

model = Sequential()
# model.add(Flatten(input_shape=(2, )))
model.add(Dense(100, activation='sigmoid', input_shape=(2, )))
model.add(Dense(6, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer=SGD(learning_rate=1e-1),
              loss='binary_crossentropy',
              metrics=['accuracy'])

history = model.fit(x_data, 
                    t_data,
                    epochs=30000,
                    verbose=0)

predict_val = model.predict(x_data) # 실수값
# print(predict_val) # 2.1.0
result = tf.cast(predict_val >= 0.5, dtype=tf.float32).numpy().ravel()

print(classification_report(t_data.ravel(), result))

 

print(history.history.keys()) 
# dict_keys(['loss', 'accuracy'])
# epoch당 train data를 이용한 accuracy를 의미

plt.plot(history.history['accuracy'], color='b')
plt.show()