ネットワークパラメーター(ドロップアウト確率、学習率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
を使用して、各エポックの着信画像をシャッフルします。
現在の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)
を使用できます。
確定的な動作は、グラフレベルまたは操作レベルのシードを指定することで取得できます。両方とも私のために働いた。グラフレベルのシードは、 tf.set_random_seed で配置できます。操作レベルのシードは、たとえば次のように変数の初期化子に配置できます。
myvar = tf.Variable(tf.truncated_normal(((10,10)), stddev=0.1, seed=0))