Визуализация Grad-CAM: неверный аргумент Ошибка: необходимо указать значение для тензора-заполнителя 'X' с плавающей точкой dtype и формой [x] - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь визуализировать важные регионы для задачи классификации с CNN.

Я использую VGG16 + мои собственные верхние слои (средний глобальный пул и плотный слой)

model_vgg16_conv = VGG16(weights='imagenet', include_top=False, input_shape=(100, 100, 3))

model = models.Sequential()

model.add(model_vgg16_conv)

model.add(Lambda(global_average_pooling, output_shape=global_average_pooling_shape))
model.add(Dense(4, activation = 'softmax', init='uniform'))

После компиляции и подгонки модели я пытаюсь использовать 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: Вы должны передать значение для тензора-заполнителя 'vgg16_input' с плавающей точкой dtype и формой [?, 100,100,3] [[{{node vgg16_input}}]] [[Dense_1 / Софтмакс / _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, и я не уверен, что я просто что-то наблюдаю или я неправильно понял всю концепцию.

1 Ответ

2 голосов
/ 02 апреля 2019

С помощью 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>

Так как при использовании функции K.f был предоставлен только один вход, произошла ошибка, связанная с отсутствием ввода для 'vgg16_input'. Это будет работать,

get_output = K.function([input1] + [model.input], [final_conv_layer.output, output1])

[conv_outputs, predictions] = get_output([image, image])

Но функциональный 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...