2

У меня есть нейронная сеть с 300 скрытыми слоями, которые я хочу визуализировать (все вместе).Визуализация визуального поля нейронной сети в python

Каков наилучший способ сделать это в python?

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

Edit:

Так что на выходе я просто 28 * 28 веса (изображения), которые я хочу представить.

Это мой текущий код:

# Plot receptive fields 
f, axarr = pyplot.subplots(30, 10) 


for weight_numb in xrange(300): 
    currnt_sub_handler = axarr[weight_numb/10, weight_numb % 10] 
    weight = main.model_params[:, weight_numb].reshape(28, 28) 
    currnt_sub_handler.axis('off') 
    currnt_sub_handler.imshow(weight) 

pyplot.show() 

Итак, перефразировать вопрос:

  1. Как сделать изображения, чтобы быть как можно ближе друг к другу?
  2. Какой цветной я должен использовать?
+0

Можете ли вы уточнить, какую визуализацию вы хотите? Обычно лучший способ - работать в любых рамках, которые вы используете для выполнения обучения/функции. – mprat

+0

@mprat У меня есть 28 * 28 изображений в количестве 300. Я просто хочу, чтобы их можно было разместить на одном изображении, чтобы люди могли четко видеть каждый из них. – warmspringwinds

+0

Итак, ваш вопрос - как рисовать 300 изображений рядом друг с другом? – mprat

ответ

2

Почему бы не сделать одно большое изображение (матрицу), которое, скажем, (10x28) x (30x28), и вы поместили каждый из ваших фильтров 28x28 в кусок этой матрицы, а затем нарисуйте все изображение сразу , Пример такого вида:

# assuming your filters are stored in a list called all_filters 
all_filter_image = zeros(10*28, 30*28) 
for filter_num in range(300): 
    # calculate start_x and start_y based on the size of your "large filter" 
    # and the filter index 
    all_filter_image[start_x:start_x + 28, start_y: start_y + 28] = all_filters[filter_num] 

Таким образом, вам не придется иметь дело с подзаговорами.

3

Это решение, с которым я столкнулся. Спасибо @mprat за помощь.

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

from matplotlib import pyplot 
import numpy as np 

border = 2 
images_amount = 300 
row_amount = 10 
col_amount = 30 
image_height = 28 
image_width = 28 


all_filter_image = np.zeros((row_amount*image_height + border*row_amount, 
          col_amount*image_width + border*col_amount)) 


for filter_num in range(images_amount): 
    start_row = image_height*(filter_num/col_amount) +\ 
       (filter_num/col_amount + 1)*border 

    end_row = start_row + image_height 

    start_col = image_width*(filter_num % col_amount) +\ 
       (filter_num % col_amount + 1)*border 

    end_col = start_col + image_width 

    all_filter_image[start_row:end_row, start_col:end_col] = \ 
     all_filters[filter_num] 

    print start_row, end_row, start_col, end_col 


pyplot.imshow(all_filter_image) 
pyplot.axis('off') 
pyplot.set_cmap('spectral') 
pyplot.colorbar() 
pyplot.savefig('repflds1.png') 

Вот некоторые примеры использования:

Не так хорошо обученные сети: enter image description here

Действительно хорошо обучен сеть: enter image description here

Как вы можете видеть границы делают это на самом деле легко отличить один фильтр (вес) от другого.

Смежные вопросы