python - repetir - Cómo obtener resultados estables con TensorFlow, estableciendo semilla aleatoria
listas aleatorias en python (2)
Estoy tratando de ejecutar una red neuronal varias veces con diferentes parámetros para calibrar los parámetros de la red (probabilidades de abandono, tasa de aprendizaje ed). Sin embargo, tengo el problema de que ejecutar la red manteniendo los parámetros iguales todavía me da una solución diferente cuando ejecuto la red en un bucle de la siguiente manera:
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()
Estoy usando el siguiente código al comienzo de mi función train_network antes de configurar las capas y la función de error de mi red:
np.random.seed(1)
tf.set_random_seed(1)
También he intentado agregar este código antes de la creación del gráfico TensorFlow, pero sigo obteniendo diferentes soluciones en mi salida de resultados.
Estoy usando un AdamOptimizer y estoy inicializando pesos de red usando
tf.truncated_normal
.
Además, estoy usando
np.random.permutation
para mezclar las imágenes entrantes para cada época.
El comportamiento determinista se puede obtener suministrando un nivel de gráfico o una semilla de nivel de operación. Ambos trabajaron para mí. Se puede colocar una semilla a nivel de gráfico con tf.set_random_seed . Se puede colocar una semilla de nivel de operación, por ejemplo, en un intializador variable como en:
myvar = tf.Variable(tf.truncated_normal(((10,10)), stddev=0.1, seed=0))
La configuración de la semilla aleatoria TensorFlow actual solo afecta al gráfico predeterminado actual.
Como está creando un nuevo gráfico para su entrenamiento y configurándolo como predeterminado (
with g.as_default():
, debe establecer la semilla aleatoria dentro del alcance de ese bloque.
Por ejemplo, su bucle debería tener el siguiente aspecto:
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)
Tenga en cuenta que esto usará la misma semilla aleatoria para cada iteración del bucle
for
externo.
Si desea usar una semilla diferente, pero aún determinista, en cada iteración, puede usar
tf.set_random_seed(i + 1)
.