2017-04-05 10 views
0

GPUデバイスのTensorflowパフォーマンスをテストするプログラムを実装しようとしています。 データテストはMNISTデータで、マルチレイヤパーセプトロン(ニューラルネットワーク)を使用した監督訓練です。 Iはthis simple exampleに従ったが、私は最終的に10000Tensorflowは同じコードですが、CPUデバイスとGPUデバイスの結果が異なります

for i in range(10000) : 
batch_xs, batch_ys = mnist.train.next_batch(100) 
sess.run(train_step,feed_dict={x : batch_xs, y_ : batch_ys}) 
if i % 500 == 0: 
    print(i) 

に性能バッチ勾配の数を変更し、私はこのコード

correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float")) 
print(sess.run(accuracy,feed_dict={x:mnist.test.images,y_:mnist.test.labels})) 
print(tf.convert_to_tensor(mnist.test.images).get_shape()) 

を使用して予測精度を確認するとき、それは正解率が異なっていることが判明CPUからGPUへ:GPUが約0.9xxの精度を返し、CPUが0.3xxしか返さないとき。 理由を知っている人はいますか?なぜその問題が起こるのでしょうか?

+0

TensorBoardはこの問題のデバッグに役立ちます。 –

答えて

3

この種の動作には(バグに加えて)主に2つの理由があります。

数値安定性

それは数字を追加すると、それが見えるかもしれないと完全に同じくらい簡単ではないことが判明。私は1兆2を一緒に追加したいとしましょう。正解は2兆です。しかし、32ビットという言葉だけの言葉遣いでマシン上の浮動小数点でこれらを一緒に追加すると、あなたの答えはより小さい値に止まるでしょう。その理由は、しばらくすると、追加している2が浮動小数点合計の仮数の最小のビットよりも下にあるからです。

これらの種類の問題は数値計算に多くあり、この特定の不一致はTensorFlow(1,2など)で知られています。あなたはこれの効果を見ている可能性があります。ニューラルネットを訓練

初期条件

は、確率過程であり、そのようなものとして、それはあなたの初期条件に依存します。時には、特にあなたのハイパーパラメータがうまくチューニングされていないと、あなたのネットは極端なローカルミニマムの近くで立ち往生し、あなたは平凡な行動に終わるでしょう。オプティマイザのパラメータを調整する(または、Adamのような適応的な方法を使用する)ことで、ここで助けになるかもしれません。

言うまでもなく、これはかなり大きな違いです。そのため、基礎的な数学パッケージや不運を非難する前に結果を再確認します。

+0

私はあなたの最初のステートメント、非常に便利に同意します。私はその問題は通常、頻繁には起こらないと考えています。それは私の問題が判明しかし は、1を置くことができる再現性のある結果を持っているために、初期化正しくない – Hunter

+0

ある '' 'np.random.seed(1)tensorflowインポートから がset_random_seed set_random_seed(2)' ''コードで 。 – bio

関連する問題