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()
做什么,使其具有如此出色的性能?
归档时间: |
|
查看次数: |
85 次 |
最近记录: |