1

次のテンソルフローコードを実行しようとしていますが、初めて正常に動作しています。再度実行しようとすると、エラーメッセージが表示され続けます。テンソルフローを2回実行しているときのエラー

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) 

コンソールを再起動してから実行すると、正常に動作します。

ニューラルネットワークの私の実装を以下に示します。

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") 

エラーは、私がwith tf.variable_scope():にパラメータとしてreuse=Trueを追加するが、それが再び動作していない試みたとおり。

私はこれをconda環境の中で実行しています。私はPython 3.5とCUDA 8を使用しています(ただし、これはGPUで実行するように設定されていないため問題ではありません)。

答えて

2

これはTFの動作の問題です。 TFは「隠された」状態、すなわちグラフが構築されていることを理解する必要があります。ほとんどのtf関数は、このグラフにopsを作成します(すべてのtf.Variable呼び出し、すべての算術演算など)。一方、実際の "実行"はtf.Session()で発生します。その結果、あなたのコードは、通常、次のようになります。

build_graph() 

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

すべての実際の変数、結果などは、あなたが「それを2回実行」したい場合があること

build_graph() 

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

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

お知らせをするだろう、唯一のセッションに残しているので私はグラフを一度に築いています。グラフは、どのように見えるかを抽象的に表現したものであり、計算の状態を保持していません。あなたは

build_graph() 

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

build_graph() 

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

をしようとすると、あなたは、第二build_graph(中にエラーが発生する可能性があります)により、同じ名前(何があなたのケースで起こる)との変数を作成しようとし、グラフをなどを確定しているあなたは本当に実行する必要がある場合あなたは単にこの間にグラフをリセットする必要があります。

build_graph() 

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

tf.reset_default_graph() 

build_graph() 

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

はうまくいきます。

関連する問題