我在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: Expected int for argument ‘ksize’ not tf.Tensor shape=() dtype=int32.
是tf.nn.max_pool无法处理动态ksize?
您似乎只想在其中一个可能具有动态大小的维度上找到最大值.
如果是这种情况,最好使用 tf.reduce_max()
函数而不是tf.nn.max_pool().
tf.reduce_max( h_conv, axis=2, keep_dims=True )
我设置keep_dims = True,因为它对应于max pooling工作时会得到的结果,但如果设置keep_dims = False,则可能更容易使用结果.