강의 내용 띄엄띄엄, 이해가 가는 부분만 정리하고 있는 문서인데, 언제 한번 날을 잡고 몇날몇일 동안 총정리를 해야할 것 같다. 문제는 시간인데, 갑자기 해야할 일들이 엄청나게 늘어나서 이걸 어찌해야할지 모르겠다. 짬짬이 시간에 계속 해야지...
케라스 사용해서 뭐라도 하나 만들어보기
keras.io 를 들어가 보자
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()
한 주 공부한 것들 요약 정리
- 딥러닝이 발전한 이유 : 데이터양 증가, 하드웨어 발전, 알고리즘 발전
- NN의 종류 : 좁은 의미의 DNN, 이미지 처리의 CNN, 시계열 데이터의 RNN
- Deep learning 활성화 함수의 종류
- Deep learning Optimizer의 종류 : GD, SGD, momentum, Ada~, Nadam, RMSProp
- VGGNet 의 구조 (CNN) : Convolution, Pooling, Fully conneted 층
- Keras RNN 구현체 중에서 가장 많이 사용하는건 LSTM (Long Short Term Memory) 이 외에도 Simple RNN과 GIU도 있다.
- 결측치 Missing Value 처리 방법
- feature들 사이에서 Noise 빼고 신호만 뽑기 : 특성 추출(feature selection)
- Overfitting을 막는 방법: Dropout과 정규화, Batch Normalization
- Underfitting 을 막는 방법 : 더 좋은 특성 제공, Parameter가 더 많은 모델 제공 , 제약 C 내리기
- 인공지능, 머신러닝, 딥러닝 사이의 공통점과 차이점
- 데이터 전처리 일련의 과정
- CNN Architecture 구조 설명
'Others > 한여름 머신러닝' 카테고리의 다른 글
8월 24일의 머신러닝 (5) | 2021.01.25 |
---|---|
8월 20일의 머신러닝 (0) | 2021.01.25 |
8월 19일의 머신러닝 (0) | 2021.01.25 |
댓글