Keras —— 序貫模型和函式式模型
阿新 • • 發佈:2019-02-12
序貫模型
序貫模型是多個網路層的線性堆疊,是函式式模型的簡略版,為最簡單的線性、從頭到尾的結構順序,不發生分叉。
1、應用序貫模型的基本步驟
- model.add,新增層;
- model.compile,模型訓練的BP模式設定;
- model.fit,模型訓練引數設定 + 訓練;
- 模型評估
- 模型預測
2、建立
1、可以通過向Sequential模型傳遞一個layer的list來構造該模型:
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential([
Dense(32 , units=784),
Activation('relu'),
Dense(10),
Activation('softmax'),
])
2、也可以通過.add()方法一個個的將layer加入模型中:
model = Sequential()
model.add(Dense(32, input_shape=(784,)))
model.add(Activation('relu'))
3、指定輸入資料的shape
模型需要知道輸入資料的shape,因此,Sequential的第一層需要接受一個關於輸入資料shape的引數,後面的各個層則可以自動的推匯出中間資料的shape,因此不需要為每個層都指定這個引數。有幾種方法來為第一層指定輸入資料的shape
1、傳遞一個input_shape的關鍵字引數給第一層,input_shape是一個tuple型別的資料
model = Sequential()
model.add(Dense(64, input_shape=(20,), activation='relu'))
2、有些2D層,如Dense,支援通過指定其輸入維度input_dim來隱含的指定輸入資料shape,是一個Int型別的資料。一些3D的時域層支援通過引數input_dim和input_length來指定輸入shape。
model = Sequential()
model.add(Dense(64, input_dim=20 , activation='relu'))
4、編譯
在訓練模型之前,我們需要通過compile來對學習過程進行配置。compile接收三個引數:優化器optimizer,損失函式loss,指標列表metrics
model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
5、訓練
訓練模型一般使用fit函式
model.fit(x_train, y_train,epochs=20,batch_size=128)
6、評估
根據驗證集評估模型的好壞
score = model.evaluate(x_val, y_val, batch_size=128)
print('val score:', score[0])
print('val accuracy:', score[1])
7、預測
對已訓練完成的模型,輸入特徵值x會預測得到標籤y
x=1
y=model.predict(x,verbose=0)
print(y)
8、示例
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_val = np.random.random((100, 20))
y_val = np.random.randint(2, size=(100, 1))
model = Sequential()
model.add(Dense(64, input_dim=20, activation='relu'))
# 或 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(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_val, y_val, batch_size=128)
print('val score:', score[0])
print('val accuracy:', score[1])
x=1
y=model.predict(x,verbose=0)
print(y)
函式式模型
比序貫模型要複雜,可以同時/分階段輸入變數,分階段輸出想要的模型
1、應用函式式模型的基本步驟
- model.layers,新增層;
- model.compile,模型訓練的BP模式設定;
- model.fit,模型訓練引數設定 + 訓練;
- 模型評估
- 模型預測
2、建立
model=Model(inputs=, outputs=)
3、指定輸入資料的shape
inputs = Input(shape=(20,))
4、編譯,訓練,評估,預測等步驟與序貫式模型相同,這裡不再贅述
5、示例一
基於上文序貫式模型進行改造
import numpy as np
from keras.models import Model
from keras.layers import Dense, Dropout
# 準備訓練集和驗證集
x_train = np.random.random((1000, 20))
y_train = np.random.randint(2, size=(1000, 1))
x_val = np.random.random((100, 20))
y_val = np.random.randint(2, size=(100, 1))
inputs = Input(shape=(20,))
x=Dense(64,activation='relu')(inputs)
x=Dropout(0.5)(x)
x=Dense(64,activation='relu')(x)
x=Dropout(0.5)(x)
predictions=Dense(1, activation='sigmoid')(x)
model=Model(inputs=inputs, outputs=predictions)
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
model.fit(x_train, y_train,epochs=20,batch_size=128)
score = model.evaluate(x_val, y_val, batch_size=128)
print('val score:', score[0])
print('val accuracy:', score[1])
x=1
y=model.predict(x,verbose=0)
print(y)
6、示例二
多輸入多輸出模型
from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model
main_input = Input(shape=(100,), dtype='int32', name='main_input')
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)
lstm_out = LSTM(32)(x)
auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)
auxiliary_input = Input(shape=(5,), name='aux_input')
x = keras.layers.concatenate([lstm_out, auxiliary_input])
# We stack a deep densely-connected network on top
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
# And finally we add the main logistic regression layer
main_output = Dense(1, activation='sigmoid', name='main_output')(x)
model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])
model.compile(optimizer='rmsprop',
loss={'main_output': 'binary_crossentropy', 'aux_output': 'binary_crossentropy'},
loss_weights={'main_output': 1., 'aux_output': 0.2})
# And trained it via:
model.fit({'main_input': headline_data, 'aux_input': additional_data},
{'main_output': labels, 'aux_output': labels},
epochs=50, batch_size=32)