반응형

<참조> 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))

 

<이상>

 

반응형

+ Recent posts