멀티캠퍼스 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()