From 25fa687f7f63ca17f013dfe5fb7cfeea6e82c929 Mon Sep 17 00:00:00 2001 From: raphael Date: Thu, 22 Jul 2021 22:24:50 +0200 Subject: [PATCH] initial commit, adds notes.md for instructions, adds data, adds python code --- .devcontainer/Dockerfile | 37 ++++ .devcontainer/devcontainer.json | 12 ++ .devcontainer/docker-compose.yml | 22 +++ .gitignore | 114 ++++++++++++ LICENSE | 21 +++ README.md | 144 +++++++++++++++ data | 1 + mnist_example.py | 94 ++++++++++ mnist_siamese_example.py | 299 +++++++++++++++++++++++++++++++ model.png | Bin 0 -> 44681 bytes mymodel.png | Bin 0 -> 149604 bytes notes.md | 39 ++++ requirements.txt | 4 + setup.py | 15 ++ siamese.py | 291 ++++++++++++++++++++++++++++++ tests/__init__.py | 0 tests/test_siamese.py | 80 +++++++++ 17 files changed, 1173 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/docker-compose.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 120000 data create mode 100644 mnist_example.py create mode 100644 mnist_siamese_example.py create mode 100644 model.png create mode 100644 mymodel.png create mode 100644 notes.md create mode 100644 requirements.txt create mode 100644 setup.py create mode 100644 siamese.py create mode 100644 tests/__init__.py create mode 100644 tests/test_siamese.py diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..f4241e0 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,37 @@ +FROM tensorflow/tensorflow:1.13.2-gpu + +## Install updates and network tool +RUN apt-get update -y && apt-get upgrade -y && apt install net-tools -y + +## Install basic functions +RUN apt-get install sudo -y + +## Install git +RUN apt-get install git -y + +## Install python requirements +COPY requirements.txt . +RUN pip install -r requirements.txt + +## Create user and group +ARG HOST_USER_UID=1000 +ARG HOST_USER_GID=1000 +RUN groupadd -g $HOST_USER_GID containergroup +RUN useradd -m -l -u $HOST_USER_UID -g $HOST_USER_GID containeruser + +## Passwordless sudo for user +RUN usermod -aG sudo containeruser +RUN echo "containeruser ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/containeruser && \ + chmod 0440 /etc/sudoers.d/containeruser + +## Activate User +USER containeruser + +## Set working directory +WORKDIR /home/containeruser + +## Workaround for vscode bug +ENV HOME=/home/containeruser + +## Keep container running forever +CMD tail -f /dev/null diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..9258f8b --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,12 @@ +{ + "name": "siamese", + "dockerComposeFile": "docker-compose.yml", + "workspaceMount": "/workspace", + "workspaceFolder": "/workspace", + "service": "devcontainer", + "shutdownAction": "stopCompose", + "extensions": [ + "ms-python.python", + "ms-azuretools.vscode-docker" + ] +} diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml new file mode 100644 index 0000000..e016851 --- /dev/null +++ b/.devcontainer/docker-compose.yml @@ -0,0 +1,22 @@ +version: '2.3' +services: + devcontainer: + + build: + context: .. + dockerfile: .devcontainer/Dockerfile + args: + HOST_USER_UID: 1000 + HOST_USER_GID: 1000 + + network_mode: host + environment: + - DISPLAY=$DISPLAY + runtime: nvidia + + volumes: + - ..:/workspace + - ~/.gitconfig:/home/containeruser/.gitconfig + - ~/.ssh:/home/containeruser/.ssh + + command: sleep infinity diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..efd5831 --- /dev/null +++ b/.gitignore @@ -0,0 +1,114 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +/env + +# idea files +.idea/ + +# model checkpoint data +checkpoint +model_checkpoint +siamese_checkpoint diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..11b1e4e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 aspamers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0701f2d --- /dev/null +++ b/README.md @@ -0,0 +1,144 @@ +# Siamese Neural Network for Keras + +This project provides a lightweight, easy to use and flexible siamese neural network module for use with the Keras +framework. + +Siamese neural networks are used to generate embeddings that describe inter and extra class relationships. +This makes Siamese Networks like many other similarity learning algorithms suitable as a pre-training step for many +classification problems. + +An example of the siamese network module being used to produce a noteworthy 99.85% validation performance on the MNIST +dataset with no data augmentation and minimal modification from the Keras example is provided. + +## Installation + +Create and activate a virtual environment for the project. +```sh +$ virtualenv env +$ source env/bin/activate +``` + +To install the module directly from GitHub: +``` +$ pip install git+https://github.com/aspamers/siamese +``` + +The module will install keras and numpy but no back-end (like tensorflow). This is deliberate since it leaves the module +decoupled from any back-end and gives you a chance to install whatever backend you prefer. + +To install tensorflow: +``` +$ pip install tensorflow +``` + +To install tensorflow with gpu support: +``` +$ pip install tensorflow-gpu +``` + +## To run examples + +With the activated virtual environment with the installed python package run the following commands. + +To run the mnist baseline example: +``` +$ python mnist_example.py +``` + +To run the mnist siamese pretrained example: +``` +$ python mnist_siamese_example.py +``` + +## Usage +For detailed usage examples please refer to the examples and unit test modules. If the instructions are not sufficient +feel free to make a request for improvements. + +- Import the module +```python +from siamese import SiameseNetwork +``` + +- Load or generate some data. +```python +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) +``` + +- Design a base model +```python +def create_base_model(input_shape): + model_input = Input(shape=input_shape) + embedding = Flatten()(model_input) + embedding = Dense(128)(embedding) + return Model(model_input, embedding) +``` + +- Design a head model +```python +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 an instance of the SiameseNetwork class +```python +base_model = create_base_model(input_shape) +head_model = create_head_model(base_model.output_shape) +siamese_network = SiameseNetwork(base_model, head_model) +``` + +- Compile the model +```python +siamese_network.compile(loss='binary_crossentropy', optimizer=keras.optimizers.adam()) +``` + +- Train the model +```python +siamese_network.fit(x_train, y_train, + validation_data=(x_test, y_test), + batch_size=64, + epochs=epochs) +``` + +## Development Environment +Create and activate a test virtual environment for the project. +```sh +$ virtualenv env +$ source env/bin/activate +``` + +Install requirements +```sh +$ pip install -r requirements.txt +``` + +Install the backend of your choice. +``` +$ pip install tensorflow +``` + +Run tests +```sh +$ pytest tests/test_siamese.py +``` + +## Development container +To set up the vscode development container follow the instructions at the link provided: +https://github.com/aspamers/vscode-devcontainer + +You will also need to install the nvidia docker gpu passthrough layer: +https://github.com/NVIDIA/nvidia-docker diff --git a/data b/data new file mode 120000 index 0000000..3e1c8cc --- /dev/null +++ b/data @@ -0,0 +1 @@ +/home/creation/files/data/ \ No newline at end of file diff --git a/mnist_example.py b/mnist_example.py new file mode 100644 index 0000000..f14a0c1 --- /dev/null +++ b/mnist_example.py @@ -0,0 +1,94 @@ +""" +This is a modified version of the Keras mnist example. +https://keras.io/examples/mnist_cnn/ + +Instead of using a fixed number of epochs this version continues to train +until the stop criteria is reached. + +Model performance should be around 99.4% after training. +""" + +from __future__ import print_function +import keras +from keras.datasets import mnist +from keras.layers import Conv2D, MaxPooling2D, BatchNormalization, Activation +from keras import backend as K +from keras.callbacks import ModelCheckpoint, EarlyStopping +from keras.models import Model +from keras.layers import Input, Flatten, Dense + +batch_size = 128 +num_classes = 10 +epochs = 999999 + +# input image dimensions +img_rows, img_cols = 28, 28 + +# the data, split between train and test sets +(x_train, y_train), (x_test, y_test) = mnist.load_data() + +if K.image_data_format() == 'channels_first': + x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols) + x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols) + input_shape = (1, img_rows, img_cols) +else: + x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) + x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) + input_shape = (img_rows, img_cols, 1) + +x_train = x_train.astype('float32') +x_test = x_test.astype('float32') +x_train /= 255 +x_test /= 255 + +y_train = keras.utils.to_categorical(y_train, num_classes) +y_test = keras.utils.to_categorical(y_test, num_classes) + + +def create_base_network(input_shape): + input = Input(shape=input_shape) + x = Conv2D(32, kernel_size=(3, 3), + input_shape=input_shape)(input) + x = BatchNormalization()(x) + x = Activation(activation='relu')(x) + x = MaxPooling2D(pool_size=(2, 2))(x) + x = Conv2D(64, kernel_size=(3, 3))(x) + x = BatchNormalization()(x) + x = Activation(activation='relu')(x) + x = MaxPooling2D(pool_size=(2, 2))(x) + x = Flatten()(x) + x = Dense(128)(x) + x = BatchNormalization()(x) + x = Activation(activation='relu')(x) + x = Dense(num_classes)(x) + x = BatchNormalization()(x) + x = Activation(activation='softmax')(x) + return Model(input, x) + + +model = create_base_network(input_shape) +model.compile(loss=keras.losses.categorical_crossentropy, + optimizer=keras.optimizers.adam(), + metrics=['accuracy']) + +checkpoint_path = "./checkpoint" + +callbacks = [ + EarlyStopping(monitor='val_acc', patience=10, verbose=0), + ModelCheckpoint(checkpoint_path, + monitor='val_acc', + save_best_only=True, + verbose=0) +] +model.fit(x_train, y_train, + batch_size=batch_size, + epochs=epochs, + verbose=1, + callbacks=callbacks, + validation_data=(x_test, y_test)) + +model.load_weights(checkpoint_path) + +score = model.evaluate(x_test, y_test, verbose=0) +print('Test loss:', score[0]) +print('Test accuracy:', score[1]) diff --git a/mnist_siamese_example.py b/mnist_siamese_example.py new file mode 100644 index 0000000..737f6ea --- /dev/null +++ b/mnist_siamese_example.py @@ -0,0 +1,299 @@ +""" +This is a modified version of the Keras mnist example. +https://keras.io/examples/mnist_cnn/ + +Instead of using a fixed number of epochs this version continues to train until a stop criteria is reached. + +A siamese neural network is used to pre-train an embedding for the network. The resulting embedding is then extended +with a softmax output layer for categorical predictions. + +Model performance should be around 99.84% after training. The resulting model is identical in structure to the one in +the example yet shows considerable improvement in relative error confirming that the embedding learned by the siamese +network is useful. +""" + +from __future__ import print_function +import tensorflow.keras as keras +from tensorflow.keras.datasets import mnist +from tensorflow.keras.layers import Conv2D, MaxPooling2D, BatchNormalization, Activation, Concatenate +from tensorflow.keras import backend as K +from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping +from tensorflow.keras.models import Model +from tensorflow.keras.layers import Input, Flatten, Dense + +from siamese import SiameseNetwork + +import os, math, numpy as np +from PIL import Image + +import pdb + +batch_size = 128 +num_classes = 131 +epochs = 999999 + +# input image dimensions +img_rows, img_cols = 28, 28 + +def createTrainingData(): + base_dir = '../towards/data/fruits-360/Training/' + train_test_split = 0.7 + no_of_files_in_each_class = 80 + + #Read all the folders in the directory + folder_list = os.listdir(base_dir) + print( len(folder_list), "categories found in the dataset") + + #Declare training array + cat_list = [] + x = [] + names = [] + y = [] + y_label = 0 + + #Using just 5 images per category + for folder_name in folder_list: + files_list = os.listdir(os.path.join(base_dir, folder_name)) + temp=[] + for file_name in files_list[:no_of_files_in_each_class]: + temp.append(len(x)) + x.append(np.asarray(Image.open(os.path.join(base_dir, folder_name, file_name)).convert('RGB').resize((img_rows, img_cols)))) + names.append(folder_name + "/" + file_name) + y.append(y_label) + y_label+=1 + cat_list.append(temp) + + cat_list = np.asarray(cat_list) + x = np.asarray(x)/255.0 + y = np.asarray(y) + print('X, Y shape',x.shape, y.shape, cat_list.shape) + + + #Training Split + x_train, y_train, cat_train, x_val, y_val, cat_test = [], [], [], [], [], [] + + train_split = math.floor((train_test_split) * no_of_files_in_each_class) + test_split = math.floor((1-train_test_split) * no_of_files_in_each_class) + + train_count = 0 + test_count = 0 + for i in range(len(x)-1): + if i % no_of_files_in_each_class == 0: + cat_train.append([]) + cat_test.append([]) + class_train_count = 1 + class_test_count = 1 + + if i % math.floor(1/train_test_split) == 0 and class_test_count < test_split: + x_val.append(x[i]) + y_val.append(y[i]) + cat_test[-1].append(test_count) + test_count += 1 + class_test_count += 1 + + elif class_train_count < train_split: + x_train.append(x[i]) + y_train.append(y[i]) + cat_train[-1].append(train_count) + train_count += 1 + class_train_count += 1 + + + x_val = np.array(x_val) + y_val = np.array(y_val) + x_train = np.array(x_train) + y_train = np.array(y_train) + cat_train = np.array(cat_train) + cat_test = np.array(cat_test) + + + print('X&Y shape of training data :',x_train.shape, 'and', + y_train.shape, cat_train.shape) + print('X&Y shape of testing data :' , x_val.shape, 'and', + y_val.shape, cat_test.shape) + + return (x_train, y_train), (x_val, y_val), cat_train + + +# the data, split between train and test sets +# (x_train, y_train), (x_test, y_test) = mnist.load_data() +# channels = 1 + +(x_train, y_train), (x_test, y_test), cat_train = createTrainingData() +channels = 3 + +if K.image_data_format() == 'channels_first': + x_train = x_train.reshape(x_train.shape[0], channels, img_rows, img_cols) + x_test = x_test.reshape(x_test.shape[0], channels, img_rows, img_cols) + input_shape = (channels, img_rows, img_cols) +else: + x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, channels) + x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, channels) + input_shape = (img_rows, img_cols, channels) + +x_train = x_train.astype('float32') +x_test = x_test.astype('float32') +x_train /= 255 +x_test /= 255 + +pdb.set_trace() + +def create_own_base_model(input_shape): + model_input = Input(shape=input_shape) + + embedding = Conv2D(32, kernel_size=(10, 10), input_shape=input_shape)(model_input) + embedding = MaxPooling2D(pool_size=(2, 2))(embedding) + embedding = Conv2D(64, kernel_size=(7, 7))(embedding) + embedding = MaxPooling2D(pool_size=(2, 2))(embedding) + embedding = Conv2D(128, kernel_size=(4, 4))(embedding) + embedding = MaxPooling2D(pool_size=(2, 2))(embedding) + embedding = Conv2D(256, kernel_size=(4, 4))(embedding) + embedding = MaxPooling2D(pool_size=(2, 2))(embedding) + embedding = Flatten()(embedding) + embedding = Dense(4096, activation='sigmoid')(embedding) + embedding = BatchNormalization()(embedding) + embedding = Activation(activation='relu')(embedding) + + return Model(model_input, embedding) + +def create_base_model(input_shape): + model_input = Input(shape=input_shape) + + embedding = Conv2D(32, kernel_size=(3, 3), input_shape=input_shape)(model_input) + embedding = BatchNormalization()(embedding) + embedding = Activation(activation='relu')(embedding) + embedding = MaxPooling2D(pool_size=(2, 2))(embedding) + embedding = Conv2D(64, kernel_size=(3, 3))(embedding) + embedding = BatchNormalization()(embedding) + embedding = Activation(activation='relu')(embedding) + embedding = MaxPooling2D(pool_size=(2, 2))(embedding) + embedding = Flatten()(embedding) + embedding = Dense(128)(embedding) + 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[1:]) + embedding_b = Input(shape=embedding_shape[1:]) + + head = Concatenate()([embedding_a, embedding_b]) + head = Dense(8)(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) + +def get_batch(x_train, y_train, x_test, y_test, cat_train, batch_size=64): + + temp_x = x_train + temp_cat_list = cat_train + start=0 + batch_x=[] + + batch_y = np.zeros(batch_size) + batch_y[int(batch_size/2):] = 1 + np.random.shuffle(batch_y) + + class_list = np.random.randint(start, len(cat_train), batch_size) + batch_x.append(np.zeros((batch_size, 100, 100, 3))) + batch_x.append(np.zeros((batch_size, 100, 100, 3))) + + for i in range(0, batch_size): + batch_x[0][i] = temp_x[np.random.choice(temp_cat_list[class_list[i]])] + #If train_y has 0 pick from the same class, else pick from any other class + if batch_y[i]==0: + r = np.random.choice(temp_cat_list[class_list[i]]) + batch_x[1][i] = temp_x[r] + + else: + temp_list = np.append(temp_cat_list[:class_list[i]].flatten(), temp_cat_list[class_list[i]+1:].flatten()) + batch_x[1][i] = temp_x[np.random.choice(temp_list)] + + return(batch_x, batch_y) + + +num_classes = 131 +epochs = 2000 + +base_model = create_base_model(input_shape) +head_model = create_head_model(base_model.output_shape) + +siamese_network = SiameseNetwork(base_model, head_model) +siamese_network.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) + +siamese_checkpoint_path = "./siamese_checkpoint" + +siamese_callbacks = [ + # EarlyStopping(monitor='val_accuracy', patience=10, verbose=0), + ModelCheckpoint(siamese_checkpoint_path, monitor='val_accuracy', save_best_only=True, verbose=0) +] + +# batch_size = 64 +# for epoch in range(1, epochs): +# batch_x, batch_y = get_batch(x_train, y_train, x_test, y_test, cat_train, train_size, batch_size) +# loss = siamese_network.train_on_batch(batch_x, batch_y) +# print('Epoch:', epoch, ', Loss:', loss) + +siamese_network.fit(x_train, y_train, + validation_data=(x_test, y_test), + batch_size=45, + epochs=epochs, + callbacks=siamese_callbacks) + +# try: +# siamese_network = keras.models.load_model(siamese_checkpoint_path) +# except Exception as e: +# print(e) +# print("!!!!!!") +# siamese_network.load_weights(siamese_checkpoint_path) + +embedding = base_model.outputs[-1] + +y_train = keras.utils.to_categorical(y_train) +y_test = keras.utils.to_categorical(y_test) + +# Add softmax layer to the pre-trained embedding network +embedding = Dense(num_classes)(embedding) +embedding = BatchNormalization()(embedding) +embedding = Activation(activation='sigmoid')(embedding) + +model = Model(base_model.inputs[0], embedding) +model.compile(loss=keras.losses.binary_crossentropy, + optimizer=keras.optimizers.Adam(), + metrics=['accuracy']) + +model_checkpoint_path = "./model_checkpoint" + +model__callbacks = [ + # EarlyStopping(monitor='val_accuracy', patience=10, verbose=0), + ModelCheckpoint(model_checkpoint_path, monitor='val_accuracy', save_best_only=True, verbose=0) +] + +# for e in range(1, epochs): +# batch_x, batch_y = get_batch(x_train, y_train, x_test, y_test, cat_train, train_size, batch_size) +# loss = model.train_on_batch(batch_x, batch_y) +# print('Epoch:', epoch, ', Loss:', loss) + +model.fit(x_train, y_train, + batch_size=128, + epochs=epochs, + callbacks=model__callbacks, + validation_data=(x_test, y_test)) +# try: +# model = keras.models.load_model(model_checkpoint_path) +# except Exception as e: +# print(e) +# print("!!!!!!") + +# model.load_weights(model_checkpoint_path) + +score = model.evaluate(x_test, y_test, verbose=0) +print('Test loss:', score[0]) +print('Test accuracy:', score[1]) diff --git a/model.png b/model.png new file mode 100644 index 0000000000000000000000000000000000000000..0257743e631e955469b6f0a8137c7bc9ce32f4fa GIT binary patch literal 44681 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 F{{aHh0Sy2E literal 0 HcmV?d00001 diff --git a/mymodel.png b/mymodel.png new file mode 100644 index 0000000000000000000000000000000000000000..200eda1297743bd9a18ea30814060c018f53fe4c GIT binary patch literal 149604 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
V5Y*&Cx11p|<`=U=m|R;x_X{(M>5F=P2ii8e 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 O;*a&Lxx^eU-}ZNsfh)TJ literal 0 HcmV?d00001 diff --git a/notes.md b/notes.md new file mode 100644 index 0000000..9585e3e --- /dev/null +++ b/notes.md @@ -0,0 +1,39 @@ +the steps taken so far, which lead to a successfull detection of an image + +- train the model defined in mnist_siamese_example, which uses the 'siamese.py' model to + create a siamese keras model. + + - in this mnist siamese example, the data collection has been updated form the mnist drawing + sample to the fruit sample. Lots of work went into setting the arrays up correctly, because the + example from towards data science did not correctly seperate the classes. He had originally used + 91 classes for teching and the rest for testing, where I now use images of every class for + teaching _and_ training. + + - The images were shrunken down to 28 x 28 so the model defined in the siamese example could be used + without adaption + + - in this example, there is two teachings going on, once he trains the siamese model (which is saved under + 'siamese_checkpoint' and then he reteaches a new model based on this one, with some additonal layers ontop + + I'm not yet sure what these do [todo] but 'I'll figure it out. + +- after you've successfully trained the model, it's now saved to 'model_checkpoint' or 'siamese_checkpoint' + +- The following steps can be used to classify two images: + Note, that it was so far only tested using images in a 'pdb' shell from the mnist_siamese_example script + +``` +import tensorflow.keras as keras +from PIL import image +model = keras.models.load_model('./siamese_checkpoint') +image1 = np.asarray(Image.open('../towards/data/fruits-360/Training/Avocado/r_254_100.jpg').convert('RGB').resize((28, 28))) / 255 / 255 +image2 = np.asarray(Image.open('../towards/data/fruits-360/Training/Avocado/r_250_100.jpg').convert('RGB').resize((28, 28))) / 255 / 255 +# note that the double division through 255 is only because the model bas taught with this double division, depends on +# the input numbers of course + +output = model.predict([np.array([image2]), np.array([image1])]) +# Note here, that the cast to np.array is nencessary - otherwise the input vector is malformed + +print(output) +``` + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e0225fb --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +keras==2.2.4 +numpy==1.16.4 +pytest==4.6.4 +pep8==1.7.1 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..1914485 --- /dev/null +++ b/setup.py @@ -0,0 +1,15 @@ +from setuptools import setup + +setup( + name='siamese', + version='0.1', + packages=[''], + url='https://github.com/aspamers/siamese', + license='MIT', + author='Abram Spamers', + author_email='aspamers@gmail.com', + install_requires=[ + 'keras', 'numpy', + ], + description='An easy to use Keras Siamese Neural Network implementation' +) diff --git a/siamese.py b/siamese.py new file mode 100644 index 0000000..9f8f9ca --- /dev/null +++ b/siamese.py @@ -0,0 +1,291 @@ +""" +Siamese neural network module. +""" + +import random, math +import numpy as np + +from tensorflow.keras.layers import Input +from tensorflow.keras.models import Model + +import pdb + + +class SiameseNetwork: + """ + A simple and lightweight siamese neural network implementation. + + The SiameseNetwork class requires the base and head model to be defined via the constructor. The class exposes + public methods that allow it to behave similarly to a regular Keras model by passing kwargs through to the + underlying keras model object where possible. This allows Keras features like callbacks and metrics to be used. + """ + def __init__(self, base_model, head_model): + """ + Construct the siamese model class with the following structure. + + ------------------------------------------------------------------- + input1 -> base_model | + --> embedding --> head_model --> binary output + input2 -> base_model | + ------------------------------------------------------------------- + + :param base_model: The embedding model. + * Input shape must be equal to that of data. + :param head_model: The discriminator model. + * Input shape must be equal to that of embedding + * Output shape must be equal to 1.. + """ + # Set essential parameters + self.base_model = base_model + self.head_model = head_model + + # Get input shape from base model + self.input_shape = self.base_model.input_shape[1:] + + # Initialize siamese model + self.siamese_model = None + self.__initialize_siamese_model() + + def compile(self, *args, **kwargs): + """ + Configures the model for training. + + Passes all arguments to the underlying Keras model compile function. + """ + self.siamese_model.compile(*args, **kwargs) + + def train_on_batch(self, *args, **kwargs): + return self.siamese_model.train_on_batch(args[0], args[1]) + + def fit(self, *args, **kwargs): + """ + Trains the model on data generated batch-by-batch using the siamese network generator function. + + Redirects arguments to the fit_generator function. + """ + x_train = args[0] + y_train = args[1] + x_test, y_test = kwargs.pop('validation_data') + batch_size = kwargs.pop('batch_size') + + train_generator = self.__pair_generator(x_train, y_train, batch_size) + train_steps = math.floor(max(len(x_train) / batch_size, 1)) + test_generator = self.__pair_generator(x_test, y_test, batch_size) + test_steps = math.floor(max(len(x_test) / batch_size, 1)) + + pdb.set_trace() + + self.siamese_model.fit(train_generator, + steps_per_epoch=train_steps, + validation_data=test_generator, + validation_steps=test_steps, **kwargs) + + def fit_generator(self, x_train, y_train, x_test, y_test, batch_size, *args, **kwargs): + """ + Trains the model on data generated batch-by-batch using the siamese network generator function. + + :param x_train: Training input data. + :param y_train: Training output data. + :param x_test: Validation input data. + :param y_test: Validation output data. + :param batch_size: Number of pairs to generate per batch. + """ + train_generator = self.__pair_generator(x_train, y_train, batch_size) + train_steps = max(len(x_train) / batch_size, 1) + test_generator = self.__pair_generator(x_test, y_test, batch_size) + test_steps = max(len(x_test) / batch_size, 1) + self.siamese_model.fit_generator(train_generator, + steps_per_epoch=train_steps, + validation_data=test_generator, + validation_steps=test_steps, + *args, **kwargs) + + + def load_weights(self, checkpoint_path): + """ + Load siamese model weights. This also affects the reference to the base and head models. + + :param checkpoint_path: Path to the checkpoint file. + """ + self.siamese_model.load_weights(checkpoint_path) + + def evaluate(self, *args, **kwargs): + """ + Evaluate the siamese network with the same generator that is used to train it. Passes arguments through to the + underlying Keras function so that callbacks etc can be used. + + Redirects arguments to the evaluate_generator function. + + :return: A tuple of scores + """ + x = args[0] + y = args[1] + batch_size = kwargs.pop('batch_size') + + generator = self.__pair_generator(x, y, batch_size) + steps = len(x) / batch_size + return self.siamese_model.evaluate_generator(generator, steps=steps, **kwargs) + + def evaluate_generator(self, x, y, batch_size, *args, **kwargs): + """ + Evaluate the siamese network with the same generator that is used to train it. Passes arguments through to the + underlying Keras function so that callbacks etc can be used. + + :param x: Input data + :param y: Class labels + :param batch_size: Number of pairs to generate per batch. + :return: A tuple of scores + """ + generator = self.__pair_generator(x, y, batch_size=batch_size) + steps = len(x) / batch_size + return self.siamese_model.evaluate_generator(generator, steps=steps, *args, **kwargs) + + def __initialize_siamese_model(self): + """ + Create the siamese model structure using the supplied base and head model. + """ + input_a = Input(shape=self.input_shape) + input_b = Input(shape=self.input_shape) + + processed_a = self.base_model(input_a) + processed_b = self.base_model(input_b) + + head = self.head_model([processed_a, processed_b]) + self.siamese_model = Model([input_a, input_b], head) + + def __create_pairs(self, x, class_indices, batch_size, num_classes): + """ + Create a numpy array of positive and negative pairs and their associated labels. + + :param x: Input data + :param class_indices: A python list of lists that contains each of the indices in the input data that belong + to each class. It is used to find and access elements in the input data that belong to a desired class. + * Example usage: + * element_index = class_indices[class][index] + * element = x[element_index] + :param batch_size: The number of pair samples to create. + :param num_classes: number of classes in the supplied input data + :return: A tuple of (Numpy array of pairs, Numpy array of labels) + """ + num_pairs = batch_size / 2 + positive_pairs, positive_labels = self.__create_positive_pairs(x, class_indices, num_pairs, num_classes) + negative_pairs, negative_labels = self.__create_negative_pairs(x, class_indices, num_pairs, num_classes) + return np.array(positive_pairs + negative_pairs), np.array(positive_labels + negative_labels) + + def __create_positive_pairs(self, x, class_indices, num_positive_pairs, num_classes): + """ + Create a list of positive pairs and labels. A positive pair is defined as two input samples of the same class. + + :param x: Input data + :param class_indices: A python list of lists that contains each of the indices in the input data that belong + to each class. It is used to find and access elements in the input data that belong to a desired class. + * Example usage: + * element_index = class_indices[class][index] + * element = x[element_index] + :param num_positive_pairs: The number of positive pair samples to create. + :param num_classes: number of classes in the supplied input data + :return: A tuple of (python list of positive pairs, python list of positive labels) + """ + positive_pairs = [] + positive_labels = [] + + for _ in range(int(num_positive_pairs)): + class_1 = random.randint(0, num_classes - 1) + num_elements = len(class_indices[class_1]) + + if num_elements == 0: + return [], [] + index_1, index_2 = self.__randint_unequal(0, num_elements - 1) + + element_index_1, element_index_2 = class_indices[class_1][index_1], class_indices[class_1][index_2] + positive_pairs.append([x[element_index_1], x[element_index_2]]) + positive_labels.append([1.0]) + return positive_pairs, positive_labels + + def __create_negative_pairs(self, x, class_indices, num_negative_pairs, num_classes): + """ + Create a list of negative pairs and labels. A negative pair is defined as two input samples of different class. + + :param x: Input data + :param class_indices: A python list of lists that contains each of the indices in the input data that belong + to each class. It is used to find and access elements in the input data that belong to a desired class. + * Example usage: + * element_index = class_indices[class][index] + * element = x[element_index] + :param num_negative_pairs: The number of negative pair samples to create. + :param num_classes: number of classes in the supplied input data + :return: A tuple of (python list of negative pairs, python list of negative labels) + """ + negative_pairs = [] + negative_labels = [] + + if num_classes == 0: + return [], [] + + for _ in range(int(num_negative_pairs)): + cls_1, cls_2 = self.__randint_unequal(0, num_classes - 1) + + try: + index_1 = random.randint(0, len(class_indices[cls_1]) - 1) + index_2 = random.randint(0, len(class_indices[cls_2]) - 1) + except Exception as e: + print(e) + pdb.set_trace() + + + element_index_1, element_index_2 = class_indices[cls_1][index_1], class_indices[cls_2][index_2] + negative_pairs.append([x[element_index_1], x[element_index_2]]) + negative_labels.append([0.0]) + return negative_pairs, negative_labels + + def __pair_generator(self, x, y, batch_size): + """ + Creates a python generator that produces pairs from the original input data. + :param x: Input data + :param y: Integer class labels + :param batch_size: The number of pair samples to create per batch. + :return: + """ + class_indices, num_classes = self.__get_class_indices(y) + while True: + pairs, labels = self.__create_pairs(x, class_indices, batch_size, num_classes) + + # The siamese network expects two inputs and one output. Split the pairs into a list of inputs. + yield [pairs[:, 0], pairs[:, 1]], labels + + def __get_class_indices(self, y): + """ + Create a python list of lists that contains each of the indices in the input data that belong + to each class. It is used to find and access elements in the input data that belong to a desired class. + * Example usage: + * element_index = class_indices[class][index] + * element = x[element_index] + :param y: Integer class labels + :return: Python list of lists + """ + num_classes = np.max(y) + 1 + return [np.where(y == i)[0] for i in range(num_classes)], num_classes + + @staticmethod + def __randint_unequal(lower, upper): + """ + Get two random integers that are not equal. + + Note: In some cases (such as there being only one sample of a class) there may be an endless loop here. This + will only happen on fairly exotic datasets though. May have to address in future. + :param lower: Lower limit inclusive of the random integer. + :param upper: Upper limit inclusive of the random integer. Need to use -1 for random indices. + :return: Tuple of (integer, integer) + """ + + int_1 = random.randint(lower, upper) + int_2 = random.randint(lower, upper) + + tries = 0 + while int_1 == int_2: + tries += 1 + if tries > 10: + break + int_1 = random.randint(lower, upper) + int_2 = random.randint(lower, upper) + return int_1, int_2 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_siamese.py b/tests/test_siamese.py new file mode 100644 index 0000000..d569dcf --- /dev/null +++ b/tests/test_siamese.py @@ -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)