为什么conv2d输出(?,6,1,1)而不是(?,5,1,1)

时间:2017-01-18 11:14:03

标签: tensorflow

我试图理解的是如何为自然语言处理(NLP)创建卷积神经网络。首先,我使用标准体系结构,其中过滤器F在输入矩阵S上滑动,以创建卷积过滤器映射:

enter image description here

下面的代码应该实现卷积步骤,但我不太了解输出维度。请不要对图像感到困惑。在我的代码中, rows 是与图像形成对比的单词嵌入,其中单词嵌入是列。

filter_shape = [
    context_window_size, 
    word_embedding_size, 
    1, 
    num_filters
] # filter_shape: [5, 300, 1, 1]

F = tf.Variable(
    tf.truncated_normal(filter_shape, stddev=0.1), name="F") 
b = tf.Variable(
    tf.constant(1.0, shape=[num_filters], name="b")) # b: (1,)

conv = tf.nn.conv2d(      
    input_S,              # input_S: (?, 10, 300, 1)
    F,                    # F: (5, 300, 1, 1)
    strides=[1, 1, 1, 1],
    padding="VALID",
    name="conv"
) # conv: (?, 6, 1, 1)

h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu") # h: (?, 6, 1, 1)

我期望[5x300]大小的过滤器F[10x300]输入矩阵上滑动,其中10是单词向量的数量,300是它们各自的维度,是{{ 1}}卷积特征向量。如果过滤器被放置在输入矩阵的“开始”并且一次一步地滑过它,则过滤器只能在不超过输入矩阵的情况下进行5步。

从代码中的注释中可以看出,我得到了一个[5x1]卷积特征向量。因此,我很确定我误解了这里发生的事情。

为什么[6x1]标注conv而不是(?, 6, 1, 1)

1 个答案:

答案 0 :(得分:0)

如果您编写连续间隔的所有组合(从0开始索引),您将得到6个案例:

[0,4], [1,5], [2,6], [3,7], [4,8], [5,9]