Keras深度學習框架介紹(結束)

所念皆山海 2021-08-16 02:01:58 阅读数:303

本文一共[544]字,预计阅读时长:1分钟~
keras 深度 框架

keras是一個開源是的python深度學習庫,可以基於theano或者tenserflow,下面大體介紹下keras的幾個重要模塊。

重要的模塊

1、優化器(optimizers)

優化器是調整每個節點權重的方法,看一個代碼示例:

?

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)

可以看到優化器在模型編譯前定義,作為編譯時的兩個參數之一

代碼中的sgd是隨機梯度下降算法

lr錶示學習速率

momentum錶示動量項

decay是學習速率的衰减系數(每個epoch衰减一次)

Nesterov的值是False或者True,錶示使不使用Nesterov momentum

以上4個參數以後具體學習了再解析

除了sgd,還可以選擇的優化器有RMSprop(適合遞歸神經網絡)、Adagrad、Adadelta、Adam、Adamax、Nadam

2、目標函數(objectives)

目標函數又稱損失函數(loss),目的是計算神經網絡的輸出與樣本標記的差的一種方法,代碼示例:

?

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就是損失函數的名稱

可以選擇的損失函數有:

mean_squared_error,mean_absolute_error,squared_hinge,hinge,binary_crossentropy,categorical_crossentropy

這裏binary_crossentropy 和 categorical_crossentropy也就是logloss

3、激活函數(activations)

每一個神經網絡層都需要一個激活函數,代碼示例:

?

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'))

可以選擇的激活函數有:

linear、sigmoid、hard_sigmoid、tanh、softplus、relu、 softplus,softmax、softsign

還有一些高級激活函數,比如如PReLU,LeakyReLU等

4、參數初始化(Initializations)

這個模塊的作用是在添加layer時調用init進行這一層的權重初始化,有兩種初始化方法

4.1 通過制定初始化方法的名稱:

示例代碼:

?

1

model.add(Dense(64, init='uniform'))

可以選擇的初始化方法有:

uniform、lecun_uniform、normal、orthogonal、zero、glorot_normal、he_normal等

4.2 通過調用對象:

該對象必須包含兩個參數:shape(待初始化的變量的shape)和name(該變量的名字),該可調用對象必須返回一個(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))

所以說可以通過庫中的方法設定每一層的初始化權重,

也可以自己初始化權重,自己設定的話可以精確到每個節點的權重,

那麼是否可以在這兒做文章優化特征呢?我覺得可以針對不同的task深入試驗看看

5、層(layer)

keras的層主要包括:

常用層(Core)、卷積層(Convolutional)、池化層(Pooling)、局部連接層、遞歸層(Recurrent)、嵌入層( Embedding)、高級激活層、規範層、噪聲層、包裝層,當然也可以編寫自己的層

5.1對於層的操作

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

layer.get_weights() #返回該層的權重

layer.set_weights(weights)#將權重加載到該層

config = layer.get_config()#保存該層的配置

layer = layer_from_config(config)#加載一個配置到該層

#該層有一個節點時,獲得輸入張量、輸出張量、及各自的形狀:

layer.input

layer.output

layer.input_shape

layer.output_shape

#該層有多個節點時(node_index為節點序號):

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:輸出數據的維度

init:初始化該層權重的方法

activation:該層的激活函數

weights:numpy array的list。該list應含有一個形如(input_dim,output_dim)的權重矩陣和一個形如(output_dim,)的偏置向量

regularizer:正則項,w為權重的、b為偏執的,activity為輸出的

constraints:約束項

bias:是否包含偏執向量,是布爾值

input_dim:輸入數據的維度

5.3 dropout層

keras.layers.core.Dropout(p)

為輸入數據施加Dropout。Dropout將在訓練過程中每次更新參數時隨機斷開一定百分比(p)的輸入神經元連接,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的樣本的最終狀態將會用作下一個batch同樣下標的樣本的初始狀態

5.4.2全連接RNN網絡

?

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:內部單元的初始化方法

dropout_W:0~1之間的浮點數,控制輸入單元到輸入門的連接斷開比例

dropout_U:0~1之間的浮點數,控制輸入單元到遞歸連接的斷開比例

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:遺忘門偏置的初始化函數,Jozefowicz et al.建議初始化為全1元素

inner_activation:內部單元激活函數

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’看作是應該被忽略的‘填充’(padding)值,該參數在使用遞歸層處理變長輸入時有用。設置為True的話,模型中後續的層必須都支持masking,否則會拋出异常

5.6 model層(最重要)

model層是最主要的模塊,model層可以將上面定義了各種基本組件組合起來

model的方法:

model.summary() : 打印出模型概况

model.get_config() :返回包含模型配置信息的Python字典

model.get_weights():返回模型權重張量的列錶,類型為numpy array

model.set_weights():從numpy array裏將權重載入給模型

model.to_json:返回代錶模型的JSON字符串,僅包含網絡結構,不包含權值。可以從JSON字符串中重構原模型:

?

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類似,同樣可以從產生的YAML字符串中重構模型

?

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):將模型權重保存到指定路徑,文件類型是HDF5(後綴是.h5)

model.load_weights(filepath, by_name=False):從HDF5文件中加載權重到當前模型中, 默認情况下模型的結構將保持不變。如果想將權重載入不同的模型(有些層相同)中,則設置by_name=True,只有名字匹配的層才會載入權重

keras有兩種model,分別是Sequential模型和泛型模型

5.6.1 Sequential模型

Sequential是多個網絡層的線性堆疊

可以通過向Sequential模型傳遞一個layer的list來構造該模型:

?

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獲得輸入數據對應的輸出,函數的返回值是預測值的numpy array

predict(self, x, batch_size=32, verbose=0)

#按batch產生輸入數據的類別預測結果,函數的返回值是類別預測結果的numpy array或numpy

predict_classes(self, x, batch_size=32, verbose=1)

#本函數按batch產生輸入數據屬於各個類別的概率,函數的返回值是類別概率的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泛型模型接口是:

用戶定義多輸出模型、非循環有向模型或具有共享層的模型等複雜模型的途徑

適用於實現:全連接網絡和多輸入多輸出模型

多輸入多輸出,官方例子給出:預測一條新聞的點贊轉發數,主要輸入是新聞本身,還可以加入額外輸入,比如新聞發布日期,新聞作者等,具體的實現還是看官網文檔吧:

http://keras-cn.readthedocs.io/en/latest/getting_started/functional_API/

所以感覺這個模型可以針對特定task搞一些創新哦

泛型模型model的屬性:

model.layers:組成模型圖的各個層

model.inputs:模型的輸入張量列錶

model.outputs:模型的輸出張量列錶

方法:類似序列模型的方法

補充get_layer

get_layer(self, name=None, index=None)

本函數依據模型中層的下標或名字獲得層對象,泛型模型中層的下標依據自底向上,水平遍曆的順序。

name:字符串,層的名字

index: 整數,層的下標

函數的返回值是層對象

版权声明:本文为[所念皆山海]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210816020110090l.html