Package: cvnn
Complex-Valued Neural Networks (CVNN)Done by @NEGU93 - J. Agustin BarrachinaUsing this library, the only difference with a Tensorflow code is that you should usecvnn.layersmodule instead oftf.keras.layers.This is a library that usesTensorflowas a back-end to do complex-valued neural networks as CVNNs are barely supported by Tensorflow and not even supported yet forpytorch(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 typesinstead of real value vectors that are interpreted as real and imaginary part.Update:Sincev1.12(28 June 2022), Complex32 and Complex Convolutions in PyTorch.Sincev0.2(25 Jan 2021)complexPyTorchuses complex64 dtype.Sincev1.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.DocumentationPleaseRead the DocsInstalation Guide:UsingAnacondaconda install -c negu93 cvnnUsingPIPVanilla Versioninstalls all the minimum dependencies.pip install cvnnPlot capabilitieshas the posibility to plot the results obtained with the training with several plot libraries.pip install cvnn[plotter]Full Versioninstalls full version with all featurespip install cvnn[full]Short exampleFrom "outside" everything is the same as when using Tensorflow.importnumpyasnpimporttensorflowastf# 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 usermodel=get_model()# Get your model# Compile as any TensorFlow modelmodel.compile(optimizer='adam',metrics=['accuracy'],loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True))model.summary()# Train and evaluatehistory=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)The main difference is that you will be usingcvnnlayers instead of Tensorflow layers.
There are some options on how to do it as shown here:Sequential APIimportcvnn.layersascomplex_layersdefget_model():model=tf.keras.models.Sequential()model.add(complex_layers.ComplexInput(input_shape=(32,32,3)))# Always use ComplexInput at the startmodel.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 numberreturnmodelFunctional APIimportcvnn.layersascomplex_layersdefget_model():inputs=complex_layers.complex_input(shape=(128,128,3))c0=complex_layers.ComplexConv2D(32,activation='cart_relu',kernel_size=3)(inputs)c1=complex_layers.ComplexConv2D(32,activation='cart_relu',kernel_size=3)(c0)c2=complex_layers.ComplexMaxPooling2D(pool_size=(2,2),strides=(2,2),padding='valid')(c1)t01=complex_layers.ComplexConv2DTranspose(5,kernel_size=2,strides=(2,2),activation='cart_relu')(c2)concat01=tf.keras.layers.concatenate([t01,c1],axis=-1)c3=complex_layers.ComplexConv2D(4,activation='cart_relu',kernel_size=3)(concat01)out=complex_layers.ComplexConv2D(4,activation='cart_relu',kernel_size=3)(c3)returntf.keras.Model(inputs,out)About me & MotivationMy personal websiteI am a PhD student fromEcole CentraleSupelecwith a scholarship fromONERAand theDGAI 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.Cite MeAlway prefer theZenodocitation.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}}IssuesFor any issues please report them inhereThis library is tested usingpytest.