我正在使用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
对应于单个输入渠道(而不是3
与RGB
)。最后,16
意味着我将16
中有conv layer
个过滤器。
我是否正确解释了这一点?
健
同样,conv和Pooling图层中的步幅形状定义为[1, 1, 1, 1]
。
此形状的尺寸是否与filter_shape
的尺寸相对应?
如果是这样,这就是我感到困惑的原因。似乎单词矢量表示的性质意味着步幅长度应为[1, embedding_size, 1, 1]
,这意味着我希望每个过滤器在一个通道上一次一个字地移动窗口。
答案 0 :(得分:1)
过滤器
我是否正确解释了这一点?
是的,确实。
Strides
此形状的尺寸是否与尺寸相对应 filter_shape?
是的,它对应于您在输入嵌入中对滤镜进行卷积的步幅。
似乎是单词矢量表示的本质 表示步长应为[1,embedding_size,1,1] 这意味着我想一次一个地移动窗口一个字 每个过滤器的通道。
注意填充策略 - conv2d
中的填充设置为VALID
。这意味着没有填充。由于嵌入尺寸中的滤镜尺寸完全覆盖了输入,因此它只能放置一次而不考虑沿此尺寸的步幅。
换句话说 - 您可以独立于步幅沿着嵌入维度进行一次卷积。