有没有办法在操作中使用具有动态形状的张量的形状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')
Run Code Online (Sandbox Code Playgroud)
运行此代码会引发错误:TypeError: Expected int for argument 'ksize' not Dimension(None)。
所以我的问题是:有没有办法使用这种动态形状来定义tensorflow操作的形状参数,而无需在会话中对其进行评估?
我在
以下网站上发现了类似的问题:https :
//groups.google.com/a/tensorflow.org/forum/#!topic/ discuss/BlguDbTxCAk 提出了以下解决方案,用于在tensorflow使用动态形状时执行调整大小操作:
n = tf.shape(foo)[0]
tf.reshape(foo, tf.pack([n, 1]))
Run Code Online (Sandbox Code Playgroud)
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(activation)[1]。他们都抛出错误。
非常感谢您对此进行调查。
小智 3
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)
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请查看以下链接:
具有动态 ksize 的 Tensorflow maxpool
https://github.com/tensorflow/tensorflow/issues/9394
https://github.com/tensorflow/tensorflow/issues/4746
| 归档时间: |
|
| 查看次数: |
1323 次 |
| 最近记录: |