2016-06-20 5 views
2

Tensorflow에서 그래프 정의 블록 내의 명령문은 훈련 중 실행되는 그래프를 작성하기 위해서만 실행됩니까? 예를 들어 : 그들은 무게와 편견을 초기화 이후Tensorflow : 그래프 작성 후 실행되는 그래프 문은 무엇입니까?

with tf.Graph().as_default(): 
    weightsLayer1 = tf.Variable(tf.truncated_normal([nInputUnits, nOutputUnits])) 
    weightsLayer1 = tf.div(weightsLayer1, tf.sqrt(tf.to_float(nInputUnits))) 
    biasesLayer1 = tf.Variable(tf.zeros([nUnitsHiddenLayer1])) 
    layer1output = tf.tanh(tf.matmul(images_placeholder, weightsLayer1) + biasesLayer1) 

직관적으로, 선이 weightsLayer1biasesLayer1 정의 I는 시작시에만 한 번 실행 가정합니다. 그러나 라인 계산 layer1outputlayer1output은 손실을 계산하기 위해 다운 스트림에 사용되므로 최적화 단계에서 최소화되므로 모든 교육 단계에서 실행됩니다. 그렇다면 Tensorflow는 훈련 중 이전 줄을 실행하지 않고 마지막 줄만 실행하는 것을 어떻게 알 수 있습니까? (이것은 가중치와 편향을 다시 초기화 할 것입니다)?

+0

위의 모든 설명은 그래프를 작성하는 데 사용되며 훈련 중에는 열차 운전으로 이어지는 경로 만 실행됩니다. 초기화는 한 번만 발생합니다. 즉, 두 번째 명령문 tf.div가 열차 시간에 실행됩니다. – shekkizh

답변

2

사용자가 실제로 작업을 실행할 수있는 텐서 흐름을 말하고 있습니다. 교육을하는 동안 일반적으로 최적화 프로그램이 제공하는 연산을 실행하도록 tensorflow에 지시합니다. 이것은이 같은 같습니다

opt = tf.train.GradientDescentOptimizer(0.01) 
train_step = opt.minimize(loss) # 
for i in range(100): 
    sess.run(train_step, feed_dict=...) 

opt.minimize이 계산에 추가 호출 그라디언트를 그래프를 w.r.t. 훈련 가능한 변수뿐만 아니라 그라디언트를 사용하여 변수를 업데이트하는 연산. train_step은 실제로 tf.group을 사용하여 그룹화 된 이러한 업데이트 작업입니다. 여러분 (사용자)이 train_step을 실행하면 tensorflow는 원하는 연산을 수행하기 위해 실행해야하는 계산 그래프의 어떤 부분을 계산합니다.

마찬가지로, sess.run(fetches=loss, feed_dict=...)과 같은 작업을 수행하면 그래프에서 loss을 계산하는 데 필요한 모든 작업을 실행하도록 tensorflow에 요청합니다.

마지막으로 weightsLayer1 = tf.Variable(tf.truncated_normal([nInputUnits, nOutputUnits]))의 초기화 작업은 sess.run(tf.initialize_all_variables())으로 실행됩니다.

편집 : 질문을 다시 읽은 후에 한 가지 측면에 대해 더 자세히 설명하고 싶습니다. 귀하가 제공 한 그래프 정의 코드로 실제로 어떤 작업도 실행되지 않습니다. Tensorflow 작업은 세션을 시작하고 그래프의 부분 실행을 요청하는 경우에만 실행됩니다. 위에서 언급했듯이 초기화 작업이 포함됩니다.

+0

감사합니다. 확인하려면 : Tensorflow는 'weightsLayer1'을 초기 설정 시간 (내 의도)으로 한 번만 초기화하는 두 줄 중 두 줄을 실행하거나 두 번째 줄 ('weightsLayer1 = tf.div (weightsLayer1, tf.sqrt (tf. –

+0

아하. 그 트릭은'weightsLayer1'을 계산하는 두 번째 줄이'tf.Variable' 생성자에 전달 된 초기 값의 일부가 아니라는 것입니다 (즉, toflt (nInputUnits))) –

+0

올바른 줄''weightsLayer1 = tf.div (weightsLayer1, tf.sqrt (tf.to_float (nInputUnits)))''는''변수의 초기화가 아닙니다. weightsLayer1''을 사용하고 있지만 새로운 텐서를 계산 중입니다.이 텐서''weightsLayer1''도 호출 할 수 있습니다 만, 이것은 텐서 객체에 바인딩하는 이름 일 뿐이며, 해당 연산은 실행될 때마다 실행됩니다. 그것을 필요로하는 그래프의 일부. – lballes