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)
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()))
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)
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))
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.
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()
exécuter les deux:
sess.run (tf.global_variables_initializer ())
sess.run (tf.local_variables_initializer ())