Keras系列之卷積神經網路處理序列

2021-09-10 09:04:31 字數 3070 閱讀 1404

目錄

1.背景

2.序列資料的一維卷積

3.序列資料的一維池化

4.一維卷積神經網路的實現

5.結合 cnn 和 rnn 來處理長序列

5.1 一維卷積神經網路的缺點

5.2 結合的優點

5.3 實現結合一維卷積基和 gru 層的模型

卷積神經網路在計算機視覺領域表現優異,同樣也讓它對序列處理特別有效。時間可以被看作乙個空間維度,就像二維影象的高度或寬度。對於某些序列處理問題,這種一維卷積神經網路的效果可以媲美 rnn,而且計算代價通常要小很多。最近,一維卷積神經網路[通常與空洞卷積核(dilated kernel)一起使用]已經在音訊生成和機器翻譯領域取得了巨大成功。除了這些具體的成就,人們還早已知道,對於文字分類和時間序列**等簡單任務,小型的一維卷積神經網路可以替代 rnn,而且速度更快。

一維卷積層可以識別序列中的區域性模式。因為對每個序列段執行相同的輸入變換,所以在句子中某個位置學到的模式稍後可以在其他位置被識別,這使得一維卷積神經網路具有平移不變性(對於時間平移而言)。舉個例子,使用大小為 5 的卷積視窗處理字串行的一維卷積神經網路,應該能夠學習長度不大於 5 的單詞或單詞片段,並且應該能夠在輸入句子中的任何位置識別這些單詞或單詞段。因此,字元級的一維卷積神經網路能夠學會單詞構詞法。

二維池化運算,比如二維平均池化和二維最大池化,在卷積神經網路中用於對影象張量進行空間下取樣。一維也可以做相同的池化運算:從輸入中提取一維序列段(即子串行),然後輸出其最大值(最大池化)或平均值(平均池化)。與二維卷積神經網路一樣,該運算也是用於降低一維輸入的長度(子取樣)。

keras 中的一維卷積神經網路是 conv1d 層,其介面類似於 conv2d。它接收的輸入是形狀為 (samples, time, features) 的三維張量,並返回類似形狀的三維張量。卷積視窗是時間軸上的一維視窗(時間軸是輸入張量的第二個軸)。

model = sequential()

model.add(layers.embedding(max_features, 128, input_length=max_len))

model.add(layers.conv1d(32, 7, activation='relu'))

model.add(layers.maxpooling1d(5))

model.add(layers.conv1d(32, 7, activation='relu'))

model.add(layers.globalmaxpooling1d())

model.add(layers.dense(1))

model.summary()

model.compile(optimizer=rmsprop(lr=1e-4),

loss='binary_crossentropy',

metrics=['acc'])

history = model.fit(x_train, y_train,

epochs=10,

batch_size=128,

validation_split=0.2)

解析:是 conv1d 層和 maxpooling1d層的堆疊,最後是乙個全域性池化層或 flatten 層,將三維輸出轉換為二維輸出,讓你可以向模型中新增乙個或多個 dense 層,用於分類或回歸。

一維卷積神經網路可以使用更大的卷積視窗。對於二維卷積層,3×3 的卷積視窗包含 3×3=9 個特徵向量;但對於一位卷積層,大小為 3 的卷積視窗只包含 3個卷積向量。因此,你可以輕鬆使用大小等於 7 或 9 的一維卷積視窗。

結果:驗證精度略低於 lstm,但在 cpu 和gpu 上的執行速度都要更快。使用正確的輪數(4 輪)重新訓練這個模型,然後在測試集上執行。這個結果可以讓我們確信,在單詞級的情感分類任務上,一維卷積神經網路可以替代迴圈網路,並且速度更快、計算代價更低。

一維卷積神經網路分別處理每個輸入序列段,所以它對時間步的順序不敏感(這裡所說順序的範圍要大於區域性尺度,即大於卷積視窗的大小),這一點與 rnn 不同。

結合卷積神經網路的速度和輕量與 rnn 的順序敏感性,可以在 rnn 前面使用一維卷積神經網路作為預處理步驟(見圖 6-30)。對於那些非常長,以至於 rnn 無法處理的序列(比如包含上千個時間步的序列),這種方法尤其有用。卷積神經網路可以將長的輸入序列轉換為高階特徵組成的更短序列(下取樣)。然後,提取的特徵組成的這些序列成為網路中 rnn 的輸入。

結構:兩個 conv1d 層,然後是乙個 gru 層。

model = sequential()

model.add(layers.conv1d(32, 5, activation='relu',

input_shape=(none, float_data.shape[-1])))

model.add(layers.maxpooling1d(3))

model.add(layers.conv1d(32, 5, activation='relu'))

model.add(layers.gru(32, dropout=0.1, recurrent_dropout=0.5))

model.add(layers.dense(1))

model.summary()

model.compile(optimizer=rmsprop(), loss='mae')

history = model.fit_generator(train_gen,

steps_per_epoch=500,

epochs=20,

validation_data=val_gen,

validation_steps=val_steps)

結果:效果不如只用正則化 gru,但速度要快很多

參考:《python深度學習》

卷積神經網路 Keras 由淺入深

python mathematics 卷積神經網路能夠有效的處理影象檔案,當然換一種說法就是能夠有效處理矩陣。其關鍵部分就是 卷積核 過濾器 的生成。當然還有一些其他的基礎操作。對於卷積核 卷積核的特徵 init filters,kernel size,strides 1 1 padding val...

keras卷積神經網路舉例

特徵圖深度在增加 從32到128,但尺寸在變小 from keras import layers from keras import model 輸入尺寸為150 150 3,展平後是7 7 128 model model.sequential 二維卷積核 提取的圖塊大小 一般3 3 9個特徵向量,...

Keras實現卷積神經網路

1 coding utf 8 2 3created on sun jan 20 11 25 29 201945 author zhen 6 78 import numpy as np 9from keras.datasets import mnist 10from keras.models impo...