Визуализация сверточных слоев в Керасе - PullRequest
0 голосов
/ 16 декабря 2018

Я хочу визуализировать изображения в сверточных слоях модели глубокого обучения, я нашел код в ссылке.

https://github.com/yashk2810/Visualization-of-Convolutional-Layers/blob/master/Visualizing%20Filters%20Python3%20Theano%20Backend.ipynb

Я применил тот же код, но я опустелimages.

Я использую flow_from_directory для чтения изображений.

enter image description here

Пожалуйста, помогите мненайти решение ..

код здесь

 img_to_visualize = image.load_img('img.jpg', target_size=(224, 224))


    img_to_visualize = np.expand_dims(img_to_visualize,axis=0)

    def layer_to_visualize(layer):


        inputs = [K.learning_phase()] + vgg16_face_model.inputs

        _convout1_f = K.function(inputs, [layer.output])
        def convout1_f(X):
            # The [0] is to disable the training phase flag
            return _convout1_f([0] + [X])

        convolutions = convout1_f(img_to_visualize)
        convolutions = np.squeeze(convolutions)

        print ('Shape of conv:', convolutions.shape)

        n = convolutions.shape[0]
        n = int(np.ceil(np.sqrt(n)))

        # Visualization of each filter of the layer
        fig = plt.figure(figsize=(12,8))
        for i in range(len(convolutions)):
            ax = fig.add_subplot(n,n,i+1)
            ax.imshow(convolutions[i], cmap='viridis')

    # Specify the layer to want to visualize
    layer_to_visualize(convout2)

1 Ответ

0 голосов
/ 17 декабря 2018

Поскольку у вас есть вывод "Shape of conv: (14, 14, 512)", и вы пометили свой вопрос "tenorsflow", я бы предположил, что вы не используете бэкэнд Theano и имеет "image_data_format" Существо "channels_last ".Я не использовал Theano сам, но на основании моего поиска в бэкэнде Thenao по умолчанию может быть «channel_first».Поэтому при циклическом просмотре вывода слоя:

for i in range(len(convolutions)):
    ax = fig.add_subplot(n,n,i+1)
    ax.imshow(convolutions[i], cmap='viridis')

На самом деле вы рисуете 14 изображений, каждое из которых имеет размер 14x512, а не 512 изображений, каждый из которых имеет размер 14x14 (что, я полагаю, является тем, что вам нужно).

Простое (что означает, что вы можете использовать функцию, которую вы уже написали) - это установить "image_data_format" "channel_first", добавив K.set_image_data_format('channels_first') в верхнюю часть вашего блокнота / скрипта.Однако это исправление может конфликтовать с другими вашими кодами.В этом случае вы можете переписать вашу функцию визуализации слоя.Вот пример, который работает с https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py

import matplotlib.pyplot as plt
import numpy as np

def visualize_layer(model, layer, input, train_mode=False):
    get_layer_output = K.function([model.input, K.learning_phase()],
                                  [layer.output])
    layer_output = get_layer_output([input, int(train_mode)])[0]
    print('Shape of {} layer output: {}'.format(layer, layer_output.shape))
    for i, sample in enumerate(layer_output):
        n_img = sample.shape[-1]
        img_row = int(np.ceil(np.sqrt(n_img)))
        fig = plt.figure()
        for j in range(n_img):
            ax = fig.add_subplot(img_row, img_row, j+1)
            ax.imshow(sample[:, :, j], cmap='gray')
        fig.savefig('sample_{}.png'.format(i))

visualize_layer(model, model.layers[1], [x_train[0]])
...