web-dev-qa-db-ja.com

K.gradients(loss、input_img)[0]は "None"を返します。 (Tensorflowバックエンドを使用したKeras CNNの視覚化)

TensorflowバックエンドでKerasを使用してトレーニングされたCNNモデルがあります。そして、このチュートリアルでCNNフィルターを視覚化したいと思います。 https://blog.keras.io/how-convolutional-neural-networks-see-the-world.html

_from keras import backend as K
from keras.models import load_model
import numpy as np

model = load_model('my_cnn_model.h5')
input_img = np.load('my_picture.npy')

# get the symbolic outputs of each "key" layer (we gave them unique names).
layer_dict = dict([(layer.name, layer) for layer in model.layers])

layer_name = 'block5_conv3'
filter_index = 0  # can be any integer from 0 to 511, as there are 512 filters in that layer

# build a loss function that maximizes the activation
# of the nth filter of the layer considered
layer_output = layer_dict[layer_name].output
loss = K.mean(layer_output[:, :, :, filter_index])

# compute the gradient of the input picture wrt this loss
grads = K.gradients(loss, input_img)[0]

# normalization trick: we normalize the gradient
grads /= (K.sqrt(K.mean(K.square(grads))) + 1e-5)

# this function returns the loss and grads given the input picture
iterate = K.function([input_img], [loss, grads])
_

ただし、コードがこの行まで実行されると、
grads = K.gradients(loss, input_img)[0]
Noneオブジェクトしか返さないので、その後プログラムを続行できません。

解決策を探します。 the _input_img_はテンソルフローのテンソルタイプである必要があると言う人もいます: https://github.com/keras-team/keras/issues/5455

しかし、imgをTensorに変換しようとしたとき、問題はまだ存在しています。
上記のリンクで解決策を試しましたが、まだ失敗します。

また、CNNモデルが区別できないためにこの問題が存在すると言う人もいます。 https://github.com/keras-team/keras/issues/8478

しかし、私のモデルはReLUおよびSigmoid(出力層)のアクティブ化機能のみを使用します。この問題は、区別できない問題によって本当に引き起こされているのですか?

誰か助けてもらえますか?どうもありがとうございました!

10
Jexus

Modelインスタンスがある場合、入力に関する損失の勾配を取得するには、次のようにする必要があります。

grads = K.gradients(loss, model.input)[0]

model.inputには、モデルへの入力を表すシンボリックテンソルが含まれます。単純なnumpy配列を使用しても意味がありません。これは、TensorFlowがこれを計算グラフにどのように接続するかがわからないため、勾配としてNoneを返すためです。

次に、iterate関数を次のように書き換える必要があります。

iterate = K.function([model.input], [loss, grads])
11

以下は、私の例です。誰かを助けることを願っています。

gradient = keras.backend.gradients(model.output, model.input)[2]

iterate = keras.backend.function(model.input, [gradient])

grad = iterate([patches, depthes, poses])

[パッチ、深度、ポーズ]は私のモデルです。入力

2
Fangjing Song