Keras方法詳解
- Keras是一個高層神經網絡庫,基於Tensorflow或Theano,由純Python編寫而成。
1. keras.models.Sequential模型
- Keras的核心數據結構是“模型”,模型是一種組織網絡層的方式。
- Keras的主要模型是Sequential模型,Sequential是一系列網絡層按順序構成的棧。
from keras.models import Sequential model = Sequential()
將一些網絡層通過.add()堆疊起來,就構成了一個模型:
from keras.layers import Dense, Activation model.add(Dense(output_dim=64, input_dim=100)) model.add(Activation("relu")) model.add(Dense(output_dim=10)) model.add(Activation("softmax"))
模型搭建完成后,需要使用.compile()方法來編譯模型。編譯模型時必須指明損失函數和優化器,如果需要的話,也可以定制自己的損失函數。
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
from keras.optimizers import SGD model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01, momentum=0.9, nesterov=True))
完成模型編譯后,在訓練數據上按batch進行一定次數的迭代訓練,以擬合網絡。
model.fit(X_train, Y_train, nb_epoch=5, batch_size=32)
隨后使用一行代碼對模型進行評估,看看模型的指標是否滿足任務的要求。
loss_and_metrics = model.evaluate(X_test, Y_test, batch_size=32)
或者使用訓練好的模型,對新的數據進行預測:
classes = model.predict_classes(X_test, batch_size=32)
proba = model.predict_proba(X_test, batch_size=32)
2. keras.layers.Dense方法
Dense方法是Keras定義網絡層的基本方法,其代碼如下:
keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
參數說明如下:
-
units:該層有幾個神經元
-
activation:該層使用的激活函數
-
use_bias:是否添加偏置項
-
kernel_initializer:權重初始化方法
-
bias_initializer:偏置值初始化方法
-
kernel_regularizer:權重規范化函數
-
bias_regularizer:偏置值規范化方法
-
activity_regularizer:輸出的規范化方法
-
kernel_constraint:權重變化限制函數
- bias_constraint:偏置值變化限制函數
Dense方法的使用示例:
keras.layers.Dense(512, activation= 'sigmoid', input_dim= 2, use_bias= True)
- 這里定義了一個有512個節點,使用sigmoid激活函數的神經層,注意定義第一層的時候需要制定數據輸入的形狀,即input_dim,這樣才能讓數據正常喂進網絡!
3. keras.layers.embeddings的Embedding 方法
- 單詞嵌入是使用密集的矢量表示來表示單詞和文檔的一類方法。
- 詞嵌入是對傳統的詞袋模型編碼方案的改進,傳統方法使用大而稀疏的矢量來表示每個單詞或者在矢量內對每個單詞進行評分以表示整個詞匯表,這些表示是稀疏的,因為每個詞匯的表示是巨大的,給定的詞或文檔主要由零值組成的大向量表示。
- 在詞嵌入中,單詞由密集向量表示,其中向量表示將單詞投影到連續向量空間中,向量空間中的單詞的位置是從文本中學習的,並且基於在使用單詞時圍繞單詞的單詞。
- 學習到的向量空間中的單詞的位置被稱為它的嵌入:Embedding。
- 從文本學習單詞嵌入方法的兩個流行例子包括:
- Word2Vec.
- GloVe.
- 可以將詞嵌入學習作為深度學習模型的一部分。
- Embedding層只能作為深度模型的第一層。
- Keras提供了一個Embedding層,適用於文本數據的神經網絡。
它要求輸入數據是整數編碼的,所以每個字都用一個唯一的整數表示。這個數據准備步驟可以使用Keras提供的Tokenizer API來執行。
嵌入層用隨機權重進行初始化,並將學習訓練數據集中所有單詞的嵌入。
它是一個靈活的圖層,可以以多種方式使用,例如:
- 它可以單獨使用來學習一個單詞嵌入,以后可以保存並在另一個模型中使用。
- 它可以用作深度學習模型的一部分,其中嵌入與模型本身一起學習。
- 它可以用來加載預先訓練的詞嵌入模型,這是一種遷移學習。
嵌入層被定義為網絡的第一個隱藏層。它必須指定3個參數:
- input_dim:這是文本數據中詞匯的取值可能數。例如,如果您的數據是整數編碼為0-9之間的值,那么詞匯的大小就是10個單詞;
- output_dim:這是嵌入單詞的向量空間的大小。它為每個單詞定義了這個層的輸出向量的大小。例如,它可能是32或100甚至更大,可以視為具體問題的超參數;
- input_length:這是輸入序列的長度,就像您為Keras模型的任何輸入層所定義的一樣,也就是一次輸入帶有的詞匯個數。例如,如果您的所有輸入文檔都由1000個字組成,那么input_length就是1000。
例如,下面定義一個詞匯表為200的嵌入層(例如從0到199的整數編碼的字,包括0到199),一個32維的向量空間,其中將嵌入單詞,以及輸入文檔,每個文本有50個單詞。
e = Embedding(input_dim=200, output_dim=32, input_length=50)
嵌入層自帶學習的權重,如果將模型保存到文件中,則將包含嵌入圖層的權重。
嵌入層的輸出是一個二維向量,每個單詞在輸入文本(輸入文檔)序列中嵌入一個。
如果希望直接將Dense層接到Embedding層后面,則必須先使用Flatten層將Embedding層的2D輸出矩陣平鋪為一維矢量。
學習 Embedding的例子
4. keras.layers.core 的Flatten層
- Flatten層的實現在Keras.layers.core.Flatten()類中。
- Flatten層用來將輸入“壓平”,即把多維的輸入一維化,常用在從卷積層到全連接層的過渡。Flatten不影響batch的大小。
from keras.models import Sequential from keras.layers.core import Flatten from keras.layers.convolutional import Convolution2D from keras.utils.vis_utils import plot_model model = Sequential() model.add(Convolution2D(64,3,3,border_mode="same",input_shape=(3,32,32))) # now:model.output_shape==(None,64,32,32) model.add(Flatten()) # now: model.output_shape==(None,65536) plot_model(model, to_file='Flatten.png', show_shapes=True)
為了理解以上網絡模型的Flatten層的作用,以上神經網絡模型可視化如下:
經驗1:Anaconda環境下安裝keras-contrib
第一步:找到anaconda安裝文件夾下的Script;
第二步 在Script文件夾位置輸入cmd回車進入Script文件夾下;
第三步:輸入pip install git+https://www.github.com/farizrahman4u/keras-contrib.git
命令,等待安裝成功。