2016-07-26 15 views
5

Так что я пытаюсь реализовать this документ о сиамской нейронной сети: Учится сходство метрики дискриминационна, с применением к лицу проверки, по Sumit Чопр, Raia Hadsell и Лекуну (2005) , Вместо этого я использую CIFAR10 dataset, но с 10 классами.Реализация сиамского NN в Keras

Характеристики одной из ножек воспроизводятся для удобства. Обозначение: C_x - слой свертки, S_x - слой подвыборки, а F_x - полностью связанный слой; с общим индексом х:

  1. С1: функция карты: 15, размер ядра = (7, 7)
  2. S2: функция карты: 15, поле-обзора = (2, 2)
  3. С3: функция карты: 45, размер ядра = (6, 6)
  4. S4: функция карты: 45, поле-обзора = (4, 3)
  5. С5: функция карты: 250, размер ядра = (5, 5)
  6. 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, что я буду иметь в виду, если я просто не могу это сделать в керасе.

Спасибо!

ответ

3

Как уже упоминалось Матиасом Вальденгоро, у Keras уже есть пример Siamese network. Однако пример использует только плотные слои.

Вашей проблема заключается в том, что вам нужно добавить Flatten слой между слоями свертка и плотными слоями, чтобы иметь правильную форму, см this Keras CNN example

Эти 2 примеров должны помочь вам построить вашу сиамскую сеть.

+0

Концептуально, могу ли я спросить, зачем вам нужно «сгладить» слой? Это ново для меня, потому что я не видел упоминания в этой статье. Благодаря! – AndreyIto

+1

@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

1

Вам не нужен сиамский слой, вам просто нужно использовать Keras functional API для создания модели с двумя входами и одним выходом.

Кажется, что Keras примеры already contain модель, очень похожая на ту, которую вы реализуете.

+0

Спасибо за ваш вклад!Да, я столкнулся с этим примером, и это помогло мне скомпоновать общую структуру, но это не касалось конкретной проблемы управления фигурами между слоями. Но все равно спасибо! – AndreyIto