原文地址
介紹完了優(yōu)化器和目標(biāo)函數(shù),那么剩下的就是訓(xùn)練模型了。這一小節(jié),我們來(lái)看一下Keras的Models是如何使用的。Keras可以建立兩種模型,一種是線性疊加的,層與層之間是全連接的方式,一個(gè)輸入,一個(gè)輸出;另外一種是圖型的,輸入與輸出數(shù)量任意,并且可以指定層與層之間的部分連接方式。
一、Sequential(序貫?zāi)P停┓椒皩傩越榻B
model = keras.models.Sequential()
序貫?zāi)P途褪前衙恳粚影凑沾涡虔B加起來(lái),每層之間采用全連接方式。下面看一下對(duì)象model都有哪些方法。
1 add(layer):往model里邊增加一層
2 compile(optimizer, loss, class_model=”categorical”):
參數(shù):
- optimizer:指定模型訓(xùn)練的優(yōu)化器;
- loss:目標(biāo)函數(shù);
- class_mode: ”categorical”和”binary”中的一個(gè),只是用來(lái)計(jì)算分類(lèi)的精確度
3 fit(X, y, batch_size=128, nb_epoch=100, verbose=1, validation_split=0,****validation_data=None,shuffle=True,show_accuracy=False,callbacks=[],****class_weight=Noe, sample_weight=None)****:用于訓(xùn)練一個(gè)固定迭代次數(shù)的模型**
返回:記錄字典,包括每一次迭代的訓(xùn)練誤差率和驗(yàn)證誤差率;
參數(shù):
X:訓(xùn)練數(shù)據(jù)
y : 標(biāo)簽
batch_size : 每次訓(xùn)練和梯度更新塊的大小。
nb_epoch: 迭代次數(shù)。
verbose : 進(jìn)度表示方式。0表示不顯示數(shù)據(jù),1表示顯示進(jìn)度條,2表示用只顯示一個(gè)數(shù)據(jù)。
callbacks : 回調(diào)函數(shù)列表。就是函數(shù)執(zhí)行完后自動(dòng)調(diào)用的函數(shù)列表。
validation_split : 驗(yàn)證數(shù)據(jù)的使用比例。
validation_data : 被用來(lái)作為驗(yàn)證數(shù)據(jù)的(X, y)元組。會(huì)代替validation_split所劃分的驗(yàn)證數(shù)據(jù)。
shuffle : 類(lèi)型為boolean或 str(‘batch’)。是否對(duì)每一次迭代的樣本進(jìn)行shuffle操作(可以參見(jiàn)博文Theano學(xué)習(xí)筆記01--Dimshuffle()函數(shù))。’batch’是一個(gè)用于處理HDF5(keras用于存儲(chǔ)權(quán)值的數(shù)據(jù)格式)數(shù)據(jù)的特殊選項(xiàng)。
show_accuracy:每次迭代是否顯示分類(lèi)準(zhǔn)確度。
class_weigh : 分類(lèi)權(quán)值鍵值對(duì)。原文:dictionary mapping classes to a weight value, used for scaling the lossfunction (during training only)。鍵為類(lèi)別,值為該類(lèi)別對(duì)應(yīng)的權(quán)重。只在訓(xùn)練過(guò)程中衡量損失函數(shù)用。
sample_weight : list or numpy array with1:1 mapping to the training samples, used for scaling the loss function (duringtraining only). For time-distributed data, there is one weight per sample pertimestep, i.e. if your output data is shaped(nb_samples, timesteps, output_dim), your mask should be of shape(nb_samples, timesteps, 1). This allows you to maskout or reweight individual output timesteps, which is useful in sequence tosequence learning.
4 evalute(X, y, batch_size=128, show_accuracy=False,****verbose=1, sample_weight=None)****: 展示模型在驗(yàn)證數(shù)據(jù)上的效果
返回:誤差率或者是(誤差率,準(zhǔn)確率)元組(if show_accuracy=True)
參數(shù):和fit函數(shù)中的參數(shù)基本一致,其中verbose取1或0,表示有進(jìn)度條或沒(méi)有
5 predict(X, batch_size=128, verbose=1): 用于對(duì)測(cè)試數(shù)據(jù)的預(yù)測(cè)
返回:對(duì)于測(cè)試數(shù)據(jù)的預(yù)測(cè)數(shù)組
參數(shù):和fit函數(shù)中的參數(shù)一樣。
6 predict_classes(X, batch_size=128, verbose=1): 用于對(duì)測(cè)試數(shù)據(jù)的分類(lèi)預(yù)測(cè)
返回:對(duì)于測(cè)試數(shù)據(jù)的預(yù)測(cè)分類(lèi)結(jié)果數(shù)組
參數(shù):和evaluate函數(shù)中的參數(shù)一樣。
7 train_on_batch(X, y, accuracy=False, class_weight=None, sample_weight=None): 對(duì)數(shù)據(jù)塊進(jìn)行計(jì)算并梯度更新
返回:數(shù)據(jù)塊在現(xiàn)有模型中的誤差率或者元組(if show_accuracy=True)
參數(shù):和evaluate函數(shù)中的參數(shù)一樣。
8 test_on_batch(X, y, accuracy=False, sample_weight=None): 用數(shù)據(jù)塊進(jìn)行性能驗(yàn)證
返回:數(shù)據(jù)塊在現(xiàn)有模型中的誤差率或者元組(誤差率,準(zhǔn)確率)(if show_accuracy=True)
參數(shù):和evaluate函數(shù)中的參數(shù)一樣。
9 save_weights (fname, overwrite=False): 將所有層的權(quán)值保存為HDF5文件
返回:如果overwrite=False并且fname已經(jīng)存在,則會(huì)拋出異常。
參數(shù):
fname: 文件名
overwrite : 如果已經(jīng)存在,是否覆蓋原文件。
10 load_weights(fname): 加載已經(jīng)存在的權(quán)值數(shù)據(jù)到程序中的模型里面。文件中的模型和程序中的模型結(jié)構(gòu)必須一致。在compile之前或之后都可以調(diào)用load_ weights函數(shù)。
參數(shù): fname文件名
二、Sequential(序貫?zāi)P停┡e例說(shuō)明
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
model = Sequential()
model.add(Dense(2, init='uniform', input_dim=64))
model.add(Activation('softmax'))
model.compile(loss='mse', optimizer='sgd')
'''''
Verbose=1或2的結(jié)果演示
'''
model.fit(X_train, y_train, nb_epoch=3, batch_size=16, verbose=1)
# 輸出信息
'''''
Train on 37800 samples, validate on 4200 samples
Epoch 0
37800/37800 [==============================] - 7s - loss: 0.0385
Epoch 1
37800/37800 [==============================] - 8s - loss: 0.0140
Epoch 2
10960/37800 [=======>......................] - ETA: 4s - loss: 0.0109
'''
model.fit(X_train, y_train, nb_epoch=3, batch_size=16, verbose=2)
# 輸出信息
'''''
Train on 37800 samples, validate on 4200 samples
Epoch 0
loss: 0.0190
Epoch 1
loss: 0.0146
Epoch 2
loss: 0.0049
'''
'''''
show_accuracy=True的演示,會(huì)輸出誤差率-正確率
'''
model.fit(X_train, y_train, nb_epoch=3, batch_size=16, verbose=2, show_accuracy=True)
# 輸出信息
'''''
Train on 37800 samples, validate on 4200 samples
Epoch 0
loss: 0.0190 - acc.: 0.8750
Epoch 1
loss: 0.0146 - acc.: 0.8750
Epoch 2
loss: 0.0049 - acc.: 1.0000
'''
'''''
validation_split=0.1表示總樣本的10%用來(lái)進(jìn)行驗(yàn)證。比如下方實(shí)例,樣本總數(shù)42000,則驗(yàn)證數(shù)據(jù)占10%,即4200,剩余的37800為訓(xùn)練數(shù)據(jù)。
'''
model.fit(X_train, y_train, nb_epoch=3, batch_size=16, validation_split=0.1, show_accuracy=True, verbose=1)
# outputs
'''''
Train on 37800 samples, validate on 4200 samples
Epoch 0
37800/37800 [==============================] - 7s - loss: 0.0385 - acc.:0.7258 - val. loss: 0.0160 - val. acc.: 0.9136
Epoch 1
37800/37800 [==============================] - 8s - loss: 0.0140 - acc.:0.9265 - val. loss: 0.0109 - val. acc.: 0.9383
Epoch 2
10960/37800 [=======>......................] - ETA: 4s - loss: 0.0109 -acc.: 0.9420