2017-10-15 166 views
2

有沒有辦法在tensorflow操作中使用具有動態形狀的張量形狀,而無需在會話中對其進行評估? 例如,考慮以下因素:在張量流操作中使用具有動態形狀的張量形狀

activation = tf.nn.relu(conv_plus_b, name=scope.name) #has shape [None, None, 700,1] 
conv_len =activation.shape[1] 
pool = tf.nn.max_pool(activation, ksize=[1,conv_len,1,1], strides=[1,1,1,1], padding='VALID') 

運行這段代碼引發錯誤:TypeError: Expected int for argument 'ksize' not Dimension(None)

所以我的問題是:有沒有任何方式使用這種動態形狀來定義tensorflow操作的形狀參數,而無需在會話中對其進行評估?

我發現了一個類似的問題:下面的解決方案提出了使用動態形狀tensorflow進行調整操作 https://groups.google.com/a/tensorflow.org/forum/#!topic/discuss/BlguDbTxCAk

n = tf.shape(foo)[0] 
tf.reshape(foo, tf.pack([n, 1])) 

tf.pack已被棄用。我不確定tf.stack是否可以在tf.reshape操作中工作,但在tf.nn.max_pool中使用它會拋出錯誤TypeError: Expected list for attr ksize

我知道形狀函數有不同的變體。我已經嘗試過activation.get_shape()[1](我聽說它適用於靜態形狀),activation.shape [1]和tf.shape(激活)[1]。他們都拋出錯誤。

非常感謝您關注此事。

回答

1

tf.nn.max_pool()不支持動態大小,ksize需要是恆定的,而不是您可以使用tf.reduce_max(),

import tensorflow as tf 
    conv_plus_b = tf.placeholder(tf.float32, shape=[None, None, 700, 1]) 
    activation = tf.nn.relu(conv_plus_b) #has shape [None, None, 700,1] 
    # conv_len = tf.shape(conv_plus_b)[1] 
    # pool = tf.nn.max_pool(activation, ksize=[1,conv_len,1,1], strides=[1,1,1,1], padding='VALID') 
    pool = tf.reduce_max(activation, axis=1, keep_dims=True) 

更多細節檢查以下鏈接:

Tensorflow maxpool with dynamic ksize

https://github.com/tensorflow/tensorflow/issues/9394

https://github.com/tensorflow/tensorflow/issues/4746

相關問題