【问题标题】:Does TensorFlow perform poorly for simple networks?TensorFlow 对简单网络的性能是否很差?
【发布时间】:2016-08-15 06:35:48
【问题描述】:

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

例如,来自Michael Nielsen's tutorial 的简单网络(在具有 30 个隐藏节点的网络中使用 L2 随机梯度下降的 MNIST 数字识别)的性能比Nielsen's basic NumPy code 的版本略有调整(使用one of the tutorial exercises 中建议的小批量矢量化)。

在单个 CPU 上运行的 TensorFlow 是否总是表现不佳?是否有我应该调整的设置以提高性能?或者 TensorFlow 是否真的只在更复杂的网络或学习机制中表现出色,因此对于这种简单的玩具案例预计不会有很好的表现?


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})

【问题讨论】:

  • next_batch花了多少时间?该功能比使用简单 Numpy 切片的 Michael Nielsen 的版本做更多的事情
  • @YaroslavBulatov:有没有办法禁用“更多的东西”,使其完全符合迈克尔尼尔森的版本,所以我有一个更直接的比较?
  • 也许您可以将 TensorFlow 插入到 Michael Nielsen 的版本中?
  • IE,Michael Nielsen 使用切片来执行类似 next_batch = data[slice...] 的操作,因此您可以直接执行此操作,而根本不使用“mnist.train.next_batch”。用于学习目的的“tensorflow.examples”中的内容并非高效。在一种情况下,我在该目录中看到一个示例,与更高效的版本相比,它的速度降低了 200 倍。

标签: python performance machine-learning tensorflow


【解决方案1】:

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

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

例如,您可以尝试的一件事是在具有 GPU 的机器上运行您的代码,并看到在不更改代码中的任何内容的情况下,您将获得加速,可能比您链接的手动编码示例更快。 您可以看到,手写代码需要付出相当大的努力才能移植到 GPU。

【讨论】:

  • 然后大概因为我有一个更复杂的网络(卷积、更多层、更多节点等)或更花哨的学习(例如辍学),即使只有一个 CPU,TensorFlow 也会开始比我用基本的 NumPy 能做的更好,对吧?
  • 确实如此,加上许多其他开发人员正在使用该代码,因此也更可靠。
  • 举个例子,我昨天在 Z840 上尝试了 numpy OpenBLAS,对于大矩阵乘法它是 430 G ops/秒,而 TensorFlow 给了我 1.1 T ops/秒
猜你喜欢
  • 1970-01-01
  • 2019-02-05
  • 2016-08-18
  • 2020-06-03
  • 1970-01-01
  • 2019-06-08
  • 2017-10-20
  • 2012-12-16
  • 1970-01-01
相关资源
最近更新 更多