具有动态ksize的Tensorflow maxpool

Fil*_*ixo 5 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")
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sty*_*rke 6

您似乎只想在其中一个尺寸上找到最大值,这些尺寸可能是动态尺寸.如果是这种情况,你可能最好tf.reduce_max()不要使用该功能tf.nn.max_pool().

tf.reduce_max(
    h_conv,
    axis=2,
    keep_dims=True
)
Run Code Online (Sandbox Code Playgroud)

我设置,keep_dims=True因为它对应于最大池工作时会得到的结果,但如果设置,可能更容易使用结果keep_dims=False.