2017-10-01 3 views
0

빠른 질문은 여기서 혼란 스럽습니다.Tensorflow : tf.gradients()가 정확히 무엇을 반환합니까?

의 우리가 간단한 그래프 있다고 가정 해 봅시다 :

a = tf.Variable(tf.truncated_normal(shape=[200, 1], mean=0., stddev=.5)) 
b = tf.Variable(tf.truncated_normal(shape=[200, 100], mean=0., stddev=.5)) 
add = a+b 

add 
<tf.Tensor 'add:0' shape=(200, 100) dtype=float32> #shape is because of broadcasting 

그래서 나는 2 텐서에 소요되며, 출력으로 1 텐서를 생성하는 노드를 가지고있다. 이제는 tf.gradients를 실행 해 봅시다.

tf.gradients(add, [a, b]) 
[<tf.Tensor 'gradients/add_grad/Reshape:0' shape=(200, 1) dtype=float32>, 
<tf.Tensor 'gradients/add_grad/Reshape_1:0' shape=(200, 100) dtype=float32>] 

그래서 입력 텐서의 형태로 정확하게 그라데이션을 얻습니다. 하지만 ... 왜? 편미분을 취할 수있는 단일 측정 항목과 달리 그라디언트가 입력 텐서의 모든 단일 값에서 출력 텐서의 모든 단일 값으로 매핑되어서는 안되며 입력에 대해 200x1x200x100 그라디언트를 효과적으로 제공해야합니까?

이것은 출력 텐서의 모든 요소가 텐서 b의 한 값과 텐서 a의 한 행에만 의존하는 간단한 예제입니다. 그러나 우리가 더 복잡한 것을했으면, 텐서에서 가우시안 블러를 실행하는 것과 같이 그래디언트는 반드시 입력 텐서보다 커야합니다.

내가 잘못 왔습니까?

답변

1

기본적으로 tf.gradients는 tf.gradients에 전달 된 모든 텐서의 모든 요소를 ​​출력으로 합산하여 얻는 스칼라 그라데이션을 사용합니다.

관련 문제