我的网络使用了预训练过的vgg16,然后加上自己的全连接层,所以model.sumary()中只显示4层,就是vgg16,flatten,两个全连接层。
这是一个二分类网络,所以输出是一个标量。
为了分析出错样本,我想生成CAM图(class activation map),需要计算最终输出对最后一个卷积层输出的梯度。
结果使用backend.gradients求梯度时,总是出错,返回的梯度根本不是一个tensor,而是一个list。
但是如果我计算输出对输入(model.input)的梯度,则正常。
相关代码如下:
(1)对卷积层输出求梯度,出错
conv_layer = model.get_layer( 'vgg16' )
last_conv_layer = conv_layer.get_layer( 'block5_conv3' )
grads = backend.gradients( model.output[:,0], last_conv_layer.output )[0] #出错位置,返回的grads不是tensor
(2)对输入求梯度,正常 grads = backend.gradients( model.output[:,0], model.input )[0]
请问是哪里犯错了?谢谢!
|