使用我自己的微调网络可视化 ConvNet 过滤器,在运行时导致“NoneType”:K.gradients(loss, model.input)[0]

数据挖掘 喀拉斯 张量流 美国有线电视新闻网 卷积神经网络
2022-03-05 02:58:35

我创建了一个使用 vgg16 作为基础的微调网络。我正在关注第 5.4.2 节使用 Python 在深度学习中可视化 CovNet 过滤器(这与 Keras 博客上的指南非常相似,以在此处可视化 convnet 过滤器)。

该指南仅使用 vgg16 网络。我的微调模型使用 vgg16 模型作为基础,例如:

model.summary()

层(类型)输出形状参数#
=========================================== ============================= vgg16(型号)(无、4、4、512)14714688
_______________________________________________________________________ flatten_1(展平)(无, 8192) 0
___________________________________________________________________ 密集_7 (密集) (无, 256) 2097408
________________________________________________________________________ 密集_8 (密集) (无, 3) 771
======================= ================================================= 总参数:16,812,867 可训练参数:16,812,867 不可训练参数:0

当我运行这条线时遇到了一个问题: grads = K.gradients(loss, model.input)[0]当我使用我的微调网络时,我得到的结果是“NoneType”

以下是指南中的代码:

> from keras.applications import VGG16 from keras import backend as K
> 
> model = VGG16(weights='imagenet',
>               include_top=False)
> 
> layer_name = 'block3_conv1' filter_index = 0
> 
> layer_output = model.get_layer(layer_name).output loss =
> K.mean(layer_output[:, :, :, filter_index])
> 
> grads = K.gradients(loss, model.input)[0]

为了重现我的微调模型,我使用了完全相同的代码,除了我显然更改了我导入的模型:

model = keras.models.load_model(trained_models_dir + 'fine_tuned_model.h5')

...而且我还必须索引嵌套的模型对象(我的第一层是一个模型对象,如上所示)以获得“block2_con1”层:

my_Model_object = 'vgg16'
layer_name = 'block3_conv1'
filter_index = 0

layer_output = 
model.get_layer(my_Model_object).get_layer(layer_name).output

知道为什么grads = K.gradients(loss, model.input)[0]在我的微调网络上运行会导致“NoneType”吗?

谢谢。

1个回答

已解决: 我不得不使用:grads = K.gradients(loss, model.get_layer(my_Model_object).get_layer('input_1').input)[0]

而不仅仅是grads = K.gradients(loss, model.input)[0]

这很令人困惑,因为两者都model.get_layer(my_Model_object).get_layer('input_1').input)[0] 打印 model.input[0]相同的东西并且属于相同的类型。