根据输入形状的计算是不是存在差异? (带有 Tensorflow 的 Python 中的 CNN)

Posted

技术标签:

【中文标题】根据输入形状的计算是不是存在差异? (带有 Tensorflow 的 Python 中的 CNN)【英文标题】:Is there a difference in computation according to input shape? (CNN in Python with Tensorflow)根据输入形状的计算是否存在差异? (带有 Tensorflow 的 Python 中的 CNN) 【发布时间】:2019-07-07 03:23:36 【问题描述】:

我正在通过参考论文(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)

【问题讨论】:

这个矩阵图是怎么做的? @Tlaloc-ES 我刚刚使用了 MS 电源点。 self.embedded_chars_expanded的形状是什么?我假设它的宽度是 9,如图所示? @kafman 它取决于模型如下:) model1 : 批量大小 x 27(max_length) x 9(embedding_dimension) x 1 // model2 : 批量大小 x 9(max_length) x 9(embedding_dimension) x 3 【参考方案1】:

在第一个模型中,您将步幅设置为[1, 1, 3, 1],并且您没有指定数据顺序,因此默认为NHWC,即(num_batches, height, width, channels)(检查docu) .因此,正如您的模型 1 所示,步幅 3 适用于宽度,而不是高度。因为你使用的是VALID padding,顺便说一下,宽度上的步幅为 3 没有影响。

所以基本上,您对模型 1 的描述是错误的:在第 2 步中,它没有跳到第 4 行,而是跳到第 2 行。这意味着模型 1 计算的卷积数大约是模型 2 的 3 倍。

还有其他可能导致速度差异的因素 - 可能模型 2 可以在 GPU 上更好地并行化,但这很难判断。

【讨论】:

以上是关于根据输入形状的计算是不是存在差异? (带有 Tensorflow 的 Python 中的 CNN)的主要内容,如果未能解决你的问题,请参考以下文章

iOS:使用 playInputClick 与带有音频工具箱的 (1104) 声音文件之间是不是存在性能差异?

PyTorch 中的 nn.functional() 与 nn.sequential() 之间是不是存在计算效率差异

径向功率谱分析

如何处理带有不确定复选框的浏览器差异

带有形状、填充和颜色的 geom_point

SAP中标准价格和实际价格差异是怎么计算和处理的