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

8월 21일의 머신러닝

by ju_nope 2021. 1. 25.

강의 내용 띄엄띄엄, 이해가 가는 부분만 정리하고 있는 문서인데, 언제 한번 날을 잡고 몇날몇일 동안 총정리를 해야할 것 같다. 문제는 시간인데, 갑자기 해야할 일들이 엄청나게 늘어나서 이걸 어찌해야할지 모르겠다. 짬짬이 시간에 계속 해야지...

케라스 사용해서 뭐라도 하나 만들어보기

keras.io 를 들어가 보자

고수준 신경망 API ... 가슴이 웅장해진다

Keras를 활용한 mnist 예제

자 그러면 첫번째 예제 시작 (임포트는 알아서)

Train, Validation, Test 3개 그룹으로 나누어 주기위해 우선 full 데이터를 만들어 준다.

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

shape 과 dtype으로 X_train_full의 데이터 구조를 확인해본다.

이후 Valid 와 Train set 을 나누어주는데, 관습적으로 5000을 기준으로 나눠준다. Y 값도 마찬가지로 진행한다.

그리고 255.0으로 X 값을 나눠주는 이유는 Scaling 인데, RGB 값이 0~255라서 MinMax Scaling 해주는것이다. y 는 해주지 않는다.

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

일단 모델 설계에 앞서 데이터 구성을 살펴보도록 하자. 시각화를 해주면 좋다.

n_rows = 4
n_cols = 10
plt.figure(figsize=(n_cols*1.2, n_rows*1.2))
for row in range(n_rows): 
    for col in range(n_cols):
        index = n_cols*row + col
        plt.subplot(n_rows, n_cols, index+1)
        plt.imshow(X_train[index], cmap='binary', interpolation='nearest')
        plt.axis('off')
        plt.title(y_train[index], fontsize=12)
plt.subplots_adjust(wspace=0.2, hspace=0.5)
plt.show()

반복문을 통해 4행 10열의 배열을 만들어서 X_train 과 y_train의 각 데이터를 순서맞게 표시해주는 코드이다. 출력결과는 아래 사진과 같다.

학습되는 과정을 저장하는 코드를 짜보자.

K = keras.backend
#  callback 상속 재정의
class ExponentialLearningRate(keras.callbacks.Callback):
    def __init__(self, factor):
        self.factor = factor
        self.rates = []
        self.losses = []
    def on_batch_end(self, batch, logs):
        self.rates.append(K.get_value(self.model.optimizer.lr)) # learning rate 얻어서 rates 추가
        self.losses.append(logs['loss'])
        K.set_value(self.model.optimizer.lr, self.model.optimizer.lr*self.factor)

(설명 필요)

그럼 모델 설계로 들어간다. 인풋은 28*28 이미지셋이다.

keras.backend.clear_session()
np.random.seed(42)
tf.random.set_seed(42)
###
model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28,28]), #28*28 을 784로 펴준다
    keras.layers.Dense(300, activation='relu'),
    keras.layers.Dense(100, activation = 'relu'),
    keras.layers.Dense(10, activation='softmax')
])

compile에서 비용 함수를 정해준다. 다중분류 라서 액티베이션을 softmax 써줬으니 categorical_crossentropy 인데,

요 녀석은 y 값을 우선 one hot encoding 해야해서 귀찮다. 그래서 sparse~~ 를 사용해주겠다.

그리고 기준도 정확도이다. 옵티마이저는 SGD를 사용해주겠다.

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

학습 시작

expon_lr = ExponentialLearningRate(factor=1.005)
expon_lr = ExponentialLearningRate(factor=1.005)hist = model.fit(X_train, y_train, epochs=1, validation_data=(X_valid,y_valid),
                callbacks=[expon_lr])

결과

accuracy: 0.5799 - val_loss: nan - val_accuracy: 0.0958

학습 실패다. 이런 경우는 보통 결측히가 있어서 에러가 나는거다.

plt.plot(expon_lr.rates, expon_lr.losses)
plt.gca().set_xscale('log')
plt.hlines(min(expon_lr.losses), min(expon_lr.rates), max(expon_lr.rates))
plt.axis([min(expon_lr.rates),max(expon_lr.rates), 0, expon_lr.losses[0]])
plt.xlabel("Learning rate")
plt.ylabel("Loss")
plt.show()

학습률 스케쥴링

pixel_means 와 pixel_stds로 normalized scaling 된 데이터들을 사용한다.

optimizer = keras.optimizers.SGD(lr=0.01, decay=1e-4)

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

dacay 의미 : 처음에는 듬성듬성 가고, 갈수록 decay 부식되듯이 점점 간격이 줄어드는것. (learning rate)

model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

%%time
n_epochs = 25
hist = model.fit(X_train_scaled, y_train, epochs=n_epochs, 
                validation_data=(X_valid_scaled, y_valid))

#accuracy: 0.0990 - val_loss: nan - val_accuracy: 0.0958
#Wall time: 1min 6s

시각화 해보자

learning_rate = 0.01
decay = 1e-4  # 0.0001
batch_size = 32
n_steps_per_epoch = len(X_train) // batch_size  # 55000 // 32 ==> 1718
epochs = np.arange(n_epochs)  # n_epochs=25, np.arange ==> [0, ..., 24]
lrs = learning_rate / (1 + decay * epochs * n_steps_per_epoch)
print( lrs )

plt.plot(epochs, lrs, "o-")
plt.axis([0, n_epochs - 1, 0, 0.01])
plt.xlabel("Epoch")
plt.ylabel("Learning Rate")
plt.title("Power Scheduling", fontsize=14)
plt.grid(True)
plt.show()

지수 기반 스케쥴링

def exponential_decay_fn(epoch):
    return 0.01*0.1**(epoch/20)

def exponential_decay(lr0, s):
    def exponential_decay_fn(epoch):
        return lr0*0.01**(epoch/s)
    return exponential_decay_fn

이렇게 이렇게

exponential_decay_fn = exponential_decay(lr0=0.01, s=20)

model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28,28]),
    keras.layers.Dense(300, activation='selu', kernel_initializer='lecun_normal'),
    keras.layers.Dense(100, activation='selu', kernel_initializer='lecun_normal'),
    keras.layers.Dense(10, activation='softmax')
])
model.compile(loss="sparse_categorical_crossentropy", optimizer="nadam", metrics=['accuracy'])
n_epochs =25

러닝 레이트 스케쥴러

lr_scheduler = keras.callbacks.LearningRateScheduler(exponential_decay_fn)

모델 피팅

%%time
hist = model.fit(X_train_scaled, y_train, 
                 epochs=n_epochs, validation_data=(X_valid_scaled,y_valid), callbacks=[lr_scheduler])
#accuracy: 0.0990 - val_loss: nan - val_accuracy: 0.0958

시각화 해보자

plt.plot(hist.epoch, hist.history["lr"], "o-")
plt.axis([0, n_epochs-1, 0, 0.011])
plt.xlabel("Epoch")
plt.ylabel("Learning Rate")
plt.title("Exponential Scheduling", fontsize=14)
plt.grid(True)
plt.show()

한 주 공부한 것들 요약 정리

  1. 딥러닝이 발전한 이유 : 데이터양 증가, 하드웨어 발전, 알고리즘 발전
  1. NN의 종류 : 좁은 의미의 DNN, 이미지 처리의 CNN, 시계열 데이터의 RNN
  1. Deep learning 활성화 함수의 종류
  1. Deep learning Optimizer의 종류 : GD, SGD, momentum, Ada~, Nadam, RMSProp
  1. VGGNet 의 구조 (CNN) : Convolution, Pooling, Fully conneted 층
  1. Keras RNN 구현체 중에서 가장 많이 사용하는건 LSTM (Long Short Term Memory) 이 외에도 Simple RNN과 GIU도 있다.
  1. 결측치 Missing Value 처리 방법
  1. feature들 사이에서 Noise 빼고 신호만 뽑기 : 특성 추출(feature selection)
  1. Overfitting을 막는 방법: Dropout과 정규화, Batch Normalization
  1. Underfitting 을 막는 방법 : 더 좋은 특성 제공, Parameter가 더 많은 모델 제공 , 제약 C 내리기
  1. 인공지능, 머신러닝, 딥러닝 사이의 공통점과 차이점
  1. 데이터 전처리 일련의 과정
  1. CNN Architecture 구조 설명

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

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

댓글