본문 바로가기
Others/한여름 머신러닝

8월 20일의 머신러닝

by ju_nope 2021. 1. 25.

기분 좋은 8월 20일 공부 시작. 놓친 수업도 정말 많고, 정신 빼놓고 들은 적도 많다. 정리 언제 할까. 강사님은 본인 타자속도가 빠르다는걸 모르시나보다 적고 바로 페이지를 넘겨버리신다.

Tensor Flow2

파라미터의 개수가 많을 수록 연산량이 많다. 파라미터 수 N = W*X+b와 같다.

아래 명령어를 통해서 모델의 구조를 그림으로 표현해 보자

keras.utils.plot_model(model, "my_fashion_mnist_model.png", show_shapes=True)

훨씬 보기 편-안 하다.

model.layer 의 인덱스는 0,1,2,3 이다. 순서대로 이름은 flatten, dense, dense_1,dense_2 이다.

함수형 API

hyper_parameter tuning

우리가 지금까지 하이퍼 파라미터 튜닝을 해줄땐 SVC나 Grid Search CV를 사용해주었다. 우리가 이번에 해줄 것은 Randomized Search CV 이다. RandomCV의 특징은, Grid Search CV을 사용하면서, 제한된 횟수로 무작위 케이스 N개를 확인하고, 이 중 최고의 케이스를 뽑아주는 것이란 거다.

TensorFlow 2 install

TF2&Keras에서 Leaky ReLU, P ReLU, SeLU 사용해보기

수업 내용을 한참 못따라가다가 새로 시작한다길래 노트 시작

Leaky ReLU 사용해보기

이제 아래 import와 초기화는 익숙하다.

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import keras

keras.backend.clear_session()
np.random.seed(42)
tf.random.set_seed(42)

초기화를 시켜준다. keras내장 초기화 함수 he_normal을 사용해준다. 초기화는 중요하니까...

keras.layers.Dens(10, activation='relu', kernel_initializer='he_normal')

Fashion mnist 데이터를 받아준다.

(X_train_full, y_train_full), (X_test, y_test) = keras.datasets.fashion_mnist.load_data()

Train, Valid, Test 용으로 64:16:20 의 비율로 쪼개준다.

X_train_full = X_train_full/255.0
X_test = X_test / 255.0
X_valid, X_train = X_train_full[:5000], X_train_full[5000:]
y_valid, y_train = y_train_full[:5000], y_train_full[5000:]

모델을 만들어주자! 이번에는 Activation 을 ReLU 말고 LeakyReLU()를 써줄 수 있다. 참고로 1% 정도 성능이 부족할 때 해볼만한 것들이, 초기화나 액티베이션을 바꿔주는 것들이다.

model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28,28]),
    keras.layers.Dense(300, kernel_initializer="he_normal"),
    keras.layers.LeakyReLU(),
#   activation='leakyrelu'
    keras.layers.Dense(100, kernel_initializer="he_normal"),
    keras.layers.LeakyReLU(),
#   activation='leakyrelu'
    keras.layers.Dense(10,activation='softmax')
])

우리는 예전에 Dense의 argument인 activation = 으로 'relu'를 지정해줬는데, 그건 사실 helper에 가까운 것이었다. 쉽게 말해 자주쓰는 몇가지 함수들만 그렇게 쓸 수 있는거고, 리키 렐루 같은 마이너한 녀석들은 위에 코드처럼 따로 적용해주어야 한다. 그냥 그렇다고 .

모델을 만들어 줬으면 compile도 시켜준다.

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

참고로 sparse_categorical_crossentropy는 자동으로 y 값을 원핫 인코딩 해주는 것이다. 원 핫 인코딩이 안되어있다면 sparse를 빼주면 된다. SGD 라는 랜덤한 수를 발생시켜 띄엄띄엄 오차를 줄여나가는 함수를 옵티마이저로 쓰겠다. 원래는 경사하강법. 분류 문제이므로 metrics='정확도' 지정은 반자동적으로 한다.

컴파일 했으면 학습데이터로 학습 시작

hist = model.fit(X_train, y_train, epochs=30, validation_data=(X_valid,y_valid))

Leaky Relu를 사용해서 fitting한 결과

 accuracy: 0.8594 - val_loss: 0.4039 - val_accuracy: 0.8606

P ReLU 사용해보기

Leaky ReLU 말고 P ReLU로도 해보았다. 컴파일이나 피팅은 그대로 한다.

P ReLU를 사용해서 fitting 한 결과

accuracy: 0.8611 - val_loss: 0.3997 - val_accuracy: 0.8604

Selu 사용해보기

우선 모델을 만들어준다. activation을 Selu로 지정한다.

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
model.add(keras.layers.Dense(300, activation='selu', kernel_initializer='lecun_normal'))
for layer in range(99):
    model.add(keras.layers.Dense(100,activation='selu',
                                 kernel_initializer='lecun_normal'))
model.add(keras.layers.Dense(10, activation='softmax'))

컴파일도 그대로 해준다.

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

  • 수제 Standard Scaling 해보기!

평균은 0으로 표준편차는 1로 만들어주기! 고등학교에서 배운 수학지식을 끌어모아보자.

pixel_means = X_train.mean(axis=0,keepdims=True)
pixel_stds = X_train.std(axis=0, keepdims=True)

X_train_scaled = (X_train - pixel_means)/ pixel_stds # 평빼고 표준편차 나누기

그리고, Validation 용 데이터와 Testing 용 데이터도 스케일러를 씌워준다. 여기서 중요한 점은 train 데이터로 fitting 한 스케일러를 써야한다는 점인데, 이게 왜냐하면 모든 데이터의 scale을 같게 해주기 위함이다.

만약 Validation 과 test 용 scaler를 따로 만들어주면, 그들 사이의 scale이 다를 수 밖에 없기 때문이다.

X_valid_scaled = (X_valid - pixel_means) / pixel_stds
X_test_scaled = (X_test - pixel_means) / pixel_stds

그리고 훈련시작

hist = model.fit(X_train_scaled, y_train, epochs=5, validation_data=(X_valid,y_valid))

fitting 결과

accuracy: 0.8278 - val_loss: 1.3958 - val_accuracy: 0.5058

정확도가 좀 낮네...

배치 정규화

이미지 출처 : https://excelsior-cjh.tistory.com/178

Batch는 한번에 처리하는 이미지 집합이라고 배웠다. 배치 정규화는 이 각각의 집합을 각각 정규화해주는 작업을 말한다.

영어로는 Batch Normalization 이라고 한다.

배치 정규화는 Drop out 과 더불어 학습의 over fitting 을 방지하는 방법 중 하나이다.

모델을 만들어줄때, Batch normalize를 진행한다.

아, 참고로 어쩔때는 Sequential([ ]) 안에 코드를 적는 방식으로 모델을 만들고, 다른때는 model.add() 를 통한 방식으로 모델을 만드는데, 이는 큰 상관이 없다. 둘은 완벽하게 같고, 첫번째 방식은 짧은 코드를 작성할때 편리하여 사용된다.

모델을 만들어준다.

model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28,28]),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(300, activation='relu'),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(100, activation='relu'),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(10, activation='softmax')
])

BatchNormalization() 를 이용해 정의해준다.

컴파일과 훈련을 진행한다.

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

hist = model.fit(X_train, y_train, epochs=10, validation_data=(X_valid,y_valid))

# 훈련결과 accuracy: 0.8627 - val_loss: 0.3603 - val_accuracy: 0.8760

끝.

2020-08-20 김준호

'Others > 한여름 머신러닝' 카테고리의 다른 글

8월 24일의 머신러닝  (5) 2021.01.25
8월 21일의 머신러닝  (1) 2021.01.25
8월 19일의 머신러닝  (0) 2021.01.25

댓글