2016-11-27 4 views
3

마침내 내 LSTM 모델을 사용하여 상황을 예측하고 있습니다. 그러나 나는 내가 이해하지 못하는 새로운 문제에 봉착했다. 내가 사용하는 뭔가를 예측하려고하면Tensorflow는 세션이 실행될 때마다 이미 존재하는 새로운 변수 세트를 만듭니다.

sess.run(pred, feed_dict={x: xs}) 

그것은 최초의 예측에 잘 작동하지만, 이후의 예측 오류 던져 : 지금

ValueError: Variable weight_def/weights already exists, disallowed. Did you mean to set reuse=True in VarScope?

을이에 대한 주제의 톤이있다 - 대부분의 그것들은 물어 보는 것만으로 쉽게 해결할 수 있습니다. 문제가되는 라인을 중심으로 가변 범위를 만들고 변수 재사용을 true로 만듭니다. 자, 내가 그렇게하면 다음과 같은 오류가 발생합니다.

ValueError: Variable rnn_def/RNN/BasicLSTMCell/Linear/Matrix does not exist, or was not created with tf.get_variable(). Did you mean to set reuse=None in VarScope?

이것은 꽤 두통을 유발합니다. 나는 Tensorflow Variable Sharing 설명서를 여러 번 읽었으며, 내가 잘못한 것을 알아낼 수는 없다. 여기에 문제가되는 라인

with tf.variable_scope("rnn_def"): 
      outputs, states = rnn.rnn(self.__lstm_cell, 
             self.__x, 
             dtype=tf.float32) 
      self.__outputs = outputs 
      self.__states = states 

이 코드는 그래프의 나머지 부분을 포함하는 큰 클래스에 중첩되어 있습니다. 그것을 훈련시키기 위해, 나는 단지 "기차"방법을 반복해서 호출한다. 어느 것이 잘 작동하는 것 같아 문제는 예측 끝납니다.

  1. 왜 나는 단지 처음 예측 후 변수 공유의 일종을 필요로 않지만 첫 번째 호출이 실패하지 않습니다

    그래서 제 질문은 두 배입니다? 오류가 발생하지 않고 두 번 이상 예측할 수 있도록이 코드를 수정하려면 무엇이 필요합니까?

  2. 언제 변수 공유가 유용하며 Tensorflow를 실행할 때마다 새로운 변수가 생성되는 이유는 무엇입니까? 어떻게 방지 할 수 있습니까? (방지하고 싶습니까?)

고맙습니다!

+0

목성 노트북에서 실행하고 있습니까? 기본 그래프를 사용하면 셀을 실행할 때마다 그래프에 변수가 다시 추가됩니다. – fabrizioM

+0

@fabrizioM 나는 명령 행에서 간단히 호출하고있다. – rec

답변

2

해당 코드 블록에 print 문을 추가하십시오. 나는 그것이 여러 번 불려지고 있다고 생각한다. 또는 각 클래스가 고유 한 범위 이름을 가져야하는 클래스의 인스턴스를 여러 개 만들 수도 있습니다.

질문에 답변하십시오.

Why do I require some sort of variable sharing only after the first prediction but the first call doesn't fail? What do I need to fix this code so I can predict more than once without causing an error?

아니요. RNN을 만드는 코드 블록은 우연히 여러 번 호출되었을 것입니다.

다음과 같은 경우에는 훈련 또는 예측 여부에 따라 그래프의 입력 소스가 다릅니다.

x_train, h_train = ops.sharpen_cell(x_train, h_train, 2, n_features, conv_size, n_convs, conv_activation, 'upsampler') 
self.cost += tf.reduce_mean((x_train - y_train) ** 2) 

level_scope.reuse_variables() 

x_gen, h_gen = ops.sharpen_cell(x_gen, h_gen, 2, n_features, conv_size, n_convs, conv_activation, 'upsampler') 
self.generator_outputs.append(tf.clip_by_value(x_gen, -1, 1)) 

이 예제에서는 트레이너와 함께 훈련 된 발전기의 변수를 다시 사용합니다. 또한 루프에서 언 롤링하고 RNN하려는 경우 유용합니다. 이러한 이때

y = #initial value 
state = #initial state 
rnn = #some sort of RNN cell 
with tf.variable_scope("rnn") as scope: 
    for t in range(10): 
    y, state = rnn(y, state) 
    scope.reuse_variabled() 

...이 경우로는 RNN의 원하는 동작 인 시간 간격의 RNN 가중치를 재사용한다.

+0

이봐,이게 잘됐다! 이제는 체중 범위에서 발생하는 것을 제외하고는 똑같은 문제가 생겼습니다. 그것은 내가 NEW 변수를 생성하려고 시도 할 때마다 호출 될 때마다 중심에있는 것처럼 보인다. 재귀 변수의 경우가 기차 대신 예측하려고하기 때문에 그렇습니까? – rec

+0

내가 지금 혼란스러워하는 부분은 예측과 훈련의 차이점, 그리고 다른 가중치/바이어스/등으로 그래프를 다시 만들려고 시도하는 이유입니다. 여기에 설명을 추가 할 수 있다면이 질문에 완전히 답할 수있어서 기쁩니다. – rec

+0

그렇지 않아야합니다. rnn.rnn을 호출 한 곳 바로 위에 print 문을 놓습니다. 그 코드 블록이 두 번 호출 될 것입니다. – chasep255

관련 문제