2016-07-26 18 views
5

Więc próbuję wdrożyć this papier o Siamese sieci neuronowej: nauka podobieństwo metryczny discriminatively, z wnioskiem o weryfikację twarz, przez Sumit Chopra, raia Hadsell i Yann LeCun (2005) . Używam zamiast tego CIFAR10 dataset z 10 klasami.Wdrożenie Siamese NN Keras

Specyfikacje jednej z nóg zostały odtworzone dla wygody. Notacja: C_x jest warstwą splotową, S_x jest warstwą podpodku, a F_x jest warstwą w pełni połączoną; ze wspólnym indeksem x:

  1. C1 maps CECHA: 15, rozmiar ziaren = (7, 7)
  2. S2 maps funkcji: 15, pola od widzenia = (2, 2)
  3. C3 maps cecha: 45, rozmiar ziaren = (6, 6)
  4. S4 maps Wyposażenie: 45, pola od widzenia = (4, 3)
  5. C5 maps Wyposażenie: 250, rozmiar ziaren = (5, 5)
  6. F6 (warstwa całkowicie połączona): nie. jednostek = 50

Co Próbowałem

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)) 

ten rzuca długi komunikat o błędzie, który moim zdaniem jest błędem Reshape. Fragment błędu:

Exception: Input 0 is incompatible with layer dense_13: expected 
ndim=2, found ndim=4 

wiem, że problem jest izolowana w tej ostatniej warstwy gęsty, ponieważ kod przechodzi płynnie gdybym skomentować go. Ale nie jestem pewien, w jaki sposób powinienem następnie ukształtować/określić moją końcową, w pełni połączoną warstwę, aby była zgodna z poprzednią warstwą splotu?

niektórych miejscach Szukałem

This jest związany z tym problem, choć realizacja jest nieco inny (wydaje się, że nie jest to rdzeń warstwy „” syjamskie w Keras w momencie pisania tego tekstu). Jestem świadomy, że są też implementations in Theano, o których będę pamiętać, jeśli nie będę w stanie tego zrobić w kerasach.

Dzięki!

Odpowiedz

3

Jak wspomniał Matias Valdenegro, Keras ma już przykład Siamese network. W przykładzie wykorzystano jednak tylko gęste warstwy.

Twój problem jest, że trzeba dodać Flatten warstwę pomiędzy warstwami splotu i gęstych warstwach mieć właściwy kształt, zobacz this Keras CNN example

te 2 przykłady powinny pomóc zbudować Siamese sieci.

+0

Pojęciowo, czy mógłbym zapytać, dlaczego potrzebna jest warstwa "spłaszczania"? Jest to dla mnie nowe, ponieważ nie widziałem tego w artykule. Dzięki! – AndreyIto

+1

@AndreyIto jest to bardziej szczegółowo implementacji: W Keras, wyjście z warstwy 'Convolution2D' ma 4 wymiary [(patrz źródło)] (https://github.com/fchollet/keras/blob/master/keras/layers /convolutional.py#L248), podczas gdy wejście warstwy 'Dense' powinno mieć wymiar 2 [(patrz źródło)] (https://github.com/fchollet/keras/blob/master/keras/layers/core.py # L567). Musisz spłaszczyć dane za pomocą warstwy 'Flatten' przed przejściem przez warstwę' Dense'. – sytrus

1

Nie potrzebujesz warstwy syjamskiej, wystarczy użyć Keras functional API, aby utworzyć model z dwoma wejściami i jednym wyjściem.

Wydaje się, że Keras przykłady already contain model, który jest bardzo podobny do tego, który wdrażasz.

+0

Dzięki za twój wkład!Tak, spotkałem się z tym przykładem i pomogło mi to złożyć ogólną strukturę, ale nie rozwiązało problemu zarządzania kształtami między warstwami. Ale i tak dzięki! – AndreyIto