源碼:https://github.com/keras-team/keras/blob/master/examples/imdb_bidirectional_lstm.py
1.imdb數據集
數據集來自 IMDB 的 25,000 條電影評論,以情緒(正面/負面)標記。評論已經過預處理,並編碼為詞索引(整數)的序列表示。為了方便起見,將詞按數據集中出現的頻率進行索引,例如整數 3 編碼數據中第三個最頻繁的詞。
這允許快速篩選操作,例如:「只考慮前 10,000 個最常用的詞,但排除前 20 個最常見的詞」。
作為慣例,0 不代表特定的單詞,而是被用於編碼任何未知單詞。
from keras.datasets import imdb (x_train, y_train), (x_test, y_test) = imdb.load_data(path="imdb.npz", num_words=None, skip_top=0, maxlen=None, seed=113, start_char=1, oov_char=2, index_from=3)
-
返回:
- 2 個元組:
- x_train, x_test: 序列的列表,即詞索引的列表。如果指定了
num_words
參數,則可能的最大索引值是num_words-1
。如果指定了maxlen
參數,則可能的最大序列長度為maxlen
。 - y_train, y_test: 整數標簽列表 (1 或 0)。
-
參數:
- path: 如果你本地沒有該數據集 (在
'~/.keras/datasets/' + path
),它將被下載到此目錄。 - num_words: 整數或 None。要考慮的最常用的詞語。任何不太頻繁的詞將在序列數據中顯示為
oov_char
值。 - skip_top: 整數。要忽略的最常見的單詞(它們將在序列數據中顯示為
oov_char
值)。 - maxlen: 整數。最大序列長度。 任何更長的序列都將被截斷。
- seed: 整數。用於可重現數據混洗的種子。
- start_char: 整數。序列的開始將用這個字符標記。設置為 1,因為 0 通常作為填充字符。
- oov_char: 整數。由於
num_words
或skip_top
限制而被刪除的單詞將被替換為此字符。 - index_from: 整數。使用此數以上更高的索引值實際詞匯索引的開始。
- path: 如果你本地沒有該數據集 (在
//主要還是關注num_words和maxlen兩個參數吧,這兩個都在我的ibdm_Bilstm.ipynb里試了。
num_words=2000,意思是只取下標為前2000的,出現次數最頻繁的前2000個單詞;maxlen=500是針對評論來說的,只取長度≤500的。
2.數據預處理
x_train=sequence.pad_sequences(x_train,maxlen=maxlen)
keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32', padding='pre', truncating='pre', value=0.0)
將多個序列截斷或補齊為相同長度。
該函數將一個 num_samples
的序列(整數列表)轉化為一個 2D Numpy 矩陣,其尺寸為 (num_samples, num_timesteps)
。 num_timesteps
要么是給定的 maxlen
參數,要么是最長序列的長度。
比 num_timesteps
短的序列將在末端以 value
值補齊。
比 num_timesteps
長的序列將會被截斷以滿足所需要的長度。補齊或截斷發生的位置分別由參數 pading
和 truncating
決定。
向前補齊為默認操作。
參數
- sequences: 列表的列表,每一個元素是一個序列。
- maxlen: 整數,所有序列的最大長度。
- dtype: 輸出序列的類型。 要使用可變長度字符串填充序列,可以使用
object
。 - padding: 字符串,'pre' 或 'post' ,在序列的前端補齊還是在后端補齊。
- truncating: 字符串,'pre' 或 'post' ,移除長度大於
maxlen
的序列的值,要么在序列前端截斷,要么在后端。 - value: 浮點數,表示用來補齊的值。
返回
- x: Numpy 矩陣,尺寸為
(len(sequences), maxlen)
。
異常
- ValueError: 如果截斷或補齊的值無效,或者序列條目的形狀無效。
//默認補齊和截斷都是在序列前端pre的。
3. Sequential順序模型
順序模型是多個網絡層的線性堆疊。
你可以通過將網絡層實例的列表傳遞給 Sequential
的構造器,來創建一個 Sequential
模型。見
4. Embedding層
keras.layers.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)
將正整數(索引值)轉換為固定尺寸的稠密向量。 例如: [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]。
該層只能用作模型中的第一層。
參數
- input_dim: int > 0。詞匯表大小, 即,最大整數 index + 1。
- output_dim: int >= 0。詞向量的維度。
- embeddings_initializer:
embeddings
矩陣的初始化方法 (詳見 initializers)。默認是均勻分布。 - embeddings_regularizer:
embeddings
matrix 的正則化方法 (詳見 regularizer)。 - embeddings_constraint:
embeddings
matrix 的約束函數 (詳見 constraints)。 - mask_zero: 是否把 0 看作為一個應該被遮蔽的特殊的 "padding" 值。 這對於可變長的 循環神經網絡層 十分有用。 如果設定為
True
,那么接下來的所有層都必須支持 masking,否則就會拋出異常。 如果 mask_zero 為True
,作為結果,索引 0 就不能被用於詞匯表中 (input_dim 應該與 vocabulary + 1 大小相同)。 - input_length: 輸入序列的長度,當它是固定的時。 如果你需要連接
Flatten
和Dense
層,則這個參數是必須的 (沒有它,dense 層的輸出尺寸就無法計算)。
輸入尺寸
尺寸為 (batch_size, sequence_length)
的 2D 張量。
輸出尺寸
尺寸為 (batch_size, sequence_length, output_dim)
的 3D 張量。
5.Bidirectional
keras.layers.Bidirectional(layer, merge_mode='concat', weights=None)
RNN 的雙向封裝器,對序列進行前向和后向計算。
參數
- layer:
Recurrent
實例。 - merge_mode: 前向和后向 RNN 的輸出的結合模式。 為 {'sum', 'mul', 'concat', 'ave', None} 其中之一。 如果是 None,輸出不會被結合,而是作為一個列表被返回。
異常
- ValueError: 如果參數
merge_mode
非法。
6.LSTM
keras.layers.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal',
bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)
//這個參數也太多了吧。
參數
- units: 正整數,輸出空間的維度。(也就是一個里面有多少個size吧)
- activation: 要使用的激活函數 (詳見 activations)。 如果傳入
None
,則不使用激活函數 (即 線性激活:a(x) = x
)。 - recurrent_activation: 用於循環時間步的激活函數 (詳見 activations)。 默認:分段線性近似 sigmoid (
hard_sigmoid
)。 如果傳入None
,則不使用激活函數 (即 線性激活:a(x) = x
)。 - use_bias: 布爾值,該層是否使用偏置向量。
- kernel_initializer:
kernel
權值矩陣的初始化器, 用於輸入的線性轉換 (詳見 initializers)。
給出部分,其中units是必須的。
model.add(Bidirectional(LSTM(64)))
7.Dropout
keras.layers.Dropout(rate, noise_shape=None, seed=None)
將 Dropout 應用於輸入。
Dropout 包括在訓練中每次更新時, 將輸入單元的按比率隨機設置為 0, 這有助於防止過擬合。
參數
- rate: 在 0 和 1 之間浮動。需要丟棄的輸入比例。
- noise_shape: 1D 整數張量, 表示將與輸入相乘的二進制 dropout 掩層的形狀。 例如,如果你的輸入尺寸為
(batch_size, timesteps, features)
,然后 你希望 dropout 掩層在所有時間步都是一樣的, 你可以使用noise_shape=(batch_size, 1, features)
。 - seed: 一個作為隨機種子的 Python 整數。
//這里timesteps應該是可以說是上例中的句子長度10,共進行10個時間步能夠將句子讀完。
model.add(Dropout(0.5))
8.Dense
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)
常用的全連接層。
Dense
實現以下操作: output = activation(dot(input, kernel) + bias)
其中 activation
是按逐個元素計算的激活函數,kernel
是由網絡層創建的權值矩陣,以及 bias
是其創建的偏置向量 (只在 use_bias
為 True
時才有用)。
- 注意: 如果該層的輸入的秩大於2,那么它首先被展平然后 再計算與
kernel
的點乘。
參數
- units: 正整數,輸出空間維度。
- activation: 激活函數 (詳見 activations)。 若不指定,則不使用激活函數 (即,「線性」激活:
a(x) = x
)。 - use_bias: 布爾值,該層是否使用偏置向量。
- kernel_initializer:
kernel
權值矩陣的初始化器 (詳見 initializers)。 - bias_initializer: 偏置向量的初始化器 (see initializers).
- kernel_regularizer: 運用到
kernel
權值矩陣的正則化函數 (詳見 regularizer)。 - bias_regularizer: 運用到偏置向的的正則化函數 (詳見 regularizer)。
- activity_regularizer: 運用到層的輸出的正則化函數 (它的 "activation")。 (詳見 regularizer)。
- kernel_constraint: 運用到
kernel
權值矩陣的約束函數 (詳見 constraints)。 - bias_constraint: 運用到偏置向量的約束函數 (詳見 constraints)。
輸入尺寸
nD 張量,尺寸: (batch_size, ..., input_dim)
。 最常見的情況是一個尺寸為 (batch_size, input_dim)
的 2D 輸入。
輸出尺寸
nD 張量,尺寸: (batch_size, ..., units)
。 例如,對於尺寸為 (batch_size, input_dim)
的 2D 輸入, 輸出的尺寸為 (batch_size, units)
。
//但是實際上,參數里並沒有input_dim這個參數,為什么在應用時會有呢?如下: //運行是沒有問題的。
model = Sequential() model.add(Dense(32, input_shape=(16,))) # 現在模型就會以尺寸為 (*, 16) 的數組作為輸入, # 其輸出數組的尺寸為 (*, 32) # 在第一層之后,你就不再需要指定輸入的尺寸了: model.add(Dense(32))