在张量流操作中使用具有动态形状的张量的形状

时间:2017-10-15 23:11:24

标签: tensorflow

有没有办法在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操作的形状参数而不在会话中进行评估?

我发现了一个类似的问题: https://groups.google.com/a/tensorflow.org/forum/#!topic/discuss/BlguDbTxCAk 提出了以下解决方案,使用动态形状在tensorflow中执行调整大小操作:

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 个答案:

答案 0 :(得分: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)

了解更多详情,请查看以下链接:

Tensorflow maxpool with dynamic ksize

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

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