Так что я пытаюсь реализовать this документ о сиамской нейронной сети: Учится сходство метрики дискриминационна, с применением к лицу проверки, по Sumit Чопр, Raia Hadsell и Лекуну (2005) , Вместо этого я использую CIFAR10 dataset, но с 10 классами.Реализация сиамского NN в Keras
Характеристики одной из ножек воспроизводятся для удобства. Обозначение: C_x - слой свертки, S_x - слой подвыборки, а F_x - полностью связанный слой; с общим индексом х:
- С1: функция карты: 15, размер ядра = (7, 7)
- S2: функция карты: 15, поле-обзора = (2, 2)
- С3: функция карты: 45, размер ядра = (6, 6)
- S4: функция карты: 45, поле-обзора = (4, 3)
- С5: функция карты: 250, размер ядра = (5, 5)
- F6 (полностью подключенный уровень): нет. единиц = 50
Что я Пробовал
model = Sequential()
#C1
model.add(Convolution2D(15, 7, 7,
activation='relu',
border_mode='same',
input_shape=input_img_shape))
print("C1 shape: ", model.output_shape)
#S2
model.add(MaxPooling2D((2,2), border_mode='same'))
print("S2 shape: ", model.output_shape)
#...
#C5
model.add(Convolution2D(250, 5, 5,
activation='relu',
border_mode='same'))
print("C5 shape: ", model.output_shape)
#F6
model.add(Dense(50))
Это проливает длинное сообщение об ошибке, которое я считаю, это ошибка Reshape. Фрагмент ошибки:
Exception: Input 0 is incompatible with layer dense_13: expected
ndim=2, found ndim=4
Я знаю, что проблема изолирована в этом окончательном плотном слое, так как код протекает гладко, если я закомментировать. Но я точно не знаю, как я должен тогда форматировать/указывать свой окончательный полностью подключенный слой, чтобы он был совместим с предыдущим уровнем свертки?
Некоторые места я Посмотрел
This является связанной проблемой, хотя реализация немного отличается (кажется, что это не основной слой «SIAMESE» в keras на момент написания этой статьи). Я знаю, что есть также implementations in Theano, что я буду иметь в виду, если я просто не могу это сделать в керасе.
Спасибо!
Концептуально, могу ли я спросить, зачем вам нужно «сгладить» слой? Это ново для меня, потому что я не видел упоминания в этой статье. Благодаря! – AndreyIto
@AndreyIto это больше детали реализации: в Keras выход слоя 'Convolution2D' имеет 4 измерения [(см. Источник)] (https://github.com/fchollet/keras/blob/master/keras/layers /convolutional.py#L248), тогда как ввод слоя «Плотный» должен быть размером 2 [(см. источник)] (https://github.com/fchollet/keras/blob/master/keras/layers/core.py # L567). Поэтому вам нужно сгладить ваши данные слоем «Flatten», прежде чем передавать его через слой «Dense». – sytrus