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



我正在复习Denny Britz关于在TensorFlow中使用CNNs进行text分类的教程。滤镜和跨步形状在图像域中非常有意义。然而,当涉及到文本时,我对如何正确定义步幅和过滤器形状感到困惑。从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]。我将其解释为过滤器将一次在维度为503单词向量上滑动。这是文本,因此1对应于单个输入通道(与具有RGB3相反)。最后,16意味着我将在conv layer中具有16滤波器。

我解释对了吗?

跨步

类似地,在conv层和池化层中的步长形状都被定义为[1, 1, 1, 1]

这个形状的尺寸与filter_shape的尺寸对应吗?

如果是这样的话,这就是我感到困惑的原因。单词向量表示的性质似乎意味着步长应该是[1, embedding_size, 1, 1],这意味着我想在每个滤波器的一个通道上一次移动窗口一个完整的单词。

过滤

我解释对了吗?

没错。

跨步

这个形状的尺寸与过滤器形状?

是的,它对应于在输入嵌入上卷积滤波器的步长。

看起来单词向量表示的性质表示步长应为[1,embedding_size,1,1]意思是我想把窗口一次移动一个完整的单词每个滤波器的通道。

注意填充策略-conv2d中的填充设置为VALID。这意味着不会有填充。由于嵌入维度中的滤波器大小完全覆盖了输入,因此它只能拟合一次,而不考虑沿该维度的步长。

换句话说,你只能沿着嵌入维度进行一次卷积,而与步幅无关。

最新更新