Getting started with the Keras Sequential model - Examples
翻譯原文:https://keras.io/getting-started/sequential-model-guide/#examples
此鏈接examples folder將會提供一些應用例子,在這些例子中涉及到如下的真實數據集dataset:
· CIPAR10 少量圖像分類:CNN模型
· IMDB 電影評論情感分類:LSTM模型
· 路透社新聞專線主題分類:MLP多層感知器模型
· MNIST 手寫數字分類:MLP & CNN
· 字符級的文本生成:LSTM
等等
多層感知器MLP用於多分類任務
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
# 產生numpy數據
import numpy as np
x_train = np.random.random((1000, 20))
y_train = np.random.randint(10, size=(1000, 1))
y_one_hot_train = keras.utils.to_categorical(y_train, num_classes=10)
x_test = np.random.random((100, 20))
y_test = np.random.randint(10, size=(100, 1))
y_one_hot_test = keras.utils.to_categorical(y_test, num_classes=10)
# 構建全連接網絡模型
model = Sequential()
model.add(Dense(64, input_shape=(20, ), activation='relu'))
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, momentum=0.9, decay=1e-6, nesterov=True)
model.compile(optimizer=sgd,
loss=keras.losses.categorical_crossentropy,
metrics=['accuracy'])
# 訓練模型
model.fit(x_train, y_one_hot_train, epochs=20, batch_size=128)
# 驗證模型
test_score = model.evaluate(x_test, y_one_hot_test, batch_size=128)
print("test_acc: ", test_score[1])
MLP用於二分類任務
import numpy as np
from keras.layers import Dense, Dropout
from keras.models import Sequential
# 產生numpy數據
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(optimizer=keras.optimizers.Adam(),
loss=keras.losses.binary_crossentropy,
metrics=['accuracy'])
# 訓練模型
model.fit(x_train, y_train, epochs=20, batch_size=128)
# 驗證模型
(test_loss, test_acc) = model.evaluate(x_test, y_test)
print('test_acc: ', test_acc)
類似於VGG的卷積網絡
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 Adam
# 產生numpy數據
x_train = np.random.random((100, 100, 100, 3))
y_train = np.random.randint(10, size=(100, 1))
y_one_hot_train = keras.utils.to_categorical(y_train, num_classes=10)
x_test = np.random.random((20, 100, 100, 3))
y_test = np.random.randint(10, size=(20, 1))
y_one_hot_test = keras.utils.to_categorical(y_test, num_classes=10)
# 構建模型
model = Sequential()
model.add(Conv2D(32, (3,3), input_shape=(100, 100, 3), activation='relu'))
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'))
adam = Adam(lr=0.01, decay=1e-6)
model.compile(optimizer=adam,
loss=keras.losses.categorical_crossentropy,
metrics=['accuracy'])
model.fit(x_train, y_one_hot_train, epochs=10, batch_size=32)
(test_loss, test_acc) = model.evaluate(x_test, y_one_hot_test)
print('test_acc: ', test_acc)
LSTM用於序列分類: many to one
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding, LSTM
from keras.engine.input_layer import Input
# 詞嵌入的詞彙數
vocab_len = 1024
# 詞嵌入的特徵數
emb_dim = 256
# 創建numpy數據 - 模擬文本情感識別數據
max_len = 10 #最長句子長度
x_train = np.random.randint(1000, size=(100, max_len))
y_train = np.random.randint(2, size=(100, 1))
x_test = np.random.randint(1000, size=(10, max_len))
y_test = np.random.randint(2, size=(10, 1))
# 構建模型
model = Sequential()
model.add(Embedding(vocab_len, emb_dim, input_length=max_len))
model.add(LSTM(128))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
# 編譯模型
model.compile(optimizer=keras.optimizers.Adam(),
loss=keras.losses.binary_crossentropy,
metrics=['accuracy'])
# 訓練模型
model.fit(x_train, y_train, batch_size=16, epochs=10)
# 驗證模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(test_acc)
# 預測模型
x_pred = np.random.randint(1000, size=(1, max_len))
y_pred = model.predict(x_pred)
if y_pred >= 0.5:
y_pred = 1
else:
y_pred = 0
print('y_pred: ', y_pred)
不用embedding
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding, LSTM
from keras.engine.input_layer import Input
# 序列長度
seq_length = 64
# 通道數
n_channels = 100
# 創造numpy序列數據
x_train = np.random.random((100, seq_length, n_channels))
y_train = np.random.randint(2, size=(100, 1))
x_test = np.random.random((10, seq_length, n_channels))
y_test = np.random.randint(2, size=(10, 1))
# 構建模型
model = Sequential()
model.add(LSTM(256, input_shape=(seq_length, n_channels)))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
# 編譯模型
model.compile(optimizer=keras.optimizers.Adam(),
loss=keras.losses.binary_crossentropy,
metrics=['accuracy'])
# 訓練模型
model.fit(x_train, y_train, batch_size=16, epochs=10)
# 驗證模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(test_acc)
# 預測模型
x_pred = x_train = np.random.random((1, seq_length, n_channels))
y_pred = model.predict(x_pred)
if y_pred >= 0.5:
y_pred = 1
else:
y_pred = 0
print('y_pred: ', y_pred)
1D卷積網絡用於序列分類:many to one
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
# 通道數
n_channels = 100
# 創造numpy序列數據
x_train = np.random.random((100, seq_length, n_channels))
y_train = np.random.randint(2, size=(100, 1))
x_test = np.random.random((10, seq_length, n_channels))
y_test = np.random.randint(2, size=(10, 1))
# 構建模型
model = Sequential()
model.add(Conv1D(64, 3, activation='relu', input_shape=(seq_length, n_channels)))
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(optimizer=keras.optimizers.Adam(),
loss=keras.losses.binary_crossentropy,
metrics=['accuracy'])
# 訓練模型
model.fit(x_train, y_train, epochs=100, batch_size=16)
# 驗證模型
(test_lose, test_acc) = model.evaluate(x_test, y_test)
print(test_acc)
堆疊的LSTM用於序列分類 many to one
圖中共堆疊了三層LSTM層,前兩層LSTM的輸出爲全序列(return_sequences=True),最後一層LSTM只在最後一個時間步輸出結果(默認)
from keras.models import Sequential
from keras.layers import Dense, LSTM
data_dim = 16 #特徵數
timesteps = 8 #時間步數
num_classes = 10 #分類數
# 創造numpy數據
x_train = np.random.random((100, timesteps, data_dim))
y_train = np.random.randint(num_classes, size=(100, 1))
y_one_hot_train = keras.utils.to_categorical(y_train, num_classes=num_classes)
x_test = np.random.random((10, timesteps, data_dim))
y_test = np.random.randint(num_classes, size=(10, 1))
y_one_hot_test = keras.utils.to_categorical(y_test, num_classes=num_classes)
# 構建模型
model = Sequential()
model.add(LSTM(32, return_sequences=True,
input_shape=(timesteps, data_dim)))
model.add(LSTM(32, return_sequences=True))
model.add(LSTM(32))
model.add(Dense(num_classes, activation='softmax'))
# 編譯模型
model.compile(optimizer=keras.optimizers.Adam(),
loss=keras.losses.categorical_crossentropy,
metrics=['accuracy'])
# 訓練並驗證模型
model.fit(x_train, y_one_hot_train, epochs=100, batch_size=32,
validation_data=(x_test, y_one_hot_test))
有狀態的LSTM模型用於序列分類 many to one
有狀態的LSTM模型與無狀態的LSTM模型的區別可查看以下博客:Keras 之 LSTM 有狀態模型(stateful LSTM)和無狀態模型(stateless LSTM)
from keras.models import Sequential
from keras.layers import LSTM, Dense
data_dim = 16
timesteps = 8
num_classes = 10
batch_size = 32
# Generate dummy training data
x_train = np.random.random((batch_size * 10, timesteps, data_dim))
y_train = np.random.random((batch_size * 10, num_classes))
# Generate dummy validation data
x_val = np.random.random((batch_size * 3, timesteps, data_dim))
y_val = np.random.random((batch_size * 3, num_classes))
# 構建模型
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(num_classes, activation='softmax'))
# 編譯模型
model.compile(optimizer=keras.optimizers.Adam(),
loss=keras.losses.categorical_crossentropy,
metrics=['accuracy'])
# 訓練模型
model.fit(x_train, y_train,
batch_size=batch_size, epochs=5, shuffle=False,
validation_data=(x_val, y_val))