2017-09-17 2 views
0

간단한 Q- 학습을 위해 TensorFlow를 사용하기 시작했지만 tf.layerstf.contrib.layers을 사용하여 구성된 레이어와 함께 가변 범위를 사용하려고 할 때 문제가 발생했습니다. 간단히 말해, 서로 다른 입력 텐서에 같은 레이어를 적용하고 싶습니다 (예를 들어, 현재 및 다음 Q 값을 유지하기 위해). 이 코드를 실행하려고Tensorflow tf.layers, tf.contrib.layers가 가변 범위와 함께 작동하지 않습니다.

import tensorflow as tf 

inp1 = tf.placeholder(tf.float64, (4,1)) 
inp2 = tf.placeholder(tf.float64, (4,1)) 

def process(inp): 
    with tf.variable_scope("foo", reuse=True): 
     return tf.layers.dense(inp, 12, name="bar", reuse=True) 

process(inp1) 
process(inp2) 

다음과 같은 예외 제공합니다 : 여기 tf.layers를 사용하여 최소한의 예는 내가 tf.layers.dense()에서 reuse=True를 설정하면 그것이 이미 정의 계층을 찾아보십시오하게 이해

ValueError: Variable foo/bar/kernel does not exist, or was not created with 
tf.get_variable(). Did you mean to set reuse=None in VarScope? 

하는 그것은 실패 할 수도 있습니다. 그러나 전화를 tf.layers.dense(inp, 12, name="bar")으로 변경하면 동일한 예외가 발생하여 실패합니다.

내가 tf.variable_scope()reuse=None을 설정하면, 후자의 버전은 제외 process(inp2)의 통화 중 실패 tf.contrib.layers를 사용하는 경우

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

불행하게도, 유사한 오류가 발생합니다.

내 질문은 : tf.layers을 가변 범위로 사용할 수있는 방법이 있습니까? 나는 가중치와 바이어스를 따로 정의 할 수 있다는 것을 알고 있지만 tf.layers에 의해 주어진 추상화를 유지하는 것이 좋습니다. 고마워요!

내 설정은 Windows 10에서 Python 3.6.1 (64 비트 Anaconda 4.4.0에서 pip로 설치됨)로 실행되는 TensorFlow 1.3.0 (CPU)입니다.

P. this presentation의 17 페이지에있는 레이어의 변수 범위 사용을 발견했습니다.

답변

1

두 가지 오류가 다릅니다. 첫 번째 오류는 process(inp1)에서 발생했으나 존재하지 않는 변수를 찾으려고 시도했지만 그렇지 않습니다. 두 번째는 process(inp2)에서 발생했습니다. 여기서 같은 이름을 가진 변수가 있지만 동일한 이름을 가진 새로운 변수를 만들려고합니다. 허용되지 않습니다.

Q- 학습을 위해 이러한 변수를 다시 사용하고 싶습니다. 따라서 솔루션은 매우 간단합니다. 처음 변수를 정의 할 때 reuse을 사용하지 않으면 reuse=True을 설정할 수 있습니다.

프리젠 테이션에서 내가 이미 변수를 정의한 것 같습니다.

guide이 (가) 더 도움이 될 것입니다.

관련 문제