2016-03-29 7 views
33

私は、ネットワークパラメータ(ドロップアウト確率、学習率e.d.)を較正するために、異なるパラメータでニューラルネットワークを複数回実行しようとしています。私は、ループ内でネットワークを実行すると、私はまだ同じパラメータを維持しながらネットワークを実行すると、私に別のソリューションを提供し、問題が生じていますが、次のように:TensorFlowで安定した結果を得る方法、ランダムシードを設定する

filename = create_results_file() 
for i in range(3): 
    g = tf.Graph() 
    with g.as_default(): 
    accuracy_result, average_error = network.train_network(
     parameters, inputHeight, inputWidth, inputChannels, outputClasses) 
    f, w = get_csv_writer(filename) 
    w.writerow([accuracy_result, "did run %d" % i, average_error]) 
    f.close() 

私は開始時に次のコードを使用しています私のネットワークの層と誤差関数を設定する前に、私のtrain_network機能:

np.random.seed(1) 
tf.set_random_seed(1) 

は、私はまた、TensorFlowグラフを作成する前にこのコードを追加しようとしているが、私は私の結果出力にさまざまなソリューションを取得しておきます。

私はAdamOptimizerを使用しており、tf.truncated_normalを使用してネットワークウェイトを初期化しています。さらに私はnp.random.permutationを使用して、各エポックの入力画像をシャッフルします。

答えて

24

現在のTensorFlowランダムシードを設定すると、現在のデフォルトグラフのみが影響を受けます。トレーニングのための新しいグラフを作成し、それをデフォルト(with g.as_default():)に設定するので、ブロックwithの範囲内でランダムシードを設定する必要があります。例えば

、あなたのループは次のようになります。これは、外側forループの反復ごとに同じランダムシードを使用することを

for i in range(3): 
    g = tf.Graph() 
    with g.as_default(): 
    tf.set_random_seed(1) 
    accuracy_result, average_error = network.train_network(
     parameters, inputHeight, inputWidth, inputChannels, outputClasses) 

注意を。別の—を使用したいが、各反復で確定的な—シードを使用する場合は、tf.set_random_seed(i + 1)を使用できます。

+2

)ブロック彼らは内の最初の行の一つであるとして、 train_networkコード。それでも私はあなたの例のようにコードを入れて試してみましたが、私はまだ取得しています不安定な結果: >精度\tラベル\t 2.96916 > 0.9807 \tがRUN1 \t 2.96494 > 0.9804 \tでしRUN2をしたRUN0なかった > 0.9805 \t \tエラー\t 2.95215 – Waanders

+0

私は同じ問題を抱えています。 'tensorflow''' 0.12.1'は指定されたランダムシードを設定します。実行時の確率出力には若干の違いがあります。 – Luke

+2

その理由はあなたの関数が何であるかによって異なりますが、精度計算の小さな違いは、 'tf.reduce_sum()'のようなopsの非決定論的な並列化の減少に起因する可能性が高いです。 (これらの演算子は浮動小数点加算を可換として扱いますが、実際にはそうではありませんが、縮小順序の変更によって結果にわずかなエラーが発生する可能性があります....) – mrry

6

確定的な動作は、グラフレベルまたは操作レベルのシードを指定することによって取得できます。どちらも私のために働いた。グラフレベルのシードは、tf.set_random_seedとすることができます。以下のように操作レベルの種子は、変数初期化子で、例えば配置することができます:私は私のset_random_seedは、(1)(g.as_default以内すでにだったと思い

myvar = tf.Variable(tf.truncated_normal(((10,10)), stddev=0.1, seed=0)) 
関連する問題