web-dev-qa-db-fra.com

TensorFlow: "Tentative d'utilisation d'une valeur non initialisée" lors de l'initialisation de la variable

J'essaie d'implémenter la régression linéaire multivariée dans Python à l'aide de TensorFlow, mais j'ai rencontré des problèmes de logique et de mise en œuvre. Mon code lève l'erreur suivante:

Attempting to use uninitialized value Variable
Caused by op u'Variable/read'

Idéalement, la sortie weights devrait être [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)
41
NEW USER

L’exemple de code ne donne pas une idée claire à 100%, mais si la liste initial_parameters_of_hypothesis_function est une liste d’objets tf.Variable, la ligne session.run(init) échouera, car TensorFlow n’est pas (encore) assez intelligent pour le comprendre. dépendances en initialisation variable. Pour contourner ce problème, vous devez modifier la boucle qui crée parameters pour qu'elle utilise initial_parameters_of_hypothesis_function[i].initialized_value() , qui ajoute la dépendance nécessaire:

parameters = []
for i in range(0, number_of_attributes, 1):
    parameters.append(tf.Variable(
        initial_parameters_of_hypothesis_function[i].initialized_value()))
19
mrry

Lance ça:

init = tf.global_variables_initializer()
sess.run(init)

Ou (selon la version de TF que vous avez):

init = tf.initialize_all_variables()
sess.run(init)
56
Philippe Remy

Une autre erreur se produit, liée à l'ordre lors de l'appel des variables globales d'initialisation. J'ai eu un exemple de code similaire à l'erreur FailedPreconditionError (voir ci-dessus pour le suivi): tentative d'utilisation de la valeur non initialisée 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())

Vous devriez changer pour suivre

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))
5
o0omycomputero0o

Je veux donner ma résolution, ça marche quand je remplace la ligne [session = tf.Session()] par [sess = tf.InteractiveSession()]. J'espère que cela sera utile aux autres.

2
Gao Yin

Normalement, il y a deux façons d’initialiser les variables, 1) en utilisant le sess.run(tf.global_variables_initializer()) comme notées les réponses précédentes; 2) le charger le graphique du point de contrôle.

Vous pouvez faire comme ça:

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)

Et la troisième méthode consiste à utiliser le tf.train.Supervisor . La session sera

Créez une session sur 'maître', récupérez ou initialisez le modèle selon vos besoins ou attendez qu'une session soit prête.

sv = tf.train.Supervisor([parameters])
sess = sv.prepare_or_wait_for_session()
2
Lerner Zhang

exécuter les deux:

sess.run (tf.global_variables_initializer ())

sess.run (tf.local_variables_initializer ())

0
Shu Zhang