私は様々なフレームワークでシンプルな基本(イントロチュートリアルレベル)のニューラルネットワークを試してきましたが、私はTensorFlowで見ているパフォーマンスについて混乱しています。TensorFlowは単純なネットワークではパフォーマンスが低下しますか?
たとえば、単純なネットワークであるMichael Nielsen's tutorial(隠れノードが30個あるネットワークでL2確率的勾配降下を使用するMNIST桁認識)は、わずかによりもずっと悪く(すべての同じパラメータで、エポックあたり約8倍の時間を要します) (one of the tutorial exercisesで提案されているようなミニバッチによるベクトル化を使用して)Nielsen's basic NumPy codeのバージョンに適合しました。
単一の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'でどのくらいの時間がかかりますか?その機能は、単純なナンシースライシングを使用するマイケルニールセンのバージョンよりも多くのことを行います –
@YaroslavBulatov:マイケルニールセンのバージョンとまったく同じように「たくさんのもの」を無効にする方法はありますか? ? – orome
あなたはTensorFlowをMichael Nielsenのバージョンに差し込むことができますか? –