Я построил сверточную нейронную сеть в Керасе.
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?
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