Keras深度学习框架介绍(结束)
keras是一個開源是的python深度學(xué)習(xí)庫,可以基于theano或者tenserflow,下面大體介紹下keras的幾個重要模塊。
重要的模塊
1、優(yōu)化器(optimizers)
優(yōu)化器是調(diào)整每個節(jié)點權(quán)重的方法,看一個代碼示例:
?
| 1 2 3 4 | model = Sequential() model.add(Dense(64, init='uniform', input_dim=10)) model.add(Activation('tanh')) model.add(Activation('softmax')) sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='mean_squared_error', optimizer=sgd) |
可以看到優(yōu)化器在模型編譯前定義,作為編譯時的兩個參數(shù)之一
代碼中的sgd是隨機梯度下降算法
lr表示學(xué)習(xí)速率
momentum表示動量項
decay是學(xué)習(xí)速率的衰減系數(shù)(每個epoch衰減一次)
Nesterov的值是False或者True,表示使不使用Nesterov momentum
以上4個參數(shù)以后具體學(xué)習(xí)了再解析
除了sgd,還可以選擇的優(yōu)化器有RMSprop(適合遞歸神經(jīng)網(wǎng)絡(luò))、Adagrad、Adadelta、Adam、Adamax、Nadam
2、目標函數(shù)(objectives)
目標函數(shù)又稱損失函數(shù)(loss),目的是計算神經(jīng)網(wǎng)絡(luò)的輸出與樣本標記的差的一種方法,代碼示例:
?
| 1 2 3 4 | model = Sequential() model.add(Dense(64, init='uniform', input_dim=10)) model.add(Activation('tanh')) model.add(Activation('softmax')) sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='mean_squared_error', optimizer=sgd) |
mean_squared_error就是損失函數(shù)的名稱
可以選擇的損失函數(shù)有:
mean_squared_error,mean_absolute_error,squared_hinge,hinge,binary_crossentropy,categorical_crossentropy
這里binary_crossentropy 和 categorical_crossentropy也就是logloss
3、激活函數(shù)(activations)
每一個神經(jīng)網(wǎng)絡(luò)層都需要一個激活函數(shù),代碼示例:
?
| 1 2 3 4 5 6 7 8 | from keras.layers.core import Activation, Dense model.add(Dense(64)) model.add(Activation('tanh')) 或把上面兩行合并為: model.add(Dense(64, activation='tanh')) |
可以選擇的激活函數(shù)有:
linear、sigmoid、hard_sigmoid、tanh、softplus、relu、 softplus,softmax、softsign
還有一些高級激活函數(shù),比如如PReLU,LeakyReLU等
4、參數(shù)初始化(Initializations)
這個模塊的作用是在添加layer時調(diào)用init進行這一層的權(quán)重初始化,有兩種初始化方法
4.1 通過制定初始化方法的名稱:
示例代碼:
?
| 1 | model.add(Dense(64, init='uniform')) |
可以選擇的初始化方法有:
uniform、lecun_uniform、normal、orthogonal、zero、glorot_normal、he_normal等
4.2 通過調(diào)用對象:
該對象必須包含兩個參數(shù):shape(待初始化的變量的shape)和name(該變量的名字),該可調(diào)用對象必須返回一個(Keras)變量,例如K.variable()返回的就是這種變量,示例代碼:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from keras import backend as K import numpy as np def my_init(shape, name=None): ????value = np.random.random(shape) ????return K.variable(value, name=name) model.add(Dense(64, init=my_init)) 或者 from keras import initializations def my_init(shape, name=None): ????return initializations.normal(shape, scale=0.01, name=name) model.add(Dense(64, init=my_init)) |
所以說可以通過庫中的方法設(shè)定每一層的初始化權(quán)重,
也可以自己初始化權(quán)重,自己設(shè)定的話可以精確到每個節(jié)點的權(quán)重,
那么是否可以在這兒做文章優(yōu)化特征呢?我覺得可以針對不同的task深入試驗看看
5、層(layer)
keras的層主要包括:
常用層(Core)、卷積層(Convolutional)、池化層(Pooling)、局部連接層、遞歸層(Recurrent)、嵌入層( Embedding)、高級激活層、規(guī)范層、噪聲層、包裝層,當(dāng)然也可以編寫自己的層
5.1對于層的操作
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | layer.get_weights() #返回該層的權(quán)重 layer.set_weights(weights)#將權(quán)重加載到該層 config = layer.get_config()#保存該層的配置 layer = layer_from_config(config)#加載一個配置到該層 #該層有一個節(jié)點時,獲得輸入張量、輸出張量、及各自的形狀: layer.input layer.output layer.input_shape layer.output_shape #該層有多個節(jié)點時(node_index為節(jié)點序號): layer.get_input_at(node_index) layer.get_output_at(node_index) layer.get_input_shape_at(node_index) layer.get_output_shape_at(node_index) |
5.2 Dense層(全連接層)
?
| 1 | keras.layers.core.Dense(output_dim, init='glorot_uniform', activation='linear', weights=None, W_regularizer=None, b_regularizer=None, activity_regularizer=None, W_constraint=None, b_constraint=None, bias=True, input_dim=None) |
output_dim:輸出數(shù)據(jù)的維度
init:初始化該層權(quán)重的方法
activation:該層的激活函數(shù)
weights:numpy array的list。該list應(yīng)含有一個形如(input_dim,output_dim)的權(quán)重矩陣和一個形如(output_dim,)的偏置向量
regularizer:正則項,w為權(quán)重的、b為偏執(zhí)的,activity為輸出的
constraints:約束項
bias:是否包含偏執(zhí)向量,是布爾值
input_dim:輸入數(shù)據(jù)的維度
5.3 dropout層
keras.layers.core.Dropout(p)
為輸入數(shù)據(jù)施加Dropout。Dropout將在訓(xùn)練過程中每次更新參數(shù)時隨機斷開一定百分比(p)的輸入神經(jīng)元連接,Dropout層用于防止過擬合。
參考文章:http://blog.csdn.net/stdcoutzyx/article/details/49022443理解dropout
5.4 遞歸層(Recurrent)
遞歸層包含三種模型:LSTM、GRU和SimpleRNN
5.4.1抽象層,不能直接使用
?
| 1 | keras.layers.recurrent.Recurrent(weights=None, return_sequences=False, go_backwards=False, stateful=False, unroll=False, consume_less='cpu', input_dim=None, input_length=None) |
return_sequences:True返回整個序列,false返回輸出序列的最后一個輸出
go_backwards:True,逆向處理輸入序列,默認為False
stateful:布爾值,默認為False,若為True,則一個batch中下標為i的樣本的最終狀態(tài)將會用作下一個batch同樣下標的樣本的初始狀態(tài)
5.4.2全連接RNN網(wǎng)絡(luò)
?
| 1 | keras.layers.recurrent.SimpleRNN(output_dim, init='glorot_uniform', inner_init='orthogonal', activation='tanh', W_regularizer=None, U_regularizer=None, b_regularizer=None, dropout_W=0.0, dropout_U=0.0) |
inner_init:內(nèi)部單元的初始化方法
dropout_W:0~1之間的浮點數(shù),控制輸入單元到輸入門的連接斷開比例
dropout_U:0~1之間的浮點數(shù),控制輸入單元到遞歸連接的斷開比例
5.4.3 LSTM層
?
| 1 | keras.layers.recurrent.LSTM(output_dim, init='glorot_uniform', inner_init='orthogonal', forget_bias_init='one', activation='tanh', inner_activation='hard_sigmoid', W_regularizer=None, U_regularizer=None, b_regularizer=None, dropout_W=0.0, dropout_U=0.0) |
forget_bias_init:遺忘門偏置的初始化函數(shù),Jozefowicz et al.建議初始化為全1元素
inner_activation:內(nèi)部單元激活函數(shù)
5.5 Embedding層
?
| 1 | keras.layers.embeddings.Embedding(input_dim, output_dim, init='uniform', input_length=None, W_regularizer=None, activity_regularizer=None, W_constraint=None, mask_zero=False, weights=None, dropout=0.0) |
只能作為模型第一層
mask_zero:布爾值,確定是否將輸入中的‘0’看作是應(yīng)該被忽略的‘填充’(padding)值,該參數(shù)在使用遞歸層處理變長輸入時有用。設(shè)置為True的話,模型中后續(xù)的層必須都支持masking,否則會拋出異常
5.6 model層(最重要)
model層是最主要的模塊,model層可以將上面定義了各種基本組件組合起來
model的方法:
model.summary() : 打印出模型概況
model.get_config() :返回包含模型配置信息的Python字典
model.get_weights():返回模型權(quán)重張量的列表,類型為numpy array
model.set_weights():從numpy array里將權(quán)重載入給模型
model.to_json:返回代表模型的JSON字符串,僅包含網(wǎng)絡(luò)結(jié)構(gòu),不包含權(quán)值。可以從JSON字符串中重構(gòu)原模型:
?
| 1 2 3 4 | from models import model_from_json json_string = model.to_json() model = model_from_json(json_string) |
model.to_yaml:與model.to_json類似,同樣可以從產(chǎn)生的YAML字符串中重構(gòu)模型
?
| 1 2 3 4 | from models import model_from_yaml yaml_string = model.to_yaml() model = model_from_yaml(yaml_string) |
model.save_weights(filepath):將模型權(quán)重保存到指定路徑,文件類型是HDF5(后綴是.h5)
model.load_weights(filepath, by_name=False):從HDF5文件中加載權(quán)重到當(dāng)前模型中, 默認情況下模型的結(jié)構(gòu)將保持不變。如果想將權(quán)重載入不同的模型(有些層相同)中,則設(shè)置by_name=True,只有名字匹配的層才會載入權(quán)重
keras有兩種model,分別是Sequential模型和泛型模型
5.6.1 Sequential模型
Sequential是多個網(wǎng)絡(luò)層的線性堆疊
可以通過向Sequential模型傳遞一個layer的list來構(gòu)造該模型:
?
| 1 2 3 4 5 6 7 8 9 | from keras.models import Sequential from keras.layers import Dense, Activation model = Sequential([ Dense(32, input_dim=784), Activation('relu'), Dense(10), Activation('softmax'), ]) |
也可以通過.add()方法一個個的將layer加入模型中:
?
| 1 2 3 | model = Sequential() model.add(Dense(32, input_dim=784)) model.add(Activation('relu')) |
還可以通過merge將兩個Sequential模型通過某種方式合并
Sequential模型的方法:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | compile(self, optimizer, loss, metrics=[], sample_weight_mode=None) fit(self, x, y, batch_size=32, nb_epoch=10, verbose=1, callbacks=[], validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None) evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None) #按batch獲得輸入數(shù)據(jù)對應(yīng)的輸出,函數(shù)的返回值是預(yù)測值的numpy array predict(self, x, batch_size=32, verbose=0) #按batch產(chǎn)生輸入數(shù)據(jù)的類別預(yù)測結(jié)果,函數(shù)的返回值是類別預(yù)測結(jié)果的numpy array或numpy predict_classes(self, x, batch_size=32, verbose=1) #本函數(shù)按batch產(chǎn)生輸入數(shù)據(jù)屬于各個類別的概率,函數(shù)的返回值是類別概率的numpy array predict_proba(self, x, batch_size=32, verbose=1) train_on_batch(self, x, y, class_weight=None, sample_weight=None) test_on_batch(self, x, y, sample_weight=None) predict_on_batch(self, x) fit_generator(self, generator, samples_per_epoch, nb_epoch, verbose=1, callbacks=[], validation_data=None, nb_val_samples=None, class_weight=None, max_q_size=10) evaluate_generator(self, generator, val_samples, max_q_size=10) |
5.6.2 泛型模型
Keras泛型模型接口是:
用戶定義多輸出模型、非循環(huán)有向模型或具有共享層的模型等復(fù)雜模型的途徑
適用于實現(xiàn):全連接網(wǎng)絡(luò)和多輸入多輸出模型
多輸入多輸出,官方例子給出:預(yù)測一條新聞的點贊轉(zhuǎn)發(fā)數(shù),主要輸入是新聞本身,還可以加入額外輸入,比如新聞發(fā)布日期,新聞作者等,具體的實現(xiàn)還是看官網(wǎng)文檔吧:
http://keras-cn.readthedocs.io/en/latest/getting_started/functional_API/
所以感覺這個模型可以針對特定task搞一些創(chuàng)新哦
泛型模型model的屬性:
model.layers:組成模型圖的各個層
model.inputs:模型的輸入張量列表
model.outputs:模型的輸出張量列表
方法:類似序列模型的方法
補充get_layer
get_layer(self, name=None, index=None)
本函數(shù)依據(jù)模型中層的下標或名字獲得層對象,泛型模型中層的下標依據(jù)自底向上,水平遍歷的順序。
name:字符串,層的名字
index: 整數(shù),層的下標
函數(shù)的返回值是層對象
總結(jié)
以上是生活随笔為你收集整理的Keras深度学习框架介绍(结束)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python对Excel的读操作(完成)
- 下一篇: 深度学习论文笔记-Deep Learni