TensorFlow - 了解CNN文本分类的过滤器和步幅形状

时间:2017-10-25 21:44:24

标签: python tensorflow conv-neural-network text-classification

我正在使用CNNs中的TensorFlow文字分类上查看Denny Britz的tutorial。滤镜和步幅形状在图像领域中具有完美的意义。但是,当谈到文本时,我对如何正确定义步幅和滤镜形状感到困惑。从Denny的代码中考虑以下两个层:

# Create a convolution + maxpool layer for each filter size
pooled_outputs = []
for i, filter_size in enumerate(filter_sizes):
    with tf.name_scope("conv-maxpool-%s" % filter_size):
        # Convolution Layer
        filter_shape = [filter_size, embedding_size, 1, num_filters]
        W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
        b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b")
        conv = tf.nn.conv2d(
            self.embedded_chars_expanded,
                W,
                strides=[1, 1, 1, 1],
                padding="VALID",
                name="conv")
        # Apply nonlinearity
        h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
        # Maxpooling over the outputs
        pooled = tf.nn.max_pool(
            h,
            ksize=[1, sequence_length - filter_size + 1, 1, 1],
            strides=[1, 1, 1, 1],
            padding='VALID',
            name="pool")
        pooled_outputs.append(pooled)

self.embedded_chars_expanded的形状为[batch_size, max_sentence_length, embedding_size, 1],表示每个批处理成员都是max_sentence_length x embedding_size

的单个通道矩阵

过滤器

假设我的filter_shape为[3, 50, 1, 16]。我将此解释为过滤器将在具有维度3的时间滑过50个单词向量。这是文本,因此1对应于单个输入渠道(而不是3RGB)。最后,16意味着我将16中有conv layer个过滤器。

我是否正确解释了这一点?

同样,conv和Pooling图层中的步幅形状定义为[1, 1, 1, 1]

此形状的尺寸是否与filter_shape的尺寸相对应?

如果是这样,这就是我感到困惑的原因。似乎单词矢量表示的性质意味着步幅长度应为[1, embedding_size, 1, 1],这意味着我希望每个过滤器在一个通道上一次一个字地移动窗口。

1 个答案:

答案 0 :(得分:1)

  

过滤器

     

我是否正确解释了这一点?

是的,确实。

  

Strides

     

此形状的尺寸是否与尺寸相对应   filter_shape?

是的,它对应于您在输入嵌入中对滤镜进行卷积的步幅。

  

似乎是单词矢量表示的本质   表示步长应为[1,embedding_size,1,1]   这意味着我想一次一个地移动窗口一个字   每个过滤器的通道。

注意填充策略 - conv2d中的填充设置为VALID。这意味着没有填充。由于嵌入尺寸中的滤镜尺寸完全覆盖了输入,因此它只能放置一次而不考虑沿此尺寸的步幅。

换句话说 - 您可以独立于步幅沿着嵌入维度进行一次卷积。