How to get stable results with TensorFlow, setting random seed
Setting the current TensorFlow random seed affects the current default graph only. Since you are creating a new graph for your training and setting it as default (with g.as_default():
), you must set the random seed within the scope of that with
block.
For example, your loop should look like the following:
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)
Note that this will use the same random seed for each iteration of the outer for
loop. If you want to use a different—but still deterministic—seed in each iteration, you can use tf.set_random_seed(i + 1)
.
Deterministic behaviour can be obtained either by supplying a graph-level or an operation-level seed. Both worked for me. A graph-level seed can be placed with tf.set_random_seed. An operation-level seed can be placed e.g, in a variable intializer as in:
myvar = tf.Variable(tf.truncated_normal(((10,10)), stddev=0.1, seed=0))
Tensorflow 2.0 Compatible Answer: For Tensorflow version greater than 2.0, if we want to set the Global Random Seed, the Command used is tf.random.set_seed
.
If we are migrating from Tensorflow Version 1.x to 2.x
, we can use the command, tf.compat.v2.random.set_seed
.
Note that tf.function
acts like a re-run of a program in this case.
To set the Operation Level Seed (as answered above), we can use the command, tf.random.uniform([1], seed=1)
.
For more details, refer this Tensorflow Page.