본문 바로가기

멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차/DL

4/12 화

728x90

화요일!

 

현재의 Deep Learning이 어느 정도 효율을 내기 시작한 이유에 대해 공부한다.

 

Weight와 Bias를 랜덤 초기값으로 사용하던 것을 Xievier/He's Initialization으로 대체하고,
Vanishing Gradient 현상을 Back-Propagation(행렬연산, 역의 방향으로 W, b를 Update)과 Activation 함수를 Sigmoid 대신 ReLU를 사용하고,

계산해야 하는 W, b를 Drop-out으로 연산에 사용되는 Node를 줄임으로써 해결함

 

1. Multinomial Classification by Tensorflow 1.15 ver.

import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split

# Raw Data Loading
df = pd.read_csv('./data/mnist/train.csv')
display(df.head()) # (42000, 785)

# 데이터 전처리 : 결측치나 이상치 없음. 단, 정규화는 필요함

# 이미지 확인
img_data = df.drop('label', axis=1, inplace=False).values

figure = plt.figure()
ax_arr = []

for n in range(10):
    ax_arr.append(figure.add_subplot(2,5,n+1))
    ax_arr[n].imshow(img_data[n].reshape(28,28), # 28 x 28 픽셀로 변환
                     cmap='Greys', # cmap은 흑백 이미지 처리
                     interpolation='nearest') # interpolation는 보간법(이미지 깨지지 않도록)
    
plt.tight_layout()
plt.show()

import warnings
warnings.filterwarnings('ignore')

# Data Split
train_x_data, test_x_data, train_t_data, test_t_data = \
train_test_split(df.drop('label', axis=1, inplace=False), df['label'], test_size=0.3, random_state=1, stratify=df['label'])

# 정규화
scaler = MinMaxScaler()
scaler.fit(train_x_data)

norm_train_x_data = scaler.transform(train_x_data)
norm_test_x_data = scaler.transform(test_x_data)

# One-Hot Encoding 처리
sess = tf.Session()

onehot_train_t_data = sess.run(tf.one_hot(train_t_data, depth=10))
onehot_test_t_data = sess.run(tf.one_hot(test_t_data, depth=10))

# Placeholder
X = tf.placeholder(shape=[None,784], dtype=tf.float32) # 독립변수(feature)의 개수
T = tf.placeholder(shape=[None,10], dtype=tf.float32) # class의 logistic 개수

# Weight, bias
W = tf.Variable(tf.random.normal([784,10])) # 독립변수 784개, 종속변수 10개. W는 7840개
b = tf.Variable(tf.random.normal([10])) # = logistic 개수

# Model, Hypothesis
logit = tf.matmul(X,W) + b
H = tf.nn.softmax(logit)

# Cross Entropy(loss func)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logit, labels=T))

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

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

# 반복 학습
for step in range(5000):
    
    tmp, loss_val = sess.run([train, loss], feed_dict={X:norm_train_x_data, T:onehot_train_t_data})
    
    if step % 500 == 0:
        print('loss 값 : {}'.format(loss_val))
# 성능평가(Accuracy)
predict = tf.argmax(H,1) # axis=1(열 방향)으로 가장 큰 요소를 찾아라
correct = tf.equal(predict, tf.argmax(T,1)) # 예측과 정답이 맞는지에 대한 Boolean
accuracy = tf.reduce_mean(tf.cast(correct, dtype=tf.float32)) # Boolean을 실수로 바뀜

# 학습 데이터로 성능평가를 하면 안됨! 이마저도 낮다면 학습이 안 된 것!
train_result = sess.run(accuracy, feed_dict={X:norm_train_x_data, T:onehot_train_t_data})
print('train 데이터의 정확도 : {}'.format(train_result)) # 0.8769387602806091

result = sess.run(accuracy, feed_dict={X:norm_test_x_data, T:onehot_test_t_data})
print('test 데이터의 정확도 : {}'.format(result)) # 0.8660317659378052

 

2. Multinomial Classification by Tensorflow 1.15 ver. w/h Neural Network

(Weight 초기화, Activation 변경, Dropout은 일단 제외)

# Weight, bias
W2 = tf.Variable(tf.random.normal([784,256]))
b2 = tf.Variable(tf.random.normal([256]))
layer2 = tf.sigmoid(tf.matmul(X,W2) + b2)

W3 = tf.Variable(tf.random.normal([256,128]))
b3 = tf.Variable(tf.random.normal([128]))
layer3 = tf.sigmoid(tf.matmul(layer2,W3) + b3)

W4 = tf.Variable(tf.random.normal([128,10]))
b4 = tf.Variable(tf.random.normal([10]))

# Model, Hypothesis
logit = tf.matmul(layer3,W4) + b4
H = tf.nn.softmax(logit)

# Cross Entropy(loss func)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logit, labels=T))

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

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

# 반복 학습
for step in range(1000):
    
    tmp, loss_val = sess.run([train, loss], feed_dict={X:norm_train_x_data, T:onehot_train_t_data})
    
    if step % 100 == 0:
        print('loss 값 : {}'.format(loss_val))
# NN 구현의 성능평가(Accuracy)
predict = tf.argmax(H,1) # axis=1(열 방향)으로 가장 큰 요소를 찾아라
correct = tf.equal(predict, tf.argmax(T,1)) # 예측과 정답이 맞는지에 대한 Boolean
accuracy = tf.reduce_mean(tf.cast(correct, dtype=tf.float32)) # Boolean을 실수로 바뀜

# 학습 데이터로 성능평가를 하면 안됨! 이마저도 낮다면 학습이 안 된 것!
train_result = sess.run(accuracy, feed_dict={X:norm_train_x_data, T:onehot_train_t_data})
print('train 데이터의 정확도 : {}'.format(train_result)) # 0.7808163166046143

result = sess.run(accuracy, feed_dict={X:norm_test_x_data, T:onehot_test_t_data})
print('test 데이터의 정확도 : {}'.format(result)) # 0.7566666603088379

 

3. Multinomial Classification by Tensorflow 1.15 ver. w/h Deep Learning

(Weight 초기화, Activation 변경 : Sigmoid -> ReLU, Dropout)

import warnings
warnings.filterwarnings('ignore')

# Weight, bias
# W2 = tf.Variable(tf.random.normal([784,256]))
W2 = tf.get_variable('W2', shape=[784,256],
                     initializer=tf.contrib.layers.xavier_initializer())
b2 = tf.Variable(tf.random.normal([256]))
_layer2 = tf.nn.relu(tf.matmul(X,W2) + b2)
layer2 = tf.nn.dropout(_layer2, rate=0.3) # 30% Drop-out

# W3 = tf.Variable(tf.random.normal([256,128]))
W3 = tf.get_variable('W3', shape=[256,128],
                     initializer=tf.contrib.layers.xavier_initializer())
# W3 = tf.get_variable('W3', shape=[256,128],
#                      initializer=tf.contrib.layers.variance_scaling_initializer())
b3 = tf.Variable(tf.random.normal([128]))
_layer3 = tf.nn.relu(tf.matmul(layer2,W3) + b3)
layer3 = tf.nn.dropout(_layer3, rate=0.3)

# W4 = tf.Variable(tf.random.normal([128,10]))
W4 = tf.get_variable('W4', shape=[128,10],
                     initializer=tf.contrib.layers.xavier_initializer())
# W4 = tf.get_variable('W4', shape=[128,10],
#                      initializer=tf.contrib.layers.variance_scaling__initializer())
b4 = tf.Variable(tf.random.normal([10]))

# Model, Hypothesis
logit = tf.matmul(layer3,W4) + b4
H = tf.nn.softmax(logit)

# Cross Entropy(loss func)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logit, labels=T))

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

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

# 반복 학습
for step in range(5000):
    
    tmp, loss_val = sess.run([train, loss], feed_dict={X:norm_train_x_data, T:onehot_train_t_data})
    
    if step % 500 == 0:
        print('loss 값 : {}'.format(loss_val))
# Deep Learning 구현의 성능평가(Accuracy)
predict = tf.argmax(H,1)
correct = tf.equal(predict, tf.argmax(T,1))
accuracy = tf.reduce_mean(tf.cast(correct, dtype=tf.float32))

# 학습 데이터로 성능평가를 하면 안됨! 이마저도 낮다면 학습이 안 된 것!
train_result = sess.run(accuracy, feed_dict={X:norm_train_x_data, T:onehot_train_t_data})
print('train 데이터의 정확도 : {}'.format(train_result)) # 0.9743537306785583

result = sess.run(accuracy, feed_dict={X:norm_test_x_data, T:onehot_test_t_data})
print('test 데이터의 정확도 : {}'.format(result)) # 0.9568253755569458

 

4. Multinomial Classification by Tensorflow 2.x ver. w/h Deep Learning

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import SGD
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')

# Raw Data Loading
df = pd.read_csv('/content/drive/MyDrive/Colab 멀캠 이지연/mnist/train.csv')
# display(df.head()) # (42000, 785)

# 데이터 전처리 : 결측치나 이상치 없음. 단, 정규화는 필요함

# Data Split
train_x_data, test_x_data, train_t_data, test_t_data = \
train_test_split(df.drop('label', axis=1, inplace=False), df['label'], test_size=0.3, random_state=1, stratify=df['label'])

# 정규화
scaler = MinMaxScaler()
scaler.fit(train_x_data)

norm_train_x_data = scaler.transform(train_x_data)
norm_test_x_data = scaler.transform(test_x_data)

# One-Hot Encoding 처리할 필요가 없음

# Tensorflow 2.x 구현
model = Sequential()

model.add(Flatten(input_shape=(784,))) # input layer
model.add(Dense(units=256, activation='relu')) # hidden layer
model.add(Dense(units=128, activation='relu')) # hidden layer
model.add(Dense(units=10, activation='softmax')) # output layer

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

model.fit(norm_train_x_data, train_t_data, epochs=5000, batch_size=100, validation_split=0.3, verbose=0)
result = model.evaluate(norm_test_x_data, test_t_data)
print(result)          # loss: 0.1664 - accuracy: 0.9664

 

5. 모델 학습 시간이 과도하게 오래 걸리는 것을 방지해주는 EarlyStopping

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.callbacks import EarlyStopping
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')

# Raw Data Loading
df = pd.read_csv('/content/drive/MyDrive/Colab 멀캠 이지연/mnist/train.csv')
# display(df.head()) # (42000, 785)

# 데이터 전처리 : 결측치나 이상치 없음. 단, 정규화는 필요함

# Data Split
train_x_data, test_x_data, train_t_data, test_t_data = \
train_test_split(df.drop('label', axis=1, inplace=False), df['label'], test_size=0.3, random_state=1, stratify=df['label'])

# 정규화
scaler = MinMaxScaler()
scaler.fit(train_x_data)

norm_train_x_data = scaler.transform(train_x_data)
norm_test_x_data = scaler.transform(test_x_data)

# One-Hot Encoding 처리할 필요가 없음

# Tensorflow 2.x 구현
model = Sequential()

model.add(Flatten(input_shape=(784,)))           # input layer
model.add(Dense(units=256, activation='relu'))   # hidden layer
model.add(Dense(units=128, activation='relu'))   # hidden layer
model.add(Dense(units=10, activation='softmax')) # output layer

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

es = EarlyStopping(monitor='val_loss', # monitoring 할 값
                   min_delta=0.001,    # threshold. val_loss 변화 값의 최소가 0.001일 때 훈련을 중지
                   patience=5,         # 성능이 증가하지 않는 상태에서 epoch를 5번 허용
                   mode='auto',
                   restore_best_weights=True) # 훈련이 중지했을 때 최고 성능의 weights를 보관

model.fit(norm_train_x_data, train_t_data, epochs=5000, batch_size=100, validation_split=0.3, verbose=0, callbacks=[es])
result = model.evaluate(norm_test_x_data, test_t_data)
print(result) # loss: 0.1974 - accuracy: 0.9437

 

1. 3/15 화 2. 3/16 수 3. 3/17 목 4. 3/18 금 5. 3/21 월
ML
환경 설정

(아나콘다, 주피터 노트북),
Pandas,

Numpy,
ndarray
ML
Numpy,

행렬곱연산,
전치행렬,
iterator,
axis,
Pandas,
Series,
DataFrame
ML
Pandas,

DataFrame,
함수들
ML
Pandas,

데이터 분석,
데이터 전처리
ML
Pandas,

데이터 전처리,
수행평가
6. 3/22 화 7. 3/23 수 8. 3/24 목 9. 3/25 금 10. 3/28 월
ML
데이터 시각화,

Matplotlib,
기술통계
ML
기술통계
ML
기술통계,

머신러닝
ML
미분,

Regression
ML
머신러닝 기법들,
Regression
11. 3/29 화 12. 3/30 수 13. 3/31 목 14. 4/1 금 15. 4/4 월
ML
Regression 구현

(Python, Scikit-Learn)
ML
Outlier,

Z-score,
MinMaxScaler,
다변수
 ML
Tensorflow,

Classification
ML
Binary Classification,
Logistic Regression
ML
평가지표(Metrics)
16. 4/5 화 17. 4/6 수 18. 4/7 목 19. 4/8 금 20. 4/11 월
ML
평가 시 주의사항

(Over-fitting,
Regularization,
Over-Sampling)
ML
Multinomial Classification,

SGD Classifier,
Softmax,
batch
ML
Multinomial Classification

Tensorflow 2.0
Keras
ML
KNN
Deep Learning
Perceptron,
Nueral Network
21. 4/12 화 22. 4/13 수 23. 4/14 목 24. 4/15 금 25. 4/18 월
Deep Learning
Initialization,
ReLU,
Drop-out,
Early-Stopping 
Deep Learning
Image,
CNN
Deep Learning
Deep Learning
Deep Learning

* 새로운 개념들을 익히자!

728x90

'멀티캠퍼스 프로젝트형 AI 서비스 개발 5회차 > DL' 카테고리의 다른 글

4/18 월  (0) 2022.04.18
4/15 금  (0) 2022.04.15
4/14 목  (0) 2022.04.14
4/13 수  (0) 2022.04.13
4/11 월  (0) 2022.04.11