python - tutorial - TensorFlow: "Intentando usar un valor no inicializado" en la inicialización de la variable
tensorflow python (5)
Ejecuta esto:
init = tf.global_variables_initializer()
sess.run(init)
O (dependiendo de la versión de TF que tenga):
init = tf.initialize_all_variables()
sess.run(init)
Estoy tratando de implementar la regresión lineal multivariada en Python usando TensorFlow, pero me he encontrado con algunos problemas lógicos y de implementación. Mi código arroja el siguiente error:
Attempting to use uninitialized value Variable
Caused by op u''Variable/read''
Idealmente, el resultado de los weights
debería ser [2, 3]
def hypothesis_function(input_2d_matrix_trainingexamples,
output_matrix_of_trainingexamples,
initial_parameters_of_hypothesis_function,
learning_rate, num_steps):
# calculate num attributes and num examples
number_of_attributes = len(input_2d_matrix_trainingexamples[0])
number_of_trainingexamples = len(input_2d_matrix_trainingexamples)
#Graph inputs
x = []
for i in range(0, number_of_attributes, 1):
x.append(tf.placeholder("float"))
y_input = tf.placeholder("float")
# Create Model and Set Model weights
parameters = []
for i in range(0, number_of_attributes, 1):
parameters.append(
tf.Variable(initial_parameters_of_hypothesis_function[i]))
#Contruct linear model
y = tf.Variable(parameters[0], "float")
for i in range(1, number_of_attributes, 1):
y = tf.add(y, tf.multiply(x[i], parameters[i]))
# Minimize the mean squared errors
loss = tf.reduce_mean(tf.square(y - y_input))
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
train = optimizer.minimize(loss)
#Initialize the variables
init = tf.initialize_all_variables()
# launch the graph
session = tf.Session()
session.run(init)
for step in range(1, num_steps + 1, 1):
for i in range(0, number_of_trainingexamples, 1):
feed = {}
for j in range(0, number_of_attributes, 1):
array = [input_2d_matrix_trainingexamples[i][j]]
feed[j] = array
array1 = [output_matrix_of_trainingexamples[i]]
feed[number_of_attributes] = array1
session.run(train, feed_dict=feed)
for i in range(0, number_of_attributes - 1, 1):
print (session.run(parameters[i]))
array = [[0.0, 1.0, 2.0], [0.0, 2.0, 3.0], [0.0, 4.0, 5.0]]
hypothesis_function(array, [8.0, 13.0, 23.0], [1.0, 1.0, 1.0], 0.01, 200)
Hay otro error sucediendo relacionado con el orden al llamar a las variables globales de inicialización. He tenido que la muestra de código tiene un error similar FailedPreconditionError (vea arriba para traceback): Intentar usar un valor no inicializado W
def linear(X, n_input, n_output, activation = None):
W = tf.Variable(tf.random_normal([n_input, n_output], stddev=0.1), name=''W'')
b = tf.Variable(tf.constant(0, dtype=tf.float32, shape=[n_output]), name=''b'')
if activation != None:
h = tf.nn.tanh(tf.add(tf.matmul(X, W),b), name=''h'')
else:
h = tf.add(tf.matmul(X, W),b, name=''h'')
return h
from tensorflow.python.framework import ops
ops.reset_default_graph()
g = tf.get_default_graph()
print([op.name for op in g.get_operations()])
with tf.Session() as sess:
# RUN INIT
sess.run(tf.global_variables_initializer())
# But W hasn''t in the graph yet so not know to initialize
# EVAL then error
print(linear(np.array([[1.0,2.0,3.0]]).astype(np.float32), 3, 3).eval())
Deberías cambiar a seguir
from tensorflow.python.framework import ops
ops.reset_default_graph()
g = tf.get_default_graph()
print([op.name for op in g.get_operations()])
with tf.Session() as
# NOT RUNNING BUT ASSIGN
l = linear(np.array([[1.0,2.0,3.0]]).astype(np.float32), 3, 3)
# RUN INIT
sess.run(tf.global_variables_initializer())
print([op.name for op in g.get_operations()])
# ONLY EVAL AFTER INIT
print(l.eval(session=sess))
No está 100% claro del ejemplo de código, pero si la lista initial_parameters_of_hypothesis_function
es una lista de objetos tf.Variable
, entonces la línea session.run(init)
fallará porque TensorFlow no es (aún) lo suficientemente inteligente como para descubrir las dependencias en inicialización variable Para evitar esto, debe cambiar el ciclo que crea los parameters
para usar initial_parameters_of_hypothesis_function[i].initialized_value()
, que agrega la dependencia necesaria:
parameters = []
for i in range(0, number_of_attributes, 1):
parameters.append(tf.Variable(
initial_parameters_of_hypothesis_function[i].initialized_value()))
Normalmente hay dos formas de inicializar variables, 1) usando sess.run(tf.global_variables_initializer())
como se anotaron las respuestas anteriores; 2) carga el gráfico desde el punto de control.
Puedes hacer así:
sess = tf.Session(config=config)
saver = tf.train.Saver(max_to_keep=3)
try:
saver.restore(sess, tf.train.latest_checkpoint(FLAGS.model_dir))
# start from the latest checkpoint, the sess will be initialized
# by the variables in the latest checkpoint
except ValueError:
# train from scratch
init = tf.global_variables_initializer()
sess.run(init)
Y el tercer método es usar el tf.train.Supervisor . La sesión será
Cree una sesión en ''master'', recupere o inicialice el modelo según sea necesario o espere a que la sesión esté lista.
sv = tf.train.Supervisor([parameters])
sess = sv.prepare_or_wait_for_session()
Quiero dar mi resolución, funciona cuando reemplazo la línea [session = tf.Session()]
con [sess = tf.InteractiveSession()]
. Espero que esto sea útil para otros.