python向量:
import numpy as npa = np.array([[1,2],[3,4],[5,6]])sum0 = np.sum(a, axis=0)sum1 = np.sum(a, axis=1)print sum0print sum1
> 結果:
[ 9 12]
[ 3 7 11] dropout
指在深度學習網路的訓練過程中,對於神經網路單元,按照一定的機率將其暫時從網路中丟棄。
dropout是CNN中防止過擬合提高效果的一個大殺器 輸出結果是10個類別,所以維度是10
model.add(Dense(500, 10, init=’glorot_uniform’)) Batch
Batch gradient descent,批梯度下降
隨機梯度下降,stochastic gradient descent
mini-batch gradient decent,小批的梯度下降
batch_size 初始化方法
init是關鍵字,’uniform’表示用均勻分布去初始化
model.add(Dense(64, init=’uniform’)) 啟用函數
每個神經元都有啟用函數: linear,sigmoid,tanh,softmax,LeakyReLU和PReLU
model.add(Dense(64))
model.add(Activation(‘tanh’))
或者
model.add(Dense(64, activation=’tanh’)) #此處’tanh’是一個字串 模型相關 compile(optimizer, loss, class_model=”categorical”):
參數:optimizer:指定模型訓練的最佳化器;loss:目標函數;class_mode: ”categorical”和”binary”中的一個,只是用來計算分類的精確度或using the predict_classes methodtheano_mode: Atheano.compile.mode.Mode instance controllingspecifying compilation options
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:訓練資料y : 標籤batch_size : 每次訓練和梯度更新塊的大小。nb_epoch: 迭代次數。verbose : 進度表示方式。0表示不顯示資料,1表示顯示進度條,2表示用只顯示一個資料。callbacks : 回呼函數列表。就是函數執行完後自動調用的函數列表。validation_split : 驗證資料的使用比例。validation_data : 被用來作為驗證資料的(X, y)元組。會代替validation_split所劃分的驗證資料。shuffle : 類型為boolean或 str(‘batch’)。是否對每一次迭代的樣本進行shuffle操作(可以參見博文Theano學習筆記01--Dimshuffle()函數)。’batch’是一個用於處理HDF5(keras用於儲存權值的資料格式)資料的特殊選項。show_accuracy:每次迭代是否顯示分類準確度。class_weigh : 分類權值索引值對。原文:dictionary mapping classes to a weight value, used for scaling the lossfunction (during training only)。鍵為類別,值為該類別對應的權重。只在訓練過程中衡量損失函數用。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.
evalute(X, y, batch_size=128, show_accuracy=False,verbose=1, sample_weight=None)
展示模型在驗證資料上的效果
返回:誤差率或者是(誤差率,準確率)元組(if show_accuracy=True)參數:和fit函數中的參數基本一致,其中verbose取1或0,表示有進度條或沒有
predict(X, batch_size=128, verbose=1)
用於對測試資料的預測
返回:對於測試資料的預測數組參數:和fit函數中的參數一樣。
predict_classes(X, batch_size=128, verbose=1)
用於對測試資料的分類預測
返回:對於測試資料的預測分類結果數組參數:和evaluate函數中的參數一樣。
train_on_batch(X, y, accuracy=False, class_weight=None, sample_weight=None)
對資料區塊進行計算並梯度更新
返回:資料區塊在現有模型中的誤差率或者元組(if show_accuracy=True)參數:和evaluate函數中的參數一樣。
test_on_batch(X, y, accuracy=False, sample_weight=None)
用資料區塊進行效能驗證
返回:資料區塊在現有模型中的誤差率或者元組(誤差率,準確率)(if show_accuracy=True)參數:和evaluate函數中的參數一樣。
save_weights (fname, overwrite=False)
將所有層的權值儲存為HDF5檔案
返回:如果overwrite=False並且fname已經存在,則會拋出異常。參數:fname: 檔案名稱overwrite : 如果已經存在,是否覆蓋原檔案。
load_weights(fname):
載入已經存在的權值資料到程式中的模型裡面。檔案中的模型和程式中的模型結構必須一致。在compile之前或之後都可以調用load_ weights函數。
參數: fname檔案名稱
Sequential(線性疊加模型)舉例說明
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的結果示範 ''' 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的示範,會輸出誤差率-正確率 ''' 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%用來進行驗證。比如下方執行個體,樣本總數42000,則驗證資料佔10%,即4200,剩餘的37800為訓練資料。 ''' 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 ''' Graph(任意串連圖模型)方法及屬性介紹
任意串連圖可以有任意數量的輸入和輸出,每一個輸出都由專門的代價函數進行訓練。圖模型的最佳化取決於所有代價函數的總和。看過代碼就會感覺很清晰,完全就是一張節點串連圖。可以很清晰的畫出該有向圖。適用於部分串連的模型。
model = keras.models.Graph()
下面看一下對象model都有哪些方法。 add_input (name, input_shape, dtype=’float’)
往model裡邊增加一輸入層
參數:name: 輸入層的唯一字串標識input_shape: 整數元組,表示新增層的shape。例如(10,)表示10維向量;(None, 128)表示一個可變長度的128維向量;(3, 32, 32) 表示一張3通道(RGB)的32*32的圖片。dtype:float或者int;輸入資料的類型。
add_output (name, input=None, inputs=[], merge_mode=’concat’)
增加一個串連到input或inputs的輸出層
參數:name: 輸出層的唯一字串標識input: 輸出層要串連到的隱層的名字。只能是input或inputs中的一個。inputs:新增層要串連到的多個隱層的名字列表。merge_mode: “sum”或”concat”。在指定inputs時有效,將不同的輸入合并起來。
add_node (layer, name, input=None,inputs=[], merge_mode=’concat’)
增加一個串連到input或inputs的輸出層(就是除去輸入輸出之外的隱層)
參數:layer: Layer執行個體(Layer後邊會介紹到)name:隱層的唯一字串標識input: 新增隱層要串連到的某隱層或輸入層的名字。只能是input或inputs中的一個。inputs:新增隱層要串連到的多個隱層的名字列表。merge_mode: “sum”或”concat”。在指定inputs時有效,將不同的輸入合并起來。
compile (optimizer, loss)
往input或inputs裡邊增加一輸出層
參數:optimizer: 最佳化器名或者最佳化器對象loss: 字典索引值對。鍵為輸出層的name,值為該層對應的目標函數名或目標函數對象。
fit(data, batch_size=128, nb_epoch=100, verbose=1, validation_split=0,validation_data=None, shuffle=True, callbacks=[])
用於訓練一個固定迭代次數的模型
返回:記錄字典,包括每一次迭代的訓練誤差率和驗證誤差率;參數:data:字典。鍵為輸入層或輸出層的名,值為具體的輸入資料或輸出資料。可見下方的樣本。batch_size : 每次訓練和梯度更新的資料區塊大小nb_epoch: 迭代次數verbose : 進度表示方式。0表示不顯示資料,1表示顯示進度條,2表示用只顯示一個資料。callbacks : 回呼函數列表validation_split : 驗證資料的使用比例。validation_data : 被用來作為驗證資料的(X, y)元組。Will override validation_split.shuffle : 類型為boolean或 str(‘batch’)。是否對每一次迭代的樣本進行shuffle操作(可以參見博文Theano學習筆記01--Dimshuffle()函數)。’batch’是一個用於處理HDF5(keras用於儲存權值的資料格式)資料的特殊選項。
evalute(data, batch_size=128, verbose=1): 展示模型在驗證資料上的效果
返回:誤差率參數:和fit函數中的參數基本一致,其中verbose取1或0,表示有進度條或沒有
predict(data, batch_size=128, verbose=1): 用於對測試資料的預測
返回:索引值對。鍵為輸出層名,值為對應層的預測數組參數:和fit函數中的參數一樣。輸入層需要在data中聲明。
train_on_batch(data): 對資料區塊進行計算並梯度更新
返回:資料區塊在現有模型中的誤差率參數:和evaluate函數中的參數一樣。
test_on_batch(data): 用資料區塊對模型進行效能驗證
返回:據塊在現有模型中的誤差率參數:和evaluate函數中的參數一樣。
save_weights (fname, overwrite=False): 將所有層的權值儲存為HDF5檔案
返回:如果overwrite=False並且fname已經存在,則會拋出異常。參數:fname: 檔案名稱overwrite : 如果已經存在,是否覆蓋原檔案。
load_weights (fname): 載入已經存在的權值資料到程式中的模型裡面。檔案中的模型和程式中的模型結構必須一致。在compile之前或之後都可以調用load_ weights函數。 Graph(任意串連圖模型)舉例說明
# 含一輸入,兩輸出的graph modelgraph = Graph()graph.add_input(name='input', input_shape=(32,))graph.add_node(Dense(16), name='dense1', input='input')graph.add_node(Dense(4), name='dense2', input='input')graph.add_node(Dense(4), name='dense3', input='dense1')graph.add_output(name='output1', input='dense2')graph.add_output(name='output2', input='dense3')graph.compile('rmsprop', {'output1':'mse', 'output2':'mse'})history = graph.fit({'input':X_train, 'output1':y_train, 'output2':y2_train}, nb_epoch=10)# 含兩輸入,兩輸出的graph modelgraph = Graph()graph.add_input(name='input1', input_shape=(32,))graph.add_input(name='input2', input_shape=(32,))graph.add_node(Dense(16), name='dense1', input='input1')graph.add_node(Dense(4), name='dense2', input='input2')graph.add_node(Dense(4), name='dense3', input='dense1')graph.add_output(name='output', inputs=['dense2', 'dense3'], merge_mode='sum')graph.compile('rmsprop', {'output':'mse'})history = graph.fit({'input1':X_train, 'input2':X2_train, 'output':y_train}, nb_epoch=10)predictions = graph.predict({'input1':X_test, 'input2':X2_test}) # {'output':...} 如何使用規則化項
規則化項是一個對於權值參數的懲罰項。它包含在代價函數中。
在Keras的Dense Layer、TimeDistributedDense Layer、MaxoutDense Layer、Convolution1D Layer和Convolution2D Layer中有一個統一的API用來應用規則化項。
上面這些層有3個關鍵的參數:W_regularizer:執行個體化於 keras.regularizers.WeightRegularizer(對權值規則化)b_regularizer:執行個體化於keras.regularizers.WeightRegularizer (對偏置規則化)activity_regularizer:執行個體化於keras.regularizers.ActivityRegularizer (對啟用值規則化,也就是權值與矩陣點乘以後的輸出規則化)
這裡對W和b的規則化用的同一個類,因為他們的實現方式基本差不多。然而日常使用的時候,很少對b進行規則化。即使對b規則化了,結果只有一點點的改善。因此經常使用的是對W的規則化。
使用範例程式碼如下:
from keras.regularizers import l2, activity_l2model.add(Dense(64, input_dim=64, W_regularizer=l2(0.01), activity_regularizer=activity_l2(0.01)))
約束限制
在Keras的Dense Layer、TimeDistributedDense Layer、MaxoutDense Layer、Convolution1D Layer和Convolution2D Layer中有一個統一的API用來使用約束。
2個關鍵的參數:W_constraint:約束主要的權值矩陣b_constraint:約束偏置值
from keras.constraintsimport maxnormmodel.add(Dense(64, W_constraint =maxnorm(2))) #限制權值的各個參數不能大於2
可用的約束限制
maxnorm(m=2): 最大值約束nonneg(): 不允許負值unitnorm(): 歸一化
http://keras-cn.readthedocs.io/en/latest/getting_started/sequential_model/
http://keras-cn.readthedocs.io/en/latest/getting_started/concepts/
http://blog.csdn.net/niuwei22007/article/details/49375195