1

J'essaie d'exécuter le code tensorflow suivant et il fonctionne bien la première fois. Si je tente de l'exécuter à nouveau, il garde en jetant une erreur en disantErreur lors de l'exécution de tensorflow une seconde fois

ValueError: Variable layer1/weights1 already exists, disallowed. Did you mean to set reuse=True in VarScope? Originally defined at: 

     File "C:\Users\owner\Anaconda3\envs\DeepLearning_NoGPU\lib\site-packages\tensorflow\python\framework\ops.py", line 1228, in __init__ 
     self._traceback = _extract_stack() 
     File "C:\Users\owner\Anaconda3\envs\DeepLearning_NoGPU\lib\site-packages\tensorflow\python\framework\ops.py", line 2336, in create_op 
     original_op=self._default_original_op, op_def=op_def) 
     File "C:\Users\owner\Anaconda3\envs\DeepLearning_NoGPU\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 768, in apply_op 
     op_def=op_def) 

Si je redémarre la console, puis l'exécuter, une fois encore, il fonctionne très bien. Étant donné ci-dessous est ma mise en œuvre du réseau de neurones.

import pandas as pd 
import numpy as np 
from sklearn.preprocessing import StandardScaler 
import tensorflow as tf 

learning_rate = 0.001 
training_epochs = 100 

n_input = 9 
n_output = 1 

n_layer1_node = 100 
n_layer2_node = 100 

X_train = np.random.rand(100, 9) 
y_train = np.random.rand(100, 1) 

with tf.variable_scope('input'): 
    X = tf.placeholder(tf.float32, shape=(None, n_input)) 

with tf.variable_scope('output'): 
    y = tf.placeholder(tf.float32, shape=(None, 1)) 

#layer 1 
with tf.variable_scope('layer1'): 
    weight_matrix1 = {'weights': tf.get_variable(name='weights1', 
               shape=[n_input, n_layer1_node], 
               initializer=tf.contrib.layers.xavier_initializer()), 
         'biases': tf.get_variable(name='biases1', 
           shape=[n_layer1_node], 
           initializer=tf.zeros_initializer())} 
    layer1_output = tf.nn.relu(tf.add(tf.matmul(X, weight_matrix1['weights']), weight_matrix1['biases'])) 

#Layer 2 
with tf.variable_scope('layer2'): 
    weight_matrix2 = {'weights': tf.get_variable(name='weights2', 
               shape=[n_layer1_node, n_layer2_node], 
               initializer=tf.contrib.layers.xavier_initializer()), 
         'biases': tf.get_variable(name='biases2', 
           shape=[n_layer2_node], 
           initializer=tf.zeros_initializer())} 
    layer2_output = tf.nn.relu(tf.add(tf.matmul(layer1_output, weight_matrix2['weights']), weight_matrix2['biases'])) 

#Output layer 
with tf.variable_scope('layer3'): 
    weight_matrix3 = {'weights': tf.get_variable(name='weights3', 
               shape=[n_layer2_node, n_output], 
               initializer=tf.contrib.layers.xavier_initializer()), 
         'biases': tf.get_variable(name='biases3', 
           shape=[n_output], 
           initializer=tf.zeros_initializer())} 
    prediction = tf.nn.relu(tf.add(tf.matmul(layer2_output, weight_matrix3['weights']), weight_matrix3['biases'])) 

cost = tf.reduce_mean(tf.squared_difference(prediction, y)) 
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost) 

with tf.Session() as session: 

    session.run(tf.global_variables_initializer()) 


    for epoch in range(training_epochs): 

     session.run(optimizer, feed_dict={X: X_train, y: y_train}) 
     train_cost = session.run(cost, feed_dict={X: X_train, y:y_train}) 

     print(epoch, " epoch(s) done") 

    print("training complete") 

Comme l'erreur suggère que j'ai essayé d'ajouter reuse=True comme paramètre dans with tf.variable_scope(): mais à nouveau ne fonctionne pas. Je cours ceci dans un environnement de conda. J'utilise Python 3.5 et CUDA 8 (mais cela ne devrait pas importer parce que ce n'est pas configuré pour fonctionner dans le GPU) dans Windows 10.

Répondre

2

Ceci est une question de comment TF fonctionne. Il faut comprendre que TF a un état "caché" - un graphique en cours de construction. La plupart des fonctions tf créent des ops dans ce graphe (comme tous les appels tf.Variable, toutes les opérations arithmétiques et ainsi de suite). D'autre part, "exécution" réelle se produit dans le tf.Session(). Par conséquent, votre code ressemblera généralement comme ceci:

build_graph() 

with tf.Session() as sess: 
    process_something() 

car toutes les variables réelles, les résultats etc. laissent seulement en session, si vous voulez « exécuter deux fois » vous feriez

build_graph() 

with tf.Session() as sess: 
    process_something() 

with tf.Session() as sess: 
    process_something() 

Notez que Je construis le graphique une fois. Le graphe est une représentation abstraite de l'aspect des choses, il ne contient aucun état de calcul. Lorsque vous essayez de faire

build_graph() 

with tf.Session() as sess: 
    process_something() 

build_graph() 

with tf.Session() as sess: 
    process_something() 

vous obtenez des erreurs lors de la deuxième build_graph() en raison d'essayer de créer des variables avec les mêmes noms (ce qui se passe dans votre cas), le graphique en cours de finalisation etc. Si vous avez vraiment besoin d'exécuter choses de cette façon, vous devez simplement réinitialiser graphique entre

build_graph() 

with tf.Session() as sess: 
    process_something() 

tf.reset_default_graph() 

build_graph() 

with tf.Session() as sess: 
    process_something() 

fonctionnera bien.