2017-11-28 29 views
2

私はテンソルフローが初めてです。次のコードは、エラーなしで正常に実行できます。最初の10行の出力では計算が高速で、出力(最後の行で定義)は1行ずつ飛んでいます。しかし、反復が上がるにつれて、計算は遅くなり、遅くなり、最終的に耐えられなくなります。だから私はこれをスピードアップできる変更があるかどうか疑問に思います。Tensorflow:なぜ私のコードは遅く、遅くなっていますか?

このコードの簡単な説明を次に示します。 このコードは、単一の隠れ層ニューラルネットワークをデータセットに適用します。損失関数に影響するパラメータであるrate [0]とrate [1]の最適なパラメータを見つけることを目指しています。トレーニングの各段階で、1つのタプルがモデルに供給され、タプルの精度がすぐに評価されます(この種のデータは現実世界でストリームとして提供されます)。

import tensorflow as tf 
import numpy as np 

n_hidden=50 
n_input=37 
n_output=2 
data_raw=np.genfromtxt(r'data.csv',delimiter=",",dtype=None) 
data_info=np.genfromtxt(r'data2.csv',delimiter=",",dtype=None) 

def pre_process(tuple): 
    ans = [] 
    temp = [0 for i in range(24)] 
    temp[int(tuple[0])] = 1 
    # np.append(ans,np.array(temp)) 
    ans.extend(temp) 
    temp = [0 for i in range(7)] 
    temp[int(tuple[1]) - 1] = 1 
    ans.extend(temp) 
    # np.append(ans,np.array(temp)) 
    temp = [0 for i in range(3)] 
    temp[int(tuple[3])] = 1 
    ans.extend(temp) 
    temp = [0 for i in range(2)] 
    temp[int(tuple[4])] = 1 
    ans.extend(temp) 
    ans.extend([int(tuple[5])]) 
    return np.array(ans) 

x=tf.placeholder(tf.float32, shape=[1,n_input]) 
y_=tf.placeholder(tf.float32,shape=[n_output]) 
y_r=tf.placeholder(tf.float32,shape=[n_output]) 
W1=tf.Variable(tf.random_uniform([n_input, n_hidden])) 
b1=tf.Variable(tf.zeros([n_hidden])) 
W2=tf.Variable(tf.zeros([n_hidden,n_output])) 
b2=tf.Variable(tf.zeros([n_output])) 

logits_1 = tf.matmul(x, W1) + b1 
relu_layer= tf.nn.relu(logits_1) 
logits_2 = tf.matmul(relu_layer, W2) + b2 

correct_prediction = tf.equal(tf.argmax(logits_2,1), tf.argmax(y_,0)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

rate=[0,0] 
for i in range(-100,200,10): 
    rate[0]=i; 
    for j in range(-100,i,10): 
     rate[1]=j 
     loss=tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=logits_2)*[rate[0],rate[1]]) 
#  loss2=tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(labels=y_r, logits=logits_2)*[rate[2],rate[3]]) 
#  loss=loss1+loss2 
     train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 
     data_line=1 

     accur=0 
     local_local=0 
     remote_remote=0 
     local_remote=0 
     remote_local=0 
     total=0 
     with tf.Session() as sess: 
      sess.run(tf.global_variables_initializer()) 
      for i in range(200): 
#    print(int(data_raw[data_line][0]),data_info[i][0]) 
       if i>100: 
        total+=1 
       if int(data_raw[data_line][0])==data_info[i][0]: 
        sess.run(train_step,feed_dict={x:pre_process(data_info[i]).reshape(1,-1),y_:[1,0],y_r:[0,1]}) 
#     print(sess.run(logits_2,{x:pre_process(data_info[i]).reshape(1,-1), y_: #[1,0]})) 
        data_line+=1; 
        if data_line==len(data_raw): 
         break 
        if i>100: 
         acc=accuracy.eval(feed_dict={x: pre_process(data_info[i]).reshape(1,-1), y_: [1,0], y_r:[0,1]}) 
         local_local+=acc 
         local_remote+=1-acc 
         accur+=acc 
       else: 
        sess.run(train_step,feed_dict={x:pre_process(data_info[i]).reshape(1,-1),y_:[0,1], y_r:[1,0]}) 
#     print(sess.run(logits_2,{x: pre_process(data_info[i]).reshape(1,-1), y_: #[0,1]})) 
        if i>100: 
         acc=accuracy.eval(feed_dict={x: pre_process(data_info[i]).reshape(1,-1), y_: [0,1], y_r:[1,0]}) 
         remote_remote+=acc 
         remote_local+=1-acc 
         accur+=acc 

     print("correctness: (%.3d,%.3d): \t%.2f %.2f %.2f %.2f %.2f" % (rate[0],rate[1],accur/total,local_local/total,local_remote/total,remote_local/total,remote_remote/total)) 

答えて

3

もののコードを実行している理由GPhiloの答えは、問題に対処が遅く、遅くなって、実際にはさその解決法は、何度も何度も計算グラフを作成することになり、これはうまくいかない。

次の2行のコード(GPhiloも言及しています)は、反復ごとに連続的にグラフに操作を追加しています。私が見ることができるように

loss=tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(\ 
        labels=y_, logits=logits_2)*[rate[0],rate[1]]) 
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 

、あなたのグラフを供給する必要がある二つの値rate[0], rate[1]を持っています。なぜ、これらの2つの値をplaceholderに入力せず、グラフを1回だけ定義しますか? Sessionの実行を開始したら、グラフにさらに操作を追加しないでください。また、セッションをイテレーションで初期化することも考慮してはいけません。

チェックあなたのSession実行train_stepは、あなたがあなたのfeed_dictにこれら2つの追加のプレースホルダを供給する必要があるとき、この修正コード(唯一の重要な部品)は、この修正後

# To clear previously created graph (if any) present in memory. 
tf.reset_default_graph() 
x=tf.placeholder(tf.float32, shape=[1,n_input]) 
y_=tf.placeholder(tf.float32,shape=[n_output]) 
y_r=tf.placeholder(tf.float32,shape=[n_output]) 

# Add these two placeholders (Assuming they are single float value) 
rate0 = tf.placeholder(tf.float32, shape = []) 
rate1 = tf.placeholder(tf.float32, shape = []) 

W1=tf.Variable(tf.random_uniform([n_input, n_hidden])) 
.... 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

# Bring this code outside from loop (Note replacement of rate[0] with placeholder) 
loss=tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(labels=y_, \ 
      logits=logits_2) * [rate0, rate1]) 
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 

# Instantiate session only once. 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

    # Move the subsequent looping code inside. 
    rate=[0,0] 
    for i in range(-100,200,10): 
     rate[0]=i; 

、。

例:このように

sess.run(train_step,feed_dict={x:pre_process(data_info[i]).reshape(1,-1), 
     y_:[1,0],y_r:[0,1], rate0: rate[0], rate1: rate[1]}) 

、あなたはすべての反復のためにグラフを作成することはありませんし、実際には、このコードはGPhiloのソリューションよりも速くなります。

+1

あなたは正しいです!私はまだテンソルフローを使うのは快適ではありませんでしたが、あなたの答えは実際に入力と出力の入力以外のプレースホルダーで何ができるかを思い出させます。素晴らしい助け! –

2

あなたがあなたのプログラムの複数のループでどんどん大きくなり、グラフに(かなり)の操作を追加しているtrain_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)を実行するたびに。グラフが大きければ大きいほど実行は遅くなります。

ループの体にあなたのモデル定義を入れて、あなたが新しい反復を開始tf.reset_default_graph()するたびに呼び出す:

rate=[0,0] 
for i in range(-100,200,10): 
    rate[0]=i; 
    for j in range(-100,i,10): 
     tf.reset_default_graph() 
     x=tf.placeholder(tf.float32, shape=[1,n_input]) 
     y_=tf.placeholder(tf.float32,shape=[n_output]) 
     y_r=tf.placeholder(tf.float32,shape=[n_output]) 
     W1=tf.Variable(tf.random_uniform([n_input, n_hidden])) 
     b1=tf.Variable(tf.zeros([n_hidden])) 
     W2=tf.Variable(tf.zeros([n_hidden,n_output])) 
     b2=tf.Variable(tf.zeros([n_output])) 

     logits_1 = tf.matmul(x, W1) + b1 
     relu_layer= tf.nn.relu(logits_1) 
     logits_2 = tf.matmul(relu_layer, W2) + b2 

     correct_prediction = tf.equal(tf.argmax(logits_2,1), tf.argmax(y_,0)) 
     accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

     rate[1]=j 
     #... 
+0

これは機能しました。どうもありがとうございます!ところで、どのようにリセットグラフ関数を使用する必要があることを知っていますか?私はテンソルフローが初めてであることを意味しています。次回のドキュメントを効率的に検索するにはどうしたらいいのでしょうか? –

+0

私はドキュメントを見ていないのは恐れですが、これは痛みや経験を通して学ぶものです:)しかし、本質的にTensorflowで操作を行うたびに、それを現在のグラフに追加します)。新しいアーキテクチャを試したい場合は、以前のものを消去するか、グラフの次元が爆発する必要があります – GPhilo

+0

私はあなたを得ました!本当に本当にありがとう! –