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

Neural network 在TensorFlow中,为什么完全转换层比FC层花费更多的时间?,neural-network,tensorflow,conv-neural-network,Neural Network,Tensorflow,Conv Neural Network,问题:我将基本MNIST示例从Tensorflow转换为完全卷积实现。现在,100次迭代所花费的时间大约是以前的20倍。这是什么原因 我以Tensorflow网站上的基本MNIST示例为例。现在,我将最后一个FC层转换为卷积层,其灵感来自和(或更一般的)这篇文章 所以我改变了这个代码块 with tf.name_scope("Fully_Connected") as scope: W_fc1 = weight_variable([7**2 * 64, 1024], 'Fully_Connec

问题:我将基本MNIST示例从Tensorflow转换为完全卷积实现。现在,100次迭代所花费的时间大约是以前的20倍。这是什么原因

我以Tensorflow网站上的基本MNIST示例为例。现在,我将最后一个FC层转换为卷积层,其灵感来自和(或更一般的)这篇文章

所以我改变了这个代码块

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)
到这个代码块

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秒的时间。完全conv实现大约需要70秒来完成100次迭代

有人能给我一些线索吗?为什么这种卷积实现要花费如此多的时间


非常感谢您的时间和回答通常,卷积层比完全连接的层效率更高,但这是因为它们提供了一种方法,可以显著减少需要优化的参数数量。在这种情况下,如果我没有弄错的话,参数的数量是相同的,因为卷积核应用于输入的整个范围。从某种意义上说,它是卷积层的局部连接方面,为您降低了计算复杂度

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


我个人还没有探索过使用完全卷积网络,但据我所知,目的是提高模型的准确性,而不是提高效率。希望有帮助。

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

NUM_CHANNELS=1
conv1_weights = tf.Variable(
      tf.truncated_normal([5, 5, NUM_CHANNELS, 32],  # 5x5 filter, depth 32.
                          stddev=0.1,
                          seed=SEED))