Tensorflow占位符vs Tensorflow常数vs numpy数组

Pra*_*ate 5 python machine-learning deep-learning conv-neural-network tensorflow

我试图在具有卷积层,然后是池化层,最后是整流线性单元(ReLU)激活层的卷积神经网络上运行前向传递。有关输入数据和卷积层过滤器的详细信息如下:

  • X:具有shape的4维输入数据[N, H, W, C],其中N = 60000批处理大小,H = 32输入图像的高度,输入图像W = 32的宽度以及输入图像中C = 1的通道数。
  • W:具有shape的4维卷积滤波器[F, F, C, Cout],其中,F = 3是滤波器的高度和宽度,C = 1是输入图像Cout = 6中通道的数量,是输出图像中通道的数量。

有三种方法可以做到这一点。

方法1:不使用tf.constant()tf.placeholder()

import numpy as np
import tensorflow as tf

X = np.random.random([60000, 32, 32, 1])
W = np.random.random([3, 3, 1, 6])

C = tf.nn.conv2d(X, W, strides=[1,1,1,1], padding="VALID")
P = tf.nn.avg_pool(C, ksize=[1,2,2,1], strides=[1,2,2,1], padding="VALID")
A = tf.nn.relu(P)

with tf.Session() as sess:
  result = sess.run(A)       # Takes 14.98 seconds
Run Code Online (Sandbox Code Playgroud)

方法2:使用 tf.constant()

import numpy as np
import tensorflow as tf

X = tf.constant(np.random.random([60000, 32, 32, 1]), dtype=tf.float64)
W = tf.constant(np.random.random([3, 3, 1, 6]), dtype=tf.float64)

C = tf.nn.conv2d(X, W, strides=[1,1,1,1], padding="VALID")
P = tf.nn.avg_pool(C, ksize=[1,2,2,1], strides=[1,2,2,1], padding="VALID")
A = tf.nn.relu(P)

with tf.Session() as sess:
  result = sess.run(A)       # Takes 14.73 seconds
Run Code Online (Sandbox Code Playgroud)

方法3:使用 tf.placeholder()

import numpy as np
import tensorflow as tf 

x = np.random.random([60000, 32, 32, 1])
w = np.random.random([3, 3, 1, 6])

X = tf.placeholder(dtype=tf.float64, shape=[None, 32, 32, 1])
W = tf.placeholder(dtype=tf.float64, shape=[3, 3, 1, 6])

C = tf.nn.conv2d(X, W, strides=[1,1,1,1], padding="VALID")
P = tf.nn.avg_pool(C, ksize=[1,2,2,1], strides=[1,2,2,1], padding="VALID")
A = tf.nn.relu(P)

with tf.Session() as sess:
  result = sess.run(A, feed_dict={X:x, W:w})       # Takes 3.21 seconds
Run Code Online (Sandbox Code Playgroud)

方法3(使用tf.placeholder())的运行速度几乎比方法1和方法2快4-5倍。所有这些实验都是在NVIDIA GeForce GTX 1080 GPU上进行的。

问题是,为什么仅tf.placeholder()在方法3中使用方法3和在方法1和方法2中进行比较,我们就能获得将近4-5倍的加速?在其底层实现中,正在tf.placeholder()做什么,使其具有如此出色的性能?