2016-04-21 16 views
1

私は様々なフレームワークでシンプルな基本(イントロチュートリアルレベル)のニューラルネットワークを試してきましたが、私は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}) 
+0

'next_batch'でどのくらいの時間がかかりますか?その機能は、単純なナンシースライシングを使用するマイケルニールセンのバージョンよりも多くのことを行います –

+0

@YaroslavBulatov:マイケルニールセンのバージョンとまったく同じように「たくさんのもの」を無効にする方法はありますか? ? – orome

+0

あなたはTensorFlowをMichael Nielsenのバージョンに差し込むことができますか? –

答えて

1

はい、私はコード化されたその手がCPU上で実行されているシンプルなネットワークが速くtensorflowものより実行します専門期待されます。理由は、通常、テンソルフローが使用するグラフ評価システムに接続されます。

テンソルフローを使用する利点は、はるかに複雑なアルゴリズムがあり、最初に正しいかどうかをテストし、簡単に移植してより多くのマシンと処理ユニットを使用できるようにする場合です。

たとえば、GPUを搭載したマシン上でコードを実行し、コード内の何も変更せずに、リンクした手作業でコード化された例よりも高速化することができます。 手書きのコードはGPUに移植するためにかなりの労力が必要になることがわかります。

+0

そしておそらく、私はより複雑なネットワーク(畳み込み、より多くのレイヤー、もっと多くのノードなど)を持っていたり、単一のCPUを使っていても派手な学習(ドロップアウトなど)をしていたので、TensorFlowは基本的なNumPy、そう? – orome

+0

間違いなく、他の多くの開発者によってコードが実行されているので、より信頼性も高くなります。 – fabrizioM

+0

昨日、Z840でnumBlueのOpenBLASを試しましたが、大規模な行列乗算では430G ops /秒でしたが、TensorFlowは1.1Tps /秒でした –

関連する問題