Keras.NET is a high-level neural networks API, written in C# with Python Binding and capable of running on top of TensorFlow, CNTK, or Theano. It was developed with a focus on enabling fast experimentation. Being able to go from idea to result with the least possible delay is key to doing good research.
Use Keras if you need a deep learning library that:
Allows for easy and fast prototyping (through user friendliness, modularity, and extensibility). Supports both convolutional networks and recurrent networks, as well as combinations of the two. Runs seamlessly on CPU and GPU.
- Python 2.7 - 3.7, Link: https://www.python.org/downloads/
- Install keras, numpy and one of the backend (Tensorflow/CNTK/Theano). Please see on how to configure: https://keras.io/backend/
Install from nuget: https://www.nuget.org/packages/Keras.NET
Install-Package Keras.NET
dotnet add package Keras.NET
//Load train dataNDarrayx=np.array(newfloat[,]{{0,0},{0,1},{1,0},{1,1}});NDarrayy=np.array(newfloat[]{0,1,1,0});//Build sequential modelvarmodel=newSequential();model.Add(newDense(32,activation:"relu",input_shape:newShape(2)));model.Add(newDense(64,activation:"relu"));model.Add(newDense(1,activation:"sigmoid"));//Compile and trainmodel.Compile(optimizer:"sgd",loss:"binary_crossentropy",metrics:newstring[]{"accuracy"});model.Fit(x,y,batch_size:2,epochs:1000,verbose:1);//Save model and weightsstringjson=model.ToJson();File.WriteAllText("model.json",json);model.SaveWeight("model.h5");//Load model and weightvarloaded_model=Sequential.ModelFromJson(File.ReadAllText("model.json"));loaded_model.LoadWeight("model.h5");Output:
Python example taken from: https://keras.io/examples/mnist_cnn/
intbatch_size=128;intnum_classes=10;intepochs=12;// input image dimensionsintimg_rows=28,img_cols=28;Shapeinput_shape=null;// the data, split between train and test setsvar((x_train,y_train),(x_test,y_test))=MNIST.LoadData();if(Backend.ImageDataFormat()=="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(np.float32);x_test=x_test.astype(np.float32);x_train/=255;x_test/=255;Console.WriteLine($"x_train shape: {x_train.shape}");Console.WriteLine($"{x_train.shape[0]} train samples");Console.WriteLine($"{x_test.shape[0]} test samples");// convert class vectors to binary class matricesy_train=Util.ToCategorical(y_train,num_classes);y_test=Util.ToCategorical(y_test,num_classes);// Build CNN modelvarmodel=newSequential();model.Add(newConv2D(32,kernel_size:(3,3).ToTuple(),activation:"relu",input_shape:input_shape));model.Add(newConv2D(64,(3,3).ToTuple(),activation:"relu"));model.Add(newMaxPooling2D(pool_size:(2,2).ToTuple()));model.Add(newDropout(0.25));model.Add(newFlatten());model.Add(newDense(128,activation:"relu"));model.Add(newDropout(0.5));model.Add(newDense(num_classes,activation:"softmax"));model.Compile(loss:"categorical_crossentropy",optimizer:newAdadelta(),metrics:newstring[]{"accuracy"});model.Fit(x_train,y_train,batch_size:batch_size,epochs:epochs,verbose:1,validation_data:newNDarray[]{x_test,y_test});varscore=model.Evaluate(x_test,y_test,verbose:0);Console.WriteLine($"Test loss: {score[0]}");Console.WriteLine($"Test accuracy: {score[1]}");Output
Reached 98% accuracy within 3 epoches.
