random tensorflow seed

random - cómo obtener resultados reproducibles en Tensorflow



seed (1)

Construí una red neuronal de 5 capas mediante el uso de tensorflow.

Tengo un problema para obtener resultados reproducibles (o resultados estables).

Encontré preguntas similares con respecto a la reproducibilidad de tensorflow y las respuestas correspondientes, tales como Cómo obtener resultados estables con TensorFlow, configuración de semilla aleatoria

Pero el problema no está resuelto todavía.

También establecí una semilla aleatoria como la siguiente

tf.set_random_seed(1)

Además, agregué opciones de semilla a cada función aleatoria como

b1 = tf.Variable(tf.random_normal([nHidden1], seed=1234))

Confirmé que la primera época muestra los resultados idénticos, pero no idénticos a la segunda época poco a poco.

¿Cómo puedo obtener los resultados reproducibles?

¿Me estoy perdiendo de algo?

Aquí hay un bloque de código que uso.

def xavier_init(n_inputs, n_outputs, uniform=True): if uniform: init_range = tf.sqrt(6.0 / (n_inputs + n_outputs)) return tf.random_uniform_initializer(-init_range, init_range, seed=1234) else: stddev = tf.sqrt(3.0 / (n_inputs + n_outputs)) return tf.truncated_normal_initializer(stddev=stddev, seed=1234) import numpy as np import tensorflow as tf import dataSetup from scipy.stats.stats import pearsonr tf.set_random_seed(1) x_train, y_train, x_test, y_test = dataSetup.input_data() # Parameters learningRate = 0.01 trainingEpochs = 1000000 batchSize = 64 displayStep = 100 thresholdReduce = 1e-6 thresholdNow = 0.6 #dropoutRate = tf.constant(0.7) # Network Parameter nHidden1 = 128 # number of 1st layer nodes nHidden2 = 64 # number of 2nd layer nodes nInput = 24 # nOutput = 1 # Predicted score: 1 output for regression # save parameter modelPath = ''model/model_layer5_%d_%d_mini%d_lr%.3f_noDrop_rollBack.ckpt'' %(nHidden1, nHidden2, batchSize, learningRate) # tf Graph input X = tf.placeholder("float", [None, nInput]) Y = tf.placeholder("float", [None, nOutput]) # Weight W1 = tf.get_variable("W1", shape=[nInput, nHidden1], initializer=xavier_init(nInput, nHidden1)) W2 = tf.get_variable("W2", shape=[nHidden1, nHidden2], initializer=xavier_init(nHidden1, nHidden2)) W3 = tf.get_variable("W3", shape=[nHidden2, nHidden2], initializer=xavier_init(nHidden2, nHidden2)) W4 = tf.get_variable("W4", shape=[nHidden2, nHidden2], initializer=xavier_init(nHidden2, nHidden2)) WFinal = tf.get_variable("WFinal", shape=[nHidden2, nOutput], initializer=xavier_init(nHidden2, nOutput)) # biases b1 = tf.Variable(tf.random_normal([nHidden1], seed=1234)) b2 = tf.Variable(tf.random_normal([nHidden2], seed=1234)) b3 = tf.Variable(tf.random_normal([nHidden2], seed=1234)) b4 = tf.Variable(tf.random_normal([nHidden2], seed=1234)) bFinal = tf.Variable(tf.random_normal([nOutput], seed=1234)) # Layers for dropout L1 = tf.nn.relu(tf.add(tf.matmul(X, W1), b1)) L2 = tf.nn.relu(tf.add(tf.matmul(L1, W2), b2)) L3 = tf.nn.relu(tf.add(tf.matmul(L2, W3), b3)) L4 = tf.nn.relu(tf.add(tf.matmul(L3, W4), b4)) hypothesis = tf.add(tf.matmul(L4, WFinal), bFinal) print "Layer setting DONE..." # define loss and optimizer cost = tf.reduce_mean(tf.square(hypothesis - Y)) optimizer = tf.train.AdamOptimizer(learning_rate=learningRate).minimize(cost) # Initialize the variable init = tf.initialize_all_variables() # save op to save and restore all the variables saver = tf.train.Saver() with tf.Session() as sess: # initialize sess.run(init) print "Initialize DONE..." # Training costPrevious = 100000000000000.0 best = float("INF") totalBatch = int(len(x_train)/batchSize) print "Total Batch: %d" %totalBatch for epoch in range(trainingEpochs): #print "EPOCH: %04d" %epoch avgCost = 0. for i in range(totalBatch): np.random.seed(i+epoch) randidx = np.random.randint(len(x_train), size=batchSize) batch_xs = x_train[randidx,:] batch_ys = y_train[randidx,:] # Fit traiing using batch data sess.run(optimizer, feed_dict={X:batch_xs, Y:batch_ys}) # compute average loss avgCost += sess.run(cost, feed_dict={X:batch_xs, Y:batch_ys})/totalBatch # compare the current cost and the previous # if current cost > the previous # just continue and make the learning rate half #print "Cost: %1.8f --> %1.8f at epoch %05d" %(costPrevious, avgCost, epoch+1) if avgCost > costPrevious + .5: #sess.run(init) load_path = saver.restore(sess, modelPath) print "Cost increases at the epoch %05d" %(epoch+1) print "Cost: %1.8f --> %1.8f" %(costPrevious, avgCost) continue costNow = avgCost reduceCost = abs(costPrevious - costNow) costPrevious = costNow #Display logs per epoch step if costNow < best: best = costNow bestMatch = sess.run(hypothesis, feed_dict={X:x_test}) # model save save_path = saver.save(sess, modelPath) if epoch % displayStep == 0: print "step {}".format(epoch) pearson = np.corrcoef(bestMatch.flatten(), y_test.flatten()) print ''train loss = {}, current loss = {}, test corrcoef={}''.format(best, costNow, pearson[0][1]) if reduceCost < thresholdReduce or costNow < thresholdNow: print "Epoch: %04d, Cost: %.9f, Prev: %.9f, Reduce: %.9f" %(epoch+1, costNow, costPrevious, reduceCost) break print "Optimization Finished"


Parece que sus resultados quizás no sean reproducibles porque está usando Saver para escribir / restaurar desde el punto de control cada vez. (es decir, la segunda vez que ejecuta el código, los valores de la variable no se inicializan con su semilla aleatoria; se restauran desde su punto de control anterior)

Por favor recorte su ejemplo de código para solo el código necesario para reproducir irreproducibilidad.