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:
- C1 maps CECHA: 15, rozmiar ziaren = (7, 7)
- S2 maps funkcji: 15, pola od widzenia = (2, 2)
- C3 maps cecha: 45, rozmiar ziaren = (6, 6)
- S4 maps Wyposażenie: 45, pola od widzenia = (4, 3)
- C5 maps Wyposażenie: 250, rozmiar ziaren = (5, 5)
- 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!
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
@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