0

vgg16の各フィーチャマップについて、指定された損失の第1および第2導関数(ヘッセ行列の対角部分)を計算したいと思いますconv4_3レイヤーのカーネルは、3x3x512x512次元のマトリックスです。 How to compute all second derivatives (only the diagonal of the Hessian matrix) in Tensorflow? によれば、下位に尊敬されれば派生物をどう計算するか分かりますが、上位になると迷子になります。Tensorflow:高次のテンソルに関してヘッセ行列(対角部分のみ)を計算する

# Inspecting variables under Ipython notebook 
In : Loss 
Out : <tf.Tensor 'local/total_losses:0' shape=() dtype=float32> 

In : conv4_3_kernel.get_shape() 
Out : TensorShape([Dimension(3), Dimension(3), Dimension(512), Dimension(512)]) 

## Compute derivatives 
Grad = tf.compute_gradients(Loss, conv4_3_kernel) 
Hessian = tf.compute_gradients(Grad, conv4_3_kernel) 

In : Grad 
Out : [<tf.Tensor 'gradients/vgg/conv4_3/Conv2D_grad/Conv2DBackpropFilter:0' shape=(3, 3, 512, 512) dtype=float32>] 

In : Hessian 
Out : [<tf.Tensor 'gradients_2/vgg/conv4_3/Conv2D_grad/Conv2DBackpropFilter:0' shape=(3, 3, 512, 512) dtype=float32>] 

私の理解を確認するのを手伝ってください。したがって、conv4_3_kernelの場合、[Kx、Ky、in_channels、out_channels]の各ディメンションがあるので、Gradは、各フィーチャマップの各要素(ピクセル)に対してLossの偏微分でなければなりません。そしてHessianは2次導関数です。

しかし、Hessianはすべての導関数を計算しますが、どのように対角部分のみを計算できますか? tf.diag_part()を使用する必要がありますか?事前に多くの感謝!

答えて

4

tf.compute_gradientsは、スカラー量の導関数を計算します。提供量がスカラーでない場合、それは例がhereで、あなたはtf.gradientsからnの呼び出しを必要とする完全なヘッセ行列を計算するために

あなたの例で起こっているもののコンポーネントを合計してスカラーに変換します。対角部分のみを使用する場合は、iに引数を変更してtf.gradientsを呼び出し、すべての変数ではなくi番目の変数を区別します。

+0

ありがとうヤローラフ! – Xer

+0

私は 'tf.gradients'を使って派生物を計算しましたが、指定された変数に関して区別されるときは常に' None'を返します。 'Grad = tf.gradients(Loss、conv4_3_kernel)' 'Hessian0' = tf.gradients(Grad [...、0]、conv4_3_kernel [...、0])'すべての512に対して 'None'を返します。暗い私はどこか間違っていますか? – Xer

+0

[link](http://stackoverflow.com/questions/38200982/how-to-compute-all-second-derivatives-only-the-diagonal-of-the-hessian-matrix)の回答から、私はついに私の問題は、私の損失が 'スライス' opに依存していないことに気づいた。ですから、私はtf.pack-ed変数を使って自分の損失を再構築する必要があります。もう一度ありがとう! – Xer