Форма вывода сверточного слоя

Я построил сверточную нейронную сеть в Керасе.

model.add(Convolution1D(nb_filter=111, filter_length=5, border_mode='valid', activation="relu", subsample_length=1))

Согласно лекции CS231, операция свертки создает карту функций (т. Е. Карту активации) для каждого фильтр, которые затем складываются вместе. В моем случае сверточный слой имеет 300-размерный вход. Следовательно, я ожидаю следующего вычисления:

  • Каждый фильтр имеет размер окна 5. Следовательно, каждый фильтр производит 300-5 + 1 = 296 сверток.
  • Поскольку имеется 111 фильтров, на выходе сверточного слоя должно быть 111 * 296.

Однако фактические выходные формы выглядят иначе:

convolutional_layer = model.layers[1]
conv_weights, conv_biases = convolutional_layer.get_weights()

print(conv_weights.shape) # (5, 1, 300, 111)
print(conv_biases.shape)  # (,111)

Форма значений смещения имеет смысл, потому что для каждого фильтра существует одно значение смещения. Однако мне непонятна форма гирь. По-видимому, первое измерение зависит от размера фильтра. Третье измерение - это количество входных нейронов, которое должно быть уменьшено за счет свертки. Последний параметр, вероятно, относится к количеству фильтров. Это не имеет смысла, потому что как мне легко получить карту функций для конкретного фильтра?

Keras использует Theano или Tensorflow в качестве бэкэнда. Согласно их документации, результатом операции свертки является 4-мерный тензор (batch_size, output_channel, output_rows, output_columns).

Может кто-нибудь объяснить мне форму вывода в соответствии с лекцией CS231?


person null    schedule 08.05.2017    source источник
comment
Ну ... фактическая выходная форма - это не форма весов. Вы можете увидеть выходную форму, когда создадите модель и сделаете model.summary(). Но, возможно, у вас есть перевернутые размеры на входе: (каналы x длина 1d) по сравнению (длина 1d x каналы). Попробуйте инвертировать вход с помощью Reshape ((1,300)) или Reshape ((300,1)) - это будет зависеть от того, настроен ли ваш keras для каналов первым или каналов последним. (Кроме того, я не знаю, что означает subsample_length=1, похоже, его нет в документации keras).   -  person Daniel Möller    schedule 08.05.2017


Ответы (2)


  • Ваш вес должен быть [filter_height, filter_width, in_channel, out_channe]
  • В вашем примере я думаю, что входной канал, глубина которого составляет 300, и вы хотите, чтобы выходной канал был 111
  • Всего фильтров 111, а не 300 * 111
  • Как вы сами сказали, каждое смещение для каждого фильтра, поэтому смещение 111 для 111 фильтров
  • Каждый фильтр из 111 будет производить свертку на входе
  • Форма веса в вашем случае означает, что вы используете патч ядра формы 5 * 1.
  • Третье измерение означает, что глубина входной карты объектов равна 300.
  • Четвертое измерение означает, что глубина выходной карты объектов равна 111.
person Jai    schedule 15.01.2018

На самом деле это имеет смысл. Вы узнаете веса фильтров. Каждый фильтр, в свою очередь, создает выходные данные (также называемые картой активации, соответствующей вашим входным данным).

Первые две оси вашего conv_weights.shape - это размеры вашего изучаемого фильтра (как вы уже упоминали). Ваш filter_length равен 5 x 1. Ваш входной параметр имеет 300 измерений, и вы хотите получить 111 фильтров на измерение, так что в итоге вы получите 300 * 111 фильтров с размером 5 * 1.

Я предполагаю, что карта характеристик фильтра №0 для измерения №0 похожа на your_weights[:, :, 0, 0].

person petezurich    schedule 14.09.2017