Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convolutional2D Siamese Network in Keras

I'm trying to use Keras's Siamese layer in conjunction with a shared Convolution2D layer. I don't need the input to pass through any other layers before the Siamese layer but the Siamese layer requires that input layers be specified. I can't figure out how to create the input layers to match the input of the conv layer. The only concrete example of the Siamese layer being used I could find is in the tests where Dense layers (with vector inputs) are used as input. Basically, I want an input layer that allows me to specify the image dimensions as input so they can be passed on to the shared conv layer.

In code I have something like the following:

img_rows = 28
img_cols = 28
img_input_shape = (1, img_rows, img_cols)

shared = Sequential()

shared.add(Convolution2D(nb_filters, nb_conv, nb_conv,
                        border_mode='valid',
                        input_shape=img_input_shape))
shared.add(Activation('relu'))
# .... more layers, etc.

right_input_layer = SomeInputLayer(input_shape=img_input_shape) # what should SomeInputLayer be?
left_input_layer = SomeInputLayer(input_shape=img_input_shape)
siamese = Siamese(shared, [left_input_layer, right_input_layer], merge_mode='concat')

model = Sequential()
model.add(siamese)
# ...
model.compile(loss=contrastive_loss, optimizer='rmsprop')

What should SomeInputLayer be? Or is my appraoch in general incorrect?

like image 667
Ben Mabey Avatar asked Feb 05 '16 00:02

Ben Mabey


People also ask

What is siamese network keras?

A Siamese Network is a type of network architecture that contains two or more identical subnetworks used to generate feature vectors for each input and compare them. Siamese Networks can be applied to different use cases, like detecting duplicates, finding anomalies, and face recognition.

What is siamese network used for?

As siamese networks are mostly used in verification systems (face recognition, signature verification, etc.), let's implement a signature verification system using siamese neural networks in PyTorch.


1 Answers

Okay, I figured it out. The "abstract" Layer class is basically a pass through layer which is just what I need. I was also making a mistake where I thought Siamese could take an entire model (i.e. multiple layers) but it in fact only takes a single layer. To make the creation of these Siamese layers less painful there is a add_shared_layer helper function.

I should also point out this pull request that would allow a shared layer to the first layer in a model, exactly what I am trying to do.

like image 72
Ben Mabey Avatar answered Oct 02 '22 00:10

Ben Mabey