Странный вывод для весов / фильтров в CNN - PullRequest
0 голосов
/ 24 января 2019

Моя задача - визуализировать построенные веса в слое cnn. Теперь, когда я передал параметры filters = 32 и kernel_size = (3, 3), я ожидаю, что на выходе получится 32 матрицы размером 3x3 каждая с использованием функции .get_weights() ( для извлечения весов и уклонов), но я получаю очень странный вложенный вывод, вывод выглядит следующим образом:

a = model.layers[0].get_weights() a[0][0][0]

array([[ 2.87332404e-02, -2.80513391e-02, **... 32 values ...**, -1.55516148e-01, -1.26494586e-01, -1.36454999e-01, 1.61165968e-02, 7.63138831e-02], [-5.21791205e-02, 3.13560963e-02, **... 32 values ...**, -7.63987377e-02, 7.28923678e-02, 8.98564830e-02, -3.02852653e-02, 4.07049060e-02], [-7.04478994e-02, 1.33816227e-02, **... 32 values ...**, -1.99537817e-02, -1.67200342e-01, 1.15980692e-02]], dtype=float32)

Я хочу знать, почему я получаю такой странный вывод и как я могу получить веса в идеальной форме. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Веса в нейронной сети - это значения, которые представляют силу соединения между входными узлами и выходными узлами (или узлами на следующем уровне).Веса слоя Conv2D обычно имеют форму (H, W, I, O), где: -

  • H - высота ядра
  • W - ширина ядра
  • Iэто количество входных каналов
  • O это количество выходных каналов

Веса Conv2D можно интерпретировать как прочность соединения между патчем входных каналов и узлами в выходном фильтре / карте возможностей.Таким образом, вы получите вес формы (H, W) между каждым входным каналом и каждым выходным каналом.Следует отметить, что веса распределяются между разными патчами одного и того же канала.

Рассмотрим следующую свертку ввода (8, 8, 1) с ядром (2, 2) и вывода с (8, 8, 1).Веса этого слоя имеют форму (2, 2, 1, 1) enter image description here Этот же вход можно использовать для создания карты 2 объектов с использованием 2 (2, 2) фильтров следующим образом.Теперь форма весов будет (2, 2, 1, 2).enter image description here

Надеюсь, это прояснит, как интерпретировать форму сверточных слоев.

0 голосов
/ 24 января 2019

Форма весов ядра из слоя Conv2D равна (kernel_size[0], kernel_size[1], n_input_channels, filters). Так что в вашем случае

a = model.layers[0].get_weights()
print(a[0].shape)
# should print (3,3,z,32) if your input has shape (x, y, z)

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

a[0][:,:,:,0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...