Python TensorFlow对简单网络的性能差吗?

Python TensorFlow对简单网络的性能差吗?,python,performance,machine-learning,tensorflow,Python,Performance,Machine Learning,Tensorflow,我一直在各种框架中试验简单的基本(入门教程级)神经网络,但对我在其中看到的性能感到困惑 例如,简单网络from(在具有30个隐藏节点的网络中使用L2随机梯度下降的MNIST数字识别)的性能比稍微调整(使用中建议的小批量矢量化)的版本差得多(每个历元的长度约为8倍,参数相同) 在单个CPU上运行的TensorFlow是否总是执行得很糟糕?是否有需要调整的设置以提高性能?或者TensorFlow是否只在更复杂的网络或学习机制中才会真正发光,因此对于这样简单的玩具箱,它不会表现得很好 是的,我希望在

我一直在各种框架中试验简单的基本(入门教程级)神经网络,但对我在其中看到的性能感到困惑

例如,简单网络from(在具有30个隐藏节点的网络中使用L2随机梯度下降的MNIST数字识别)的性能比稍微调整(使用中建议的小批量矢量化)的版本差得多(每个历元的长度约为8倍,参数相同)

在单个CPU上运行的TensorFlow是否总是执行得很糟糕?是否有需要调整的设置以提高性能?或者TensorFlow是否只在更复杂的网络或学习机制中才会真正发光,因此对于这样简单的玩具箱,它不会表现得很好



是的,我希望在CPU上运行的手工编码的专用简单网络比tensorflow网络运行得更快。原因通常与tensorflow使用的图形评估系统有关

使用tensorflow的好处是,当您有更复杂的算法,并且希望能够首先测试正确性,然后能够轻松地将其移植到使用更多机器和更多处理单元的情况下

例如,你可以尝试在一台有GPU的机器上运行你的代码,看看在不改变代码的情况下,你会得到一个加速,可能比你链接的手工编码的例子要快。
您可以看到,手工编写的代码需要花费大量的精力才能移植到GPU。

下一批
需要多少时间?这个函数比Michael Nielsen使用简单Numpy的版本做的事情多得多slicing@YaroslavBulatov:有没有一种方法可以禁用“更多的东西”,使其与Michael Nielsen的版本完全相同,因此我有一个更直接的比较?也许你可以将TensorFlow插入Michael Nielsen的版本?即,Michael Nielsen使用切片来完成下一批=数据[slice…]之类的操作,因此您可以只执行该操作,而不使用“mnist.train.next\u batch”。“tensorflow.examples”中用于学习目的的内容并不是为了提高效率。在一个案例中,我在该目录中看到一个例子,与一个更高效的版本相比,它的速度慢了200倍。据推测,由于我有一个更复杂的网络(卷积的、更多的层、更多的节点等)或更奇特的学习(例如辍学),即使只有一个CPU,TensorFlow也会比我使用基本NumPy时表现得更好,是吗?当然,加上许多其他开发人员正在使用该代码,因此也更可靠。举个例子,昨天我在Z840上尝试了numpy OpenBLAS,大矩阵乘法的运算速度是430 G/s,而TensorFlow的运算速度是1.1 T/s
from __future__ import (absolute_import, print_function, division, unicode_literals)

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import time


def weight_variable(shape):
    return tf.Variable(tf.truncated_normal(shape, stddev=0.1))


def bias_variable(shape):
    return tf.Variable(tf.constant(0.1, shape=shape))


mnist = input_data.read_data_sets("./data/", one_hot=True)

sess = tf.Session()

# Inputs and outputs
x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])

# Model parameters
W1 = weight_variable([784, 30])
b1 = bias_variable([30])
o1 = tf.nn.sigmoid(tf.matmul(x, W1) + b1, name='o1')
W2 = weight_variable([30, 10])
b2 = bias_variable([10])
y = tf.nn.softmax(tf.matmul(o1, W2) + b2, name='y')

sess.run(tf.initialize_all_variables())

loss = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
loss += 0.1/1000 * (tf.nn.l2_loss(W1) + tf.nn.l2_loss(W2))

train_step = tf.train.GradientDescentOptimizer(0.15).minimize(loss)

accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)), tf.float32))


for ep in range(30):
    for mb in range(int(len(mnist.train.images)/40)):
        batch_xs, batch_ys = mnist.train.next_batch(40)
        sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})