为什么完全转换层比TensorFlow中的FC层花费更多时间?

时间:2016-04-30 07:11:24

标签: neural-network tensorflow conv-neural-network

问题:我将基本的MNIST示例从Tensorflow转换为完全卷积实现。现在100次迭代比以前长约20倍。是什么原因造成的?

我从Tensorflow网站上获取了基本的MNIST示例。现在我将最终的FC层转换为卷积层,灵感来自this post by Yann LeCunnthis Quora post,或更一般的文章Fully Convolutional Networks for Semantic Segmentation

所以我改变了这个代码块

with tf.name_scope("Fully_Connected") as scope:
  W_fc1 = weight_variable([7**2 * 64, 1024], 'Fully_Connected_layer_1')
  b_fc1 = bias_variable([1024], 'bias_for_Fully_Connected_Layer_1')
  h_pool2_flat = tf.reshape(h_pool2, [-1, 7**2*64])
  h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

到此代码块

with tf.name_scope("FC_conv") as scope:
  W_fcc1 = weight_variable([7,7,64,1024],'FC_conv_1')
  b_fcc1 = bias_variable([1024],'bias_for_FC_conv_1')
  h_fcc1 = tf.nn.relu(tf.nn.conv2d(h_pool2, W_fcc1, strides=[1, 1, 1, 1], padding='VALID')+b_fcc1)

在此更改之后,100次迭代需要70秒而不是几秒钟。也就是说,FC实现在100次迭代中花了5秒钟。 100次迭代的完全转换实现大约需要70秒。

有人能给我一个线索吗?为什么这个卷积实现需要花费更多时间?

非常感谢你的时间和答案

2 个答案:

答案 0 :(得分:1)

通常,卷积层比完全连接层更有效,但这是因为它们提供了一种显着减少需要优化的参数数量的方法。在这种情况下,如果我没有弄错,参数的数量是相同的,因为卷积内核被应用于输入的整个范围。从某种意义上说,卷积层的本地连接方面可以为您带来降低的计算复杂度。

因此,最大的区别是卷积层需要将每个值与7x7内核进行卷积。我听过的传统观点是,最好将内核的大小保持在3x3或最多5x5,这部分是由于使用更大内核进行卷积的计算开销。

我还没有亲自探索过使用完全卷积网络,但从我可以收集的内容来看,目的是提高模型的准确性,而不是提高效率。希望有所帮助。

答案 1 :(得分:0)

你的卷积太大了。应该更像这样

foreach(var image in webBrowser1.Document.GetElementsByTagName("img"))
{
    var src = image.GetAttribute("src");
    //use src here
}

请参阅https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/mnist/convolutional.py