2016-10-05 2 views
2

私の質問は、例えば、tf.sliceを使用している場合、バックプロパゲーションパスがどのように決定されるかです。Tensorflowでは、カスタム操作で勾配が正しいかどうかをどのように確認できますか?

例を挙げておきます。 K-分類問題があるとしましょう。私はこの場合、

conv1 = # conv1+relu1+lrm1+pool1 
conv2 = # from conv1 
fc1 = # from conv2 to 128D fully connected + relu 
fc2 = # from fc2 to K-D fully connected 
batch_loss = tf.softmax_cross_entropy(fc2, labels) 
loss = tf.reduce_mean(batch_loss) 
... minimize(loss) 

のような標準的な方法でこれを行うことができ、lossの勾配は、それぞれの重みにbackpropagateます。

さんが言ってみましょう、私は(私は、あるクラスがより重要だと思うかもしれないので、?)labelsfc2出力をスライスして、カスタム損失値をcalcuatedこの場合

label_sub = tf.slice(labels, ..) 
output_sub = tf.slice(fc2, ..) 
batch_loss_sub = tf.softmax_cross_entropy(output_sub, label_sub) 
loss = tf.reduce_mean(batch_loss + batch_loss_sub) 
... minimize(loss) 

、私はどのようにバックになっておりません伝播はうまくいくだろう。 「スライス」から、私たちは逆行経路を失いませんでしたか?

これは奇妙な擬似コードかもしれませんが、私の質問は「tp.sliceを使用すると、どのようにバックプロパゲーションが機能するのですか?

答えて

2

魔法はありません。テンソルの一部を抽出して計算に使用するので、このスライスを「フロースルー」するすべての偏微分は明確に定義されます。数学の観点から、それは

f([x1,x2,x3,x4]) = f(x) = 2 * sum(slice(x, 2, 2)) + 1 = 2 * (x2 + x3) + 1 

を持つのライン間に何かあるとあなたがの性質から、このFあなたの元の損失gをを追加とき、あなたは今、勾配直接

grad f(x) = [df/dx1, df/dx2, df/dx3, df/dx4] = [0, 2, 2, 0] 

とを計算することができますそれが追加されます。したがって

grad (f + g)(x) = grad f(x) + grad g(x) = [0, 2, 2, 0] + grad g(x) 

すべて動作します。

特に、いつでもグラフをTensorBoardで視覚化することができます。「グラジエント」ノードをダブルクリックすると、グラジエントの計算に使用された操作がすべて正確に表示されます。

関連する問題