initial commit, adds notes.md for instructions, adds data, adds python code
This commit is contained in:
0
tests/__init__.py
Normal file
0
tests/__init__.py
Normal file
80
tests/test_siamese.py
Normal file
80
tests/test_siamese.py
Normal file
@ -0,0 +1,80 @@
|
||||
|
||||
"""
|
||||
Tests for the siamese neural network module
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
import keras
|
||||
from keras import Model, Input
|
||||
from keras.layers import Concatenate, Dense, BatchNormalization, Activation
|
||||
|
||||
from siamese import SiameseNetwork
|
||||
|
||||
|
||||
def test_siamese():
|
||||
"""
|
||||
Test that all components the siamese network work correctly by executing a
|
||||
training run against generated data.
|
||||
"""
|
||||
|
||||
num_classes = 5
|
||||
input_shape = (3,)
|
||||
epochs = 1000
|
||||
|
||||
# Generate some data
|
||||
x_train = np.random.rand(100, 3)
|
||||
y_train = np.random.randint(num_classes, size=100)
|
||||
|
||||
x_test = np.random.rand(30, 3)
|
||||
y_test = np.random.randint(num_classes, size=30)
|
||||
|
||||
# Define base and head model
|
||||
def create_base_model(input_shape):
|
||||
model_input = Input(shape=input_shape)
|
||||
|
||||
embedding = Dense(4)(model_input)
|
||||
embedding = BatchNormalization()(embedding)
|
||||
embedding = Activation(activation='relu')(embedding)
|
||||
|
||||
return Model(model_input, embedding)
|
||||
|
||||
def create_head_model(embedding_shape):
|
||||
embedding_a = Input(shape=embedding_shape)
|
||||
embedding_b = Input(shape=embedding_shape)
|
||||
|
||||
head = Concatenate()([embedding_a, embedding_b])
|
||||
head = Dense(4)(head)
|
||||
head = BatchNormalization()(head)
|
||||
head = Activation(activation='sigmoid')(head)
|
||||
|
||||
head = Dense(1)(head)
|
||||
head = BatchNormalization()(head)
|
||||
head = Activation(activation='sigmoid')(head)
|
||||
|
||||
return Model([embedding_a, embedding_b], head)
|
||||
|
||||
# Create siamese neural network
|
||||
base_model = create_base_model(input_shape)
|
||||
head_model = create_head_model(base_model.output_shape)
|
||||
siamese_network = SiameseNetwork(base_model, head_model)
|
||||
|
||||
# Prepare siamese network for training
|
||||
siamese_network.compile(loss='binary_crossentropy',
|
||||
optimizer=keras.optimizers.adam())
|
||||
|
||||
# Evaluate network before training to establish a baseline
|
||||
score_before = siamese_network.evaluate_generator(
|
||||
x_train, y_train, batch_size=64
|
||||
)
|
||||
|
||||
# Train network
|
||||
siamese_network.fit(x_train, y_train,
|
||||
validation_data=(x_test, y_test),
|
||||
batch_size=64,
|
||||
epochs=epochs)
|
||||
|
||||
# Evaluate network
|
||||
score_after = siamese_network.evaluate(x_train, y_train, batch_size=64)
|
||||
|
||||
# Ensure that the training loss score improved as a result of the training
|
||||
assert(score_before > score_after)
|
Reference in New Issue
Block a user