簡體   English   中英

如何將CNN輸出作為RNN中的輸入序列進行饋送(使用Tensorflow)

[英]How to feed CNN output as input series in a RNN (using Tensorflow)

我已經使用tensorflow實現了一個簡單的CNN。 到目前為止,我以前在最后一個卷積層上放置了一個大小為2的完全連接層,以區分我的2個類。 現在,我要將最后一個卷積層饋送到RNN,然后執行分類。

最后一個卷積層的輸出稱為“ cnn_output”,並且是該形式的張量
<tf.Tensor 'Sigmoid_1:0' shape=(?, 168, 32) dtype=float32>

在將其喂入rnn之前,我使用以下命令將其拆分:
input_series = tf.split(axis=2, num_or_size_splits= 32, value = cnn_output)

分割的結果是該類型的32張量:
<tf.Tensor 'split:0' shape=(?, 168, 1) dtype=float32>

rnn的變量定義如下:
cell = tf.contrib.rnn.BasesLSTMCell(32, state_is_tuple=True)
cell_state = tf.placeholder(tf.float32, [168,32])
hidden_state = tf.placeholder(tf.float32, [168,32])
init_state = tf.contrib.rnn.LSTMStateTuple( cell_state, hidden_state)

喂cnn的輸出到rnn我使用此命令
states_series, current_state = tf.nn.static_rnn(cell, input_series, init_state)

在這一行,我得到以下錯誤

ValueError: linear is expecting 2D arguments: [TensorShape([Dimension(None), Dimension(168), Dimension(1)]), TensorShape([Dimension(168), Dimension(32)])]
在我看來,張量的第一個未知維度似乎有問題,但我不確定如何處理。
我嘗試將cell_state和hidden_​​state的形狀更改為[None,168,32],但似乎沒有幫助。
我也嘗試使用dynamic_rnn(不確定與static_rnn的區別),但也沒有用

編輯更新:我設法通過使用以下命令重塑rnn的input_series來運行代碼而不會出現錯誤:

input_series = [tf.reshape(ipt,[-1,168 ])for ipt in input_series]

導致像這樣的張量

<tf.Tensor 'Reshape_21:0' shape=(?, 168) dtype=float32>

雖然我不確定rnn單元是否正常工作。 我將檢查並更新

我認為您的錯誤來自您的占位符是2D而非3D的事實。 您忘記添加批次尺寸。

嘗試這樣定義它們:

cell_state = tf.placeholder(tf.float32, [None,168,32])
hidden_state = tf.placeholder(tf.float32, [None,168,32])

(鑒於您的輸入各有1個通道,您可能必須將32更改為1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM