Отображение извлеченного векторного элемента из обученного слоя модели в виде изображения - PullRequest
0 голосов
/ 03 февраля 2019

Я использую трансферное обучение для распознавания объектов.В качестве базовой модели я использовал обученную модель VGG16 и добавил к ней свой классификатор с помощью Keras.Затем я обучил модель на своих данных, модель работает хорошо.Я хочу увидеть функцию, созданную промежуточными слоями модели для заданных данных.Для этой цели я использовал следующий код:

def ModeloutputAtthisLayer(model, layernme, imgnme, width, height):

    layer_name = layernme
    intermediate_layer_model = Model(inputs=model.input,
                                     outputs=model.get_layer(layer_name).output)
    img = image.load_img(imgnme, target_size=(width, height))
    imageArray = image.img_to_array(img)
    image_batch = np.expand_dims(imageArray, axis=0)
    processed_image = preprocess_input(image_batch.copy())
    intermediate_output = intermediate_layer_model.predict(processed_image)
    print("outshape of ", layernme, "is ", intermediate_output.shape)

В коде я использовал np.expand_dims, чтобы добавить одно дополнительное измерение для пакета, поскольку матрица ввода в сеть должна иметь форму (batchsize, height, width, channels),Этот код работает нормально.Форма вектора объектов 1, 224, 224, 64.

Теперь я хочу отобразить это как изображение, для этого я понимаю, что в качестве пакета добавлено дополнительное измерение, поэтому я должен удалить его.После этого я использовал следующие строки кода:

imge = np.squeeze(intermediate_output, axis=0)
plt.imshow(imge)

Однако выдается ошибка:

«Неверные размеры для данных изображения»

Интересно, как я могу отобразить извлеченный вектор объектов в виде изображения?Любое предложение, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Возможный путь состоит в объединении 64 каналов в одноканальное изображение с помощью взвешенной суммы, например:

weighted_imge = np.sum(imge*weights, axis=-1)

, где weights - массив с 64 весовыми коэффициентами.

Если вы хотите придать всем каналам одинаковый вес, вы можете просто вычислить среднее значение:

weighted_imge = np.mean(imge, axis=-1)

Демо

import numpy as np
import matplotlib.pyplot as plt

intermediate_output = np.random.randint(size=(1, 224, 224, 64), 
                                        low=0, high=2**8, dtype=np.uint8)
imge = np.squeeze(intermediate_output, axis=0)
weights = np.random.random(size=(imge.shape[-1],))

weighted_imge = np.sum(imge*weights, axis=-1)

plt.imshow(weighted_imge)
plt.colorbar()

weighted_imge

In [33]: intermediate_output.shape
Out[33]: (1, 224, 224, 64)

In [34]: imge.shape
Out[34]: (224, 224, 64)

In [35]: weights.shape
Out[35]: (64,)

In [36]: weighted_imge.shape
Out[36]: (224, 224)
0 голосов
/ 03 февраля 2019

Ваша форма элемента (1,224,224,64), вы не можете напрямую построить 64 изображение канала.То, что вы можете сделать, это построить отдельные каналы независимо друг от друга, например:

imge = np.squeeze(intermediate_output, axis=0)
filters = imge.shape[2]
plt.figure(1, figsize=(32, 32))   # plot image of size (32x32)
n_columns = 8
n_rows = math.ceil(filters / n_columns) + 1
for i in range(filters):
    plt.subplot(n_rows, n_columns, i+1)
    plt.title('Filter ' + str(i))
    plt.imshow(imge[:,:,i], interpolation="nearest", cmap="gray")

. Это позволит построить 64 изображения в 8 строках и 8 колонках.

...