MNINST (Deep Learning 역사 ver) [he's intializer]

2021. 9. 17. 00:49ai/Deep Learning

728x90

# 1. Training Data Set 확보

 

import numpy as np

import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import MinMaxScaler

 

# Raw Data Loading

df = pd.read_csv('/content/drive/MyDrive/융복합 프로젝트형 AI 서비스 개발(2021.06)/09월/16일(목요일)/mnist/train.csv')

 

# train 데이터와 test 데이터를 분리

train_x_data, test_x_data, train_t_data, test_t_data = \

train_test_split(df.drop('label', axis=1, inplace=False),

                 df['label'],

                 random_state=0,

                 test_size=0.3,

                 stratify=df['label'])

 

# 결측치 이상치는 존재하지 않아요!

# 정규화는 진행해야 합니다.

scaler = MinMaxScaler()

scaler.fit(train_x_data)

train_x_data_norm = scaler.transform(train_x_data)

test_x_data_norm = scaler.transform(test_x_data)

 

# 2. sklearn으로 구현

 

from sklearn.linear_model import LogisticRegression

 

model = LogisticRegression(solver='saga')

 

#saga는 stochastic gradient algorithm 보다 data가 많을때는 saga

# 속성으로 C를 줄수 있으며 L2 강도조절가능

  L2는 기본 장착

 

model.fit(train_x_data_norm, train_t_data)

 

# model 평가

model_score = model.score(test_x_data_norm, test_t_data)

print('sklearn의 정확도 : {}'.format(model_score))

 

# sklearn의 정확도 : 0.917063492063492

 

# 3. tensorflow 1.15로 구현

 

# 3. tensorflow 1.15로 구현(multinomial classification)

# label의 class들에 대해 one-hot encoding처리를 해야 해요!

 

import tensorflow as tf

 

sess = tf.Session()

train_t_data_onehot = sess.run(tf.one_hot(train_t_data, depth=10))

test_t_data_onehot = sess.run(tf.one_hot(test_t_data, depth=10))

 

# placeholder

X = tf.placeholder(shape=[None,784], dtype=tf.float32)

T = tf.placeholder(shape=[None,10], dtype=tf.float32)

 

# Weight & bias

W = tf.Variable(tf.random.normal([784,10]))

b = tf.Variable(tf.random.normal([10]))

 

# hypothesis

logit = tf.matmul(X,W) + b

H = tf.nn.softmax(logit)

 

# loss

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())

# 여기서 초기화는 w초기화가 아닌 tf의 변수를 만들때 초기에 사용한느 기법 /

  나중에 2.0에서는 필요 없어서 빠졌다

 

# batch를 이용해서 training data를 분할해서 학습을 진행(메모리문제때문에...)해야 해요!

# 여기서는 batch처리를 생략해서 구현할께요!

 

# 학습을 진행

for step in range(3000):

    

    tmp, loss_val = sess.run([train,loss], feed_dict={X:train_x_data_norm,

                                                      T:train_t_data_onehot})

    

    if step % 300 == 0:

        print('loss : {}'.format(loss_val))

 

# Evaluation(accuracy를 측정해보아요!)

 

predict = tf.argmax(H,1)  # 숫자 1은 axis=1의 의미.

correct = tf.equal(predict, tf.argmax(T,1))

acc = tf.reduce_mean(tf.cast(correct, dtype=tf.float32))

 

result = sess.run(acc, feed_dict={X:test_x_data_norm,

                                  T:test_t_data_onehot})

 

print('Tensorflow 1.15의 정확도(multinomial) : {}'.format(result))

 

# Tensorflow 1.15의 정확도(multinomial) : 0.8509523868560791        

 

# 4. tensorflow 2.6로 구현(multinomial classification)

 

import tensorflow as tf

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Flatten, Dense

from tensorflow.keras.optimizers import Adam

 

keras_model = Sequential()

 

keras_model.add(Flatten(input_shape=(train_x_data_norm.shape[1],)))

keras_model.add(Dense(10, activation='softmax'))

 

keras_model.compile(optimizer=Adam(learning_rate=1e-1),

                    loss='sparse_categorical_crossentropy',

                    metrics=['accuracy'])

 

histroy = keras_model.fit(train_x_data_norm,

                          train_t_data,

                          epochs=100,

                          verbose=0,

                          validation_split=0.2,

                          batch_size=100)

 

result = keras_model.evaluate(test_x_data_norm,test_t_data)

 

print('Tensorflow 2.6의 정확도(multinomial) : {}'.format(result))

 

# Tensorflow 2.6의 정확도(multinomial) : 0.8784920573234558

 

# 5. tensorflow 1.15로 구현(multilayer neural network을 이용한 multinomial classification)

 

# label의 class들에 대해 one-hot encoding처리를 해야 해요!

 

# - hiddent layer가 포함되요! 3개의 hidden layer를 이용

 

# - weight의 초기값을 random이 아닌 2가지 기법 중 하나를 이용

# 많은 w초기화 기법이 있지만 많이 사용하는 2개를 사용 , 현재까지도 많이 연구중

#   => Xavier[자비어] 초기화, He's 초기화(Xavier 초기화의 개량버전)

#      weight의 값을 랜덤으로 하지 않고 계산하는 기존에 사용한 복잡한 수식이 존재했었어요.

#      그래서 2가지 알고리즘이 나왔는데 그게 Xavier 초기화, He's 초기화

#      입력의 개수와 출력의 개수를 기반으로 적절한 수식을 이용해서 초기값을 지정.

 

#       W = np.random.randn(input의 개수, output의 개수) / np.sqrt[루트](input의 개수)    Xavier

#       W = np.random.randn(input의 개수, output의 개수) / np.sqrt(input의 개수 / 2)     he's

 

# - activation function을 기존의 sigmoid에서 relu(Rectified Linear Unit) [0이상] 변경

                                                           [banishing gradient 없애기위해]

# anaconda prompt => conda install tensorflow-estimator==1.15.1

 

import tensorflow as tf

 

sess = tf.Session()

train_t_data_onehot = sess.run(tf.one_hot(train_t_data, depth=10))

test_t_data_onehot = sess.run(tf.one_hot(test_t_data, depth=10))

 

# placeholder

X = tf.placeholder(shape=[None,784], dtype=tf.float32)

T = tf.placeholder(shape=[None,10], dtype=tf.float32)

 

# Weight & bias

W2 = tf.get_variable('weight2', shape=[784,512],

                             initializer=tf.contrib.layers.variance_scaling_initializer())

b2 = tf.Variable(tf.random.normal([512]))

layer2 = tf.nn.relu(tf.matmul(X,W2) + b2)

 

W3 = tf.get_variable('weight3', shape=[512,256],

                    initializer=tf.contrib.layers.variance_scaling_initializer())

b3 = tf.Variable(tf.random.normal([256]))

layer3 = tf.nn.relu(tf.matmul(layer2,W3) + b3)

 

W4 = tf.get_variable('weight4', shape=[256,128],

                    initializer=tf.contrib.layers.variance_scaling_initializer())

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

layer4 = tf.nn.relu(tf.matmul(layer3,W4) + b4)

 

W5 = tf.get_variable('weight5', shape=[128,10],

                    initializer=tf.contrib.layers.variance_scaling_initializer())

b5 = tf.Variable(tf.random.normal([10]))



# hypothesis

logit = tf.matmul(layer4,W5) + b5

H = tf.nn.softmax(logit)

 

# loss

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())

 

# batch를 이용해서 training data를 분할해서 학습을 진행(메모리문제때문에...)해야 해요!

# 여기서는 batch처리를 생략해서 구현할께요!

 

# 학습을 진행

for step in range(3000):

    

    tmp, loss_val = sess.run([train,loss], feed_dict={X:train_x_data_norm,

                                                      T:train_t_data_onehot})

    

    if step % 300 == 0:

        print('loss : {}'.format(loss_val))

        

# Evaluation(accuracy를 측정해보아요!)

 

predict = tf.argmax(H,1)  # 숫자 1은 axis=1의 의미.

correct = tf.equal(predict, tf.argmax(T,1))

acc = tf.reduce_mean(tf.cast(correct, dtype=tf.float32))

 

result = sess.run(acc, feed_dict={X:test_x_data_norm,

                                  T:test_t_data_onehot})

 

print('Tensorflow 1.15의 정확도(neural network multinomial) : {}'.format(result))

 

# Tensorflow 1.15의 정확도(neural network multinomial) : 0.9688095450401306    



# anaconda prompt => conda install tensorflow-estimator==1.15.1

  2.0으로 넘어가면서 위에껄 안깔면 오류가 난다

 

# 6. tensorflow 2.6로 구현(multilayer neural network을 이용한 multinomial classification)

import tensorflow as tf

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Flatten, Dense

from tensorflow.keras.optimizers import Adam

 

keras_model = Sequential()

 

keras_model.add(Flatten(input_shape=(train_x_data_norm.shape[1],)))

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 초기화는 알아서해줌 

keras_model.add(Dense(512, activation='relu'))

keras_model.add(Dense(256, activation='relu'))

keras_model.add(Dense(128, activation='relu'))

 

keras_model.add(Dense(10, activation='softmax'))

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

keras_model.compile(optimizer=Adam(learning_rate=1e-4),

                    loss='sparse_categorical_crossentropy',

                    metrics=['accuracy'])

 

histroy = keras_model.fit(train_x_data_norm,

                          train_t_data,

                          epochs=100,

                          verbose=1,

                          validation_split=0.2,

                          batch_size=100)

 

result = keras_model.evaluate(test_x_data_norm,test_t_data)

 

print('Tensorflow 2.6의 정확도(multilayer neural network) : {}'.format(result))

 

# Tensorflow 2.6의 정확도(multilayer neural network) : 0.9721428751945496

'ai > Deep Learning' 카테고리의 다른 글

이미지 기본 handling 코드 (CNN기초 ver)  (0) 2021.09.17
CNN 기초, 이미지 처리  (0) 2021.09.17
Deep Learning 역사  (0) 2021.09.16
MNIST Multi layer ver 코드  (0) 2021.09.16
Multi layer (NN기초) 코드  (0) 2021.09.15