Python 渐变CAM可视化:无效参数错误:必须为占位符张量';输入一个值;X';使用dtype float和shape[x]

Python 渐变CAM可视化:无效参数错误:必须为占位符张量';输入一个值;X';使用dtype float和shape[x],python,tensorflow,keras,invalidargumentexception,Python,Tensorflow,Keras,Invalidargumentexception,我正试图通过CNN将重要区域可视化,以便进行分类任务 我正在使用VGG16+我自己的顶层(一个全局平均池层和一个密集层) 编译并拟合模型后,我尝试使用Grad CAM制作新图像: image = cv2.imread("data/example_images/test.jpg") # Resize to 100x100 image = resize(image,(100,100),anti_aliasing=True, mode='constant') # Because it's a grey

我正试图通过CNN将重要区域可视化,以便进行分类任务

我正在使用VGG16+我自己的顶层(一个全局平均池层和一个密集层)

编译并拟合模型后,我尝试使用Grad CAM制作新图像:

image = cv2.imread("data/example_images/test.jpg")
# Resize to 100x100
image = resize(image,(100,100),anti_aliasing=True, mode='constant')
# Because it's a grey scale image extend the dimensions
image = np.repeat(image.reshape(1,100, 100, 1), 3, axis=3)

class_weights = model.get_layer("dense_1").get_weights()[0]
final_conv_layer = model.get_layer("vgg16").get_layer("block5_conv3")
input1 = model.get_layer("vgg16").layers[0].input
output1 = model.get_layer("dense_1").output
get_output = K.function([input1], [final_conv_layer.output, output1])
在那之后我要执行死刑

[conv_outputs, predictions] = get_output([image])
导致以下错误:

InvalidArgumentError:必须为带有数据类型float和形状[?,100100,3]的占位符张量“vgg16_input”输入一个值 [{{node vgg16_input}}]] [[dense_1/Softmax/_233]]

其他信息

def global_average_pooling(x):
    return K.mean(x, axis = (2, 3))

def global_average_pooling_shape(input_shape):
    return input_shape[0:2]
模型摘要:

Layer (type)                 Output Shape              Param #   
=================================================================
vgg16 (Model)                (None, 3, 3, 512)         14714688  
_________________________________________________________________
lambda_1 (Lambda)            (None, 3)                 0         
_________________________________________________________________
dense_1 (Dense)              (None, 4)                 16        
=================================================================
Total params: 14,714,704
Trainable params: 16
Non-trainable params: 14,714,688
VGG模型概要:

Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 100, 100, 3)       0   
...

我是Grad CAM的新手,我不确定我是在监督什么,还是误解了整个概念。

对于Sequential,层是通过add()方法添加的。在本例中,由于直接添加了模型对象,现在模型有两个输入—一个通过顺序输入,另一个通过model_vgg16_conv输入

>>> layer = model.layers[0]
>>> layer.get_input_at(0)
<tf.Tensor 'input_1:0' shape=(?, ?, ?, 3) dtype=float32>
>>> layer.get_input_at(1)
<tf.Tensor 'vgg16_input:0' shape=(?, ?, ?, 3) dtype=float32>
但是功能API可以在这种情况下使用,如下所示:

model_vgg16_conv = VGG16(weights='imagenet', include_top=False, input_shape=(100, 100, 3))
gavg = Lambda(global_average_pooling, output_shape=global_average_pooling_shape)(model_vgg16_conv.output)
output = Dense(4, activation = 'softmax', init='uniform')(gavg)
model_f = Model(model_vgg16_conv.input, output)

final_conv_layer = model_f.get_layer("block5_conv3")
get_output = K.function([model_f.input], [final_conv_layer.output, model_f.output])
[conv_outputs, predictions] = get_output([image])

对于Sequential,使用add()方法添加层。在本例中,由于直接添加了模型对象,现在模型有两个输入—一个通过顺序输入,另一个通过model_vgg16_conv输入

>>> layer = model.layers[0]
>>> layer.get_input_at(0)
<tf.Tensor 'input_1:0' shape=(?, ?, ?, 3) dtype=float32>
>>> layer.get_input_at(1)
<tf.Tensor 'vgg16_input:0' shape=(?, ?, ?, 3) dtype=float32>
但是功能API可以在这种情况下使用,如下所示:

model_vgg16_conv = VGG16(weights='imagenet', include_top=False, input_shape=(100, 100, 3))
gavg = Lambda(global_average_pooling, output_shape=global_average_pooling_shape)(model_vgg16_conv.output)
output = Dense(4, activation = 'softmax', init='uniform')(gavg)
model_f = Model(model_vgg16_conv.input, output)

final_conv_layer = model_f.get_layer("block5_conv3")
get_output = K.function([model_f.input], [final_conv_layer.output, model_f.output])
[conv_outputs, predictions] = get_output([image])

非常感谢你。解释得很好。工作起来很有魅力!非常感谢你。解释得很好。工作起来很有魅力!