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