我正在通过参考论文(Kim, 2014)解决文本分类问题。
然后我发现在下面的两个模型之间,左边的模型(模型1)所花的时间是右边的模型(模型2)的2.5倍左右。
我认为两个模型的权重参数数目相同。
为什么两个模型之间存在时间差异?
*两个模型的输入数据内容相同。只是改变了形状。
我使用了 tf.nn.conv2d 。滤波器的形状和步幅如下
模型1:3x9x1x过滤器数量,跨度3
模型2:1x9x3x过滤器数量,跨度1
其他都一样
*在上图中,宽度表示'self.embedding_dim',高度表示'self.max_length'。
pooled_outputs = []
with tf.name_scope("conv-maxpool-3"):
# Convolution Layer
filter_shape = [3, self.embedding_dim, 1, self.num_filters]
W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
b = tf.Variable(tf.constant(0.1, shape=[self.num_filters]), name="b")
conv = tf.nn.conv2d(
self.embedded_chars_expanded,
W,
strides=[1, 1, 3, 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, self.max_length - 3 + 1, 1, 1],
strides=[1, 1, 1, 1],
padding='VALID',
name="pool")
pooled_outputs.append(pooled)
----------------------------------------------------------------------
pooled_outputs = []
with tf.name_scope("conv-maxpool-1"):
# Convolution Layer
filter_shape = [1, self.embedding_dim, 3, self.num_filters]
W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
b = tf.Variable(tf.constant(0.1, shape=[self.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, self.max_length - 1 + 1, 1, 1],
strides=[1, 1, 1, 1],
padding='VALID',
name="pool")
pooled_outputs.append(pooled)
答案 0 :(得分:1)
在第一个模型中,您将跨步设置为[1, 1, 3, 1]
,但未指定数据顺序,因此它默认为NHWC
,即(num_batches,高度,宽度,通道)(选中docu)。因此,步幅3适用于宽度,而不是高度,如模型1的图片所示。因为您使用的是VALID
填充,所以宽度上的跨度为3毫无效果。
因此,基本上,您对模型1的描述是错误的:在步骤2中,它不会跳到第四行,而是跳到第二行。含义模型1的卷积约为模型2的3倍。
还有其他一些因素可能会导致速度差异-也许模型2可以在GPU上更好地并行化,但这很难判断。