<참조> Getting started with the Keras Sequential model
케라스 순차(Sequential) 모델
Sequential 모델은 레이어들의 선형 스택(a linear stack of layers)
생성자에 레이어 객체 목록을 전달하여 Sequential 모델을 만들 수 있다.
Sequential 모듈은 keras.models에서 제공한다.
Dense, Activation은 keras.layers에서 제공한다.
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential([
Dense(32, input_shape=(784,)), # 클래스32
Activation('relu'), # 선형 함수
Dense(10), # 클래스 10
Activation('softmax'),
])
또한 add() 메서드로 계층을 간단히 추가할 수 있다.
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
model.add(Dense(10, input_dim=32)) #
model.add(Activation('softmax')) #
--------------------------------------------------------------------------------
입력 자료 모양(구조) 지정하기
모델은 처리할 입력 모양을 알아야 한다. Sequential 모델의 첫 계층은 입력 모양에 대한 정보가 필요하다. 전달 방법은 여러가지이다.
첫 계층에서 input_shape 인수를 이용하여 전달한다. 이것은 튜플(정수들의 튜플이나 None 시작(어떤 양수)). input_shape에 배치 크기는 포함하지 않는다.
일부 2D 계층(Dense처럼)은 입력 모양을 input_dim으로 설정할 수 있다. 그리고 일부 3D 임시 계층은 input_dim 및 input_length를 지원한다.
입력에 고정된 배치(batch) 크기를 지정하려면(stateful recurrent networks에서 유용), 계층에 batch_size 인수를 사용한다. 만약 batch_size=32 및 input_shape=(6, 8) 인수를 계층에 전달하면, 모든 입력 배치는 배치 모양 (32, 6, 8)을 갖는다
다음 두 코드는 같다.
model = Sequential()
model.add(Dense(32, input_shape=(784,))) # 튜플 값 (784,)
model = Sequential()
model.add(Dense(32, input_dim=784))
--------------------------------------------------------------------------------
모델 엮기 (Compilation)
모델을 학습하기 전에 compile 메서드를 이용하여 학습 절차를 구성해야 한다. 이 때 세가지 인수를 지정한다.
최적화기: 이것은 존재하는 최적화기(예를 들어 rmsprop 또는 adagrad)의 이름 문자열이거나 Optimizer의 객체 이름을 지정한다. 참조: optimizers.
손실 함수: 이것은 모델이 최소화를 하게 도와주는 객체이다. 존재하는 손실 함수(예를 들어, categorical_crossentropy 또는 mse) 이름 문자열이거니 객체 함수 이름을 지정한다. 참조: losses.
측정 기준 목록: 어떤 분류 문제에서는 metrics=['accuracy']처럼 설정한다. 존재하는 측정 기준의 이름 문자열이거나 사용자 측정 함수를 지정한다. 참조: metrics.
# 다중 분류 문제
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 이진(두가지) 분류 문제
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 평균 제곱 오차 회귀 문제
model.compile(optimizer='rmsprop',
loss='mse')
# 사용자 맞춤 방식
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
--------------------------------------------------------------------------------
훈련 학습
케라스 모델은 입력 자료와 레이블들의 Numpy 배열을 이용하여 훈련한다. 모델 훈련은 일반적으로 fit 함수를 이용한다.
# 두 클래스(이진 분류)를 가진 단일 입력 모델
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 임시 자료 생성
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
# 모델 훈련 (32개 샘플 단위로 반복)
model.fit(data, labels, epochs=10, batch_size=32)
# 10개 분류를 가진 단일 입력 모델(categorical 분류)
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 임시 자료 생성
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(10, size=(1000, 1))
# 레이블을 원핫 인코딩 분류
one_hot_labels = keras.utils.to_categorical(labels, num_classes=10)
# 모델 훈련 (32개 샘플 단위로 처리하면서 전체 자료 10번 반복 수행
model.fit(data, one_hot_labels, epochs=10, batch_size=32)
--------------------------------------------------------------------------------
예제
examples folder에 실제 데이터셋 예제 모델이 있다.
-CIFAR10 작은 이미지 분류: Convolutional Neural Network (CNN) with realtime data augmentation
-IMDB 영화 리뷰 감정 분류: LSTM over sequences of words
-로이터 뉴스(Reuters newswires) 주제 분류: Multilayer Perceptron (MLP)
-MNIST 손글씨 숫자 분류: MLP & CNN
-문자 수준 텍스트 생성(LSTM 방식)
...등등
다중 분류 softmax를 위한 MLP (다층 퍼세트론)
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
# 임시 자료 생성
import numpy as np
x_train = np.random.random((1000, 20))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10)
x_test = np.random.random((100, 20))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
model = Sequential()
# Dense(64)는 64개 숨은 유닛을 가진 전체 연결 계층이다.
# 첫 계층에서, 예상 입력 데이터 형태를 지정해야 한다.
# 20차원 벡터
model.add(Dense(64, activation='relu', input_dim=20))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
model.fit(x_train, y_train,
epochs=20,
batch_size=128)
score = model.evaluate(x_test, y_test, batch_size=128)
print(score)
이진 분류를 위한 MLP
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
# 임시 자료 생성
x_train = np.random.random((1000, 20))
y_train = np.random.randint(2, size=(1000, 1))
x_test = np.random.random((100, 20))
y_test = np.random.randint(2, size=(100, 1))
model = Sequential()
model.add(Dense(64, input_dim=20, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
model.fit(x_train, y_train,
epochs=20,
batch_size=128)
score = model.evaluate(x_test, y_test, batch_size=128)
print(score)
VGG와 같은 convnet
import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD
# 임시 자료 생성
x_train = np.random.random((100, 100, 100, 3))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
x_test = np.random.random((20, 100, 100, 3))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(20, 1)), num_classes=10)
model = Sequential()
# input: 100x100 이미지(3 채널) -> (100, 100, 3) 텐서들
# 각 3x3 크기의 32 합성곱 필터(convolution filters) 적용
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)
model.fit(x_train, y_train, batch_size=32, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=32)
LSTM과 함께하는 순차 분류(Sequence classification)
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import LSTM
max_features = 1024
model = Sequential()
model.add(Embedding(max_features, output_dim=256))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=16, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=16)
print(score)
1D 합성곱으로 순차 분류
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import Conv1D, GlobalAveragePooling1D, MaxPooling1D
seq_length = 64
model = Sequential()
model.add(Conv1D(64, 3, activation='relu', input_shape=(seq_length, 100)))
model.add(Conv1D(64, 3, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Conv1D(128, 3, activation='relu'))
model.add(Conv1D(128, 3, activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=16, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=16)
순차 분류를 위한 쌓인(stacked) LSTM
3개 LSTM 계층을 쌓은 구조이며 모델이 더 높은 수준으로 학습할 수 있게 해준다. 상위 두 LSTM 계층은 전체 출력을 돌려주지만, 끝 단계는 정리된 최종 결과(단일 벡터 같은 것)를 돌려준다.
from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np
data_dim = 16
timesteps = 8
num_classes = 10
# 입력 자료 형태: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
input_shape=(timesteps, data_dim))) # 32차원 벡터 시퀀스 반환
model.add(LSTM(32, return_sequences=True)) # 32차원 벡터 시퀀스 반환
model.add(LSTM(32)) # 32차원 배열 반환
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
# 임시 자료 생성
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))
# 임시 검증 자료 생성
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))
model.fit(x_train, y_train,
batch_size=64, epochs=5,
validation_data=(x_val, y_val))
쌓인 LSTM 모델, rendered "stateful"
상태 회귀 모델은 샘플 배치를 처리하고 얻은 내부 상태(메모리)를 다음 배치 샘플의 초기 상태에 재사용된다. 계산 복잡성을 관리하면서 긴 시퀀스를 처리할 수 있다. 참조: stateful RNNs FAQ.
from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np
data_dim = 16
timesteps = 8
num_classes = 10
batch_size = 32
# 입력 배치 작업 형테 (batch_size, timesteps, data_dim)
# 참고: 네트워크가 stateful 상태이므로 전제 배치 입력 형태를 제공해야 한다.
# 배치 k 작업에서 인덱스 i 샘플은 배치 k-1의 인덱스 i 후속 조치이다.
model = Sequential()
model.add(LSTM(32, return_sequences=True, stateful=True,
batch_input_shape=(batch_size, timesteps, data_dim)))
model.add(LSTM(32, return_sequences=True, stateful=True))
model.add(LSTM(32, stateful=True))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
# 임시 훈련 자료 생성
x_train = np.random.random((batch_size * 10, timesteps, data_dim))
y_train = np.random.random((batch_size * 10, num_classes))
# 임시 검증 자료 생성
x_val = np.random.random((batch_size * 3, timesteps, data_dim))
y_val = np.random.random((batch_size * 3, num_classes))
model.fit(x_train, y_train,
batch_size=batch_size, epochs=5, shuffle=False,
validation_data=(x_val, y_val))
<이상>
'AI 머신러닝' 카테고리의 다른 글
구글, 머신러닝으로 일기예보 강우 예측 연구성과 공개 (0) | 2020.01.22 |
---|---|
머신러닝 관련 용어 (0) | 2020.01.21 |
케라스, numpy 랜덤 기능으로 임시 자료 생성하기 (0) | 2020.01.17 |
심층 신경망(deep neural networks) API, "케라스" 기사 정리 (0) | 2020.01.16 |
케라스 categorical_crossentropy, sparse_categorical_crossentropy (0) | 2020.01.16 |