我在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
?
答案 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")