Визуализация фильтров ConvNet с использованием моей собственной точно настроенной сети, приводящая к «NoneType» при работе: K.gradients (loss, model.input) [0] - PullRequest
0 голосов
/ 12 мая 2018

У меня есть настроенная сеть, в которой я использую vgg16.Я следую за разделом 5.4.2 Визуализация фильтров CovNet в Deep Learning With Python (который очень похож на руководство в блоге Keras по визуализации фильтров коннетов здесь ).

Руководство просто использует сеть vgg16.Моя хорошо настроенная модель использует модель vgg16 в качестве базы, например:

model.summary()

Layer (type)                 Output Shape              Param #
=======================================================================
vgg16 (Model)                (None, 4, 4, 512)         14714688  
_______________________________________________________________________ 
flatten_1 (Flatten)          (None, 8192)              0
_______________________________________________________________________ 
dense_7 (Dense)              (None, 256)               2097408   
_______________________________________________________________________ 
dense_8 (Dense)              (None, 3)                 771       
======================================================================== 
Total params: 16,812,867 
Trainable params: 16,812,867
Non-trainable params: 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')

... и я такжепришлось индексировать во вложенный объект Model (мой первый слой - это объект Model, как показано выше), чтобы получить слой '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 Ответ

0 голосов
/ 12 мая 2018

РЕШЕНО: Пришлось использовать:

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]

печатают одно и то же и относятся к одному и тому же типу.

...