Tensorflow maxpool与动态ksize

时间:2017-04-23 17:05:07

标签: python tensorflow

我在TensorFlow上有一个卷积层的代码。该层是更大的计算图的一部分。

# Define the shape of the filter
filter_shape = [1,
                config.char_filter_size,
                config.dim_char,
                config.dim_char]

# Define the convolutional layer weights and biases
W_conv = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1),
                     name="W_conv")
b_conv = tf.Variable(tf.constant(0.1, shape=[config.dim_char]),
                     name="b_conv")
# Do 2d convolution
conv = tf.nn.conv2d(char_embeddings,
                    W_conv,
                    strides=[1, 1, 1, 1],
                    padding="VALID",
                    name="conv")
# Apply nonlinearity
# h_conv has the same shape as conv
h_conv = tf.nn.relu(tf.nn.bias_add(conv, b_conv),
                    name="conv_relu")
# Maxpooling h_conv over dim 2 (char dim)

# ERROR HERE
conv_pooled = tf.nn.max_pool(h_conv,
                             ksize=[1, 1, tf.shape(h_conv)[-2], 1],
                             strides=[1, 1, 1, 1],
                             padding='VALID',
                             name="conv_max_pool")

尝试运行时,我收到错误:

  

TypeError:参数'ksize'的预期int而不是tf.Tensor shape =()dtype = int32。

tf.nn.max_pool无法处理动态ksize

3 个答案:

答案 0 :(得分:6)

您似乎只想在其中一个可能具有动态尺寸的尺寸上找到最大值。 如果是这种情况,最好使用tf.reduce_max()函数代替tf.nn.max_pool()

tf.reduce_max(
    h_conv,
    axis=2,
    keep_dims=True
)

我设置keep_dims=True因为它与最大池工作时的结果相对应,但如果设置keep_dims=False,则可能更容易使用结果。

答案 1 :(得分:2)

问题不在于'动态ksize`。 tf.nn.max_pool需要

  

长度> gt = 4的整数列表

你有一个列表,但第3个元素是not an integer但是

  

类型为tf.int32的张量。

所以你应该在会话中评估这个值,从中提取int,然后才能使用它。

答案 2 :(得分:0)

如前所述,k_size需要一个整数列表而不是张量列表。但是,已应用修复程序。您可以使用:

from tensorflow.python.ops import gen_nn_ops
conv_pooled = gen_nn_ops.max_pool_v2(
conv,
ksize=[1,1, tf.shape(h_conv)[-2], 1],
strides=[1, 1, 1, 1],
padding='VALID',
name="pool")