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()
を使用する必要がありますか?事前に多くの感謝!
ありがとうヤローラフ! – Xer
私は 'tf.gradients'を使って派生物を計算しましたが、指定された変数に関して区別されるときは常に' None'を返します。 'Grad = tf.gradients(Loss、conv4_3_kernel)' 'Hessian0' = tf.gradients(Grad [...、0]、conv4_3_kernel [...、0])'すべての512に対して 'None'を返します。暗い私はどこか間違っていますか? – Xer
[link](http://stackoverflow.com/questions/38200982/how-to-compute-all-second-derivatives-only-the-diagonal-of-the-hessian-matrix)の回答から、私はついに私の問題は、私の損失が 'スライス' opに依存していないことに気づいた。ですから、私はtf.pack-ed変数を使って自分の損失を再構築する必要があります。もう一度ありがとう! – Xer