Done by @NEGU93 - J. Agustin Barrachina
Using this library, the only difference with a Tensorflow code is that you should use cvnn.layers
module instead of tf.keras.layers
.
This is a library that uses Tensorflow as a back-end to do complex-valued neural networks as CVNNs are barely supported by Tensorflow and not even supported yet for pytorch (reason why I decided to use Tensorflow for this library). To the authors knowledge, this is the first library that actually works with complex data types instead of real value vectors that are interpreted as real and imaginary part.
Update:
- Since v1.6 (28 July 2020), pytorch now supports complex vectors and complex gradient as BETA. But still have the same issues that Tensorflow has, so no reason to migrate yet.
- Since v0.2 (25 Jan 2021) complexPyTorch uses complex64 dtype.
Please Read the Docs
Using Anaconda
conda install -c negu93 cvnn
Using PIP
Vanilla Version installs all the minimum dependencies.
pip install cvnn
Plot capabilities has the posibility to plot the results obtained with the training with several plot libraries.
pip install cvnn[plotter]
Full Version installs full version with all features
pip install cvnn[full]
import numpy as np
import cvnn.layers as complex_layers
import tensorflow as tf
# Assume you already have complex data... example numpy arrays of dtype np.complex64
(train_images, train_labels), (test_images, test_labels) = get_dataset() # to be done by each user
# Create your model
model = tf.keras.models.Sequential()
model.add(complex_layers.ComplexInput(input_shape=(32, 32, 3))) # Always use ComplexInput at the start
model.add(complex_layers.ComplexConv2D(32, (3, 3), activation='cart_relu'))
model.add(complex_layers.ComplexAvgPooling2D((2, 2)))
model.add(complex_layers.ComplexConv2D(64, (3, 3), activation='cart_relu'))
model.add(complex_layers.ComplexMaxPooling2D((2, 2)))
model.add(complex_layers.ComplexConv2D(64, (3, 3), activation='cart_relu'))
model.add(complex_layers.ComplexFlatten())
model.add(complex_layers.ComplexDense(64, activation='cart_relu'))
model.add(complex_layers.ComplexDense(10, activation='convert_to_real_with_abs'))
# An activation that casts to real must be used at the last layer.
# The loss function cannot minimize a complex number
# Compile it
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
model.summary()
# Train and evaluate
history = model.fit(train_images, train_labels, epochs=epochs, validation_data=(test_images, test_labels))
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
I am a PhD student from Ecole CentraleSupelec with a scholarship from ONERA and the DGA
I am basically working with Complex-Valued Neural Networks for my PhD topic. In the need of making my coding more dynamic I build a library not to have to repeat the same code over and over for little changes and accelerate therefore my coding.
Alway prefer the Zenodo citation.
Next you have a model but beware to change the version and date accordingly.
@software{j_agustin_barrachina_2021_4452131,
author = {J Agustin Barrachina},
title = {Complex-Valued Neural Networks (CVNN)},
month = jan,
year = 2021,
publisher = {Zenodo},
version = {v1.0.3},
doi = {10.5281/zenodo.4452131},
url = {https://doi.org/10.5281/zenodo.4452131}
}