web-dev-qa-db-ja.com

TensorFlowで安定した結果を取得し、ランダムシードを設定する方法

ネットワークパラメーター(ドロップアウト確率、学習率e.d.)を調整するために、異なるパラメーターでニューラルネットワークを複数回実行しようとしています。しかし、次のようにネットワークをループで実行すると、パラメーターを同じに保ちながらネットワークを実行すると、別の解決策が得られるという問題があります。

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を使用して、各エポックの着信画像をシャッフルします。

52
Waanders

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

たとえば、ループは次のようになります。

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)

これは、外側のforループの反復ごとに同じランダムシードを使用することに注意してください。各反復で異なる(ただし依然として確定的な)シードを使用する場合は、tf.set_random_seed(i + 1)を使用できます。

41
mrry

確定的な動作は、グラフレベルまたは操作レベルのシードを指定することで取得できます。両方とも私のために働いた。グラフレベルのシードは、 tf.set_random_seed で配置できます。操作レベルのシードは、たとえば次のように変数の初期化子に配置できます。

myvar = tf.Variable(tf.truncated_normal(((10,10)), stddev=0.1, seed=0))
13
ssegvic