keras實例學習-雙向LSTM進行imdb情感分類


源碼:https://github.com/keras-team/keras/blob/master/examples/imdb_bidirectional_lstm.py

keras中文文檔

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: 整數。使用此數以上更高的索引值實際詞匯索引的開始。

 //主要還是關注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_initializerembeddings 矩陣的初始化方法 (詳見 initializers)。默認是均勻分布。
  • embeddings_regularizerembeddings matrix 的正則化方法 (詳見 regularizer)。
  • embeddings_constraintembeddings 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 的雙向封裝器,對序列進行前向和后向計算。

參數

  • layerRecurrent 實例。
  • 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_initializerkernel 權值矩陣的初始化器, 用於輸入的線性轉換 (詳見 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_initializerkernel 權值矩陣的初始化器 (詳見 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))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM