Package: nicenet
Feed Forward Neural Networks using NumPyThis library is a modification of my previous one.Click Hereto check my previous library.Installation$[sudo]pip3installnicenetDevelopment Installation$gitclonehttps://github.com/Subhash3/Neural_Net_Using_NumPy.gitUsage>>>fromnicenetimportNeuralNetworkCreating a Neural Networkinputs=2outputs=1network=NeuralNetwork(inputs,outputs,cost="mse")# Add 2 hidden layers with 16 neurons each and activation function 'tanh'network.add_layer(16,activation_function="tanh")network.add_layer(16,activation_function="tanh")# Finish the neural network by adding the output layer with sigmoid activation function.network.compile(activation_function="sigmoid")Building a datasetThe package contains a Dataset class to create a dataset.>>>fromnicenetimportDatasetMake sure you have inputs and target values in seperate files in csv format.input_file="inputs.csv"target_file="targets.csv"# Create a dataset object with the same inputs and outputs defined for the network.dataset_handler=Dataset(inputs,outputs)dataset_handler.make_dataset(input_file,target_file)data,size=dataset_handler.get_raw_data()If you want to manually make a dataset, follow these rules:Dataset must be a list of data samples.A data sample is a tuple containing inputs and target values.Input and target values are column vector of size (inputs x 1) and (outputs x 1) respectively.For eg, a typical XOR data set looks something like :>>>XOR_data=[(np.array([[0],[0]]),np.array([[0]])),(np.array([[0],[1]]),np.array([[1]])),(np.array([[1],[0]]),np.array([[1]])),(np.array([[1],[1]]),np.array([[0]]))]>>>size=4Training The networkThe library provides aTrainfunction which accepts the dataset, dataset size, and two optional parameters epochs, and logging.defTrain(self,dataset:T_Dataset,size,epochs=100,logging=False,epoch_logging=True,prediction_evaulator=None):........For Eg: If you want to train your network for 1000 epochs.>>>network.Train(data,size,epochs=1000)Notice that I didn't change the value ofloggingas I want the output to be printed for each epoch.DebuggingPlot a nice epoch vs error graph>>>network.epoch_vs_error()Know how well the model performed.>>>network.evaluate()To take a look at all the layers' info>>>network.display()Sometimes, learning rate might have to be altered for better convergence.>>>network.set_learning_rate(0.1)Exporting ModelYou can export a trained model to a json file which can be loaded and used for predictions in the future.filename="model.json"network.export_model(filename)Load ModelTo load a model from an exported model (json) file.
load_model is a static function, so you must not call this on a NeuralNetwork object!.filename="model.json"network=NeuralNetwork.load_model(filename)Todo- [x] Generalize the gradient descent algorithm
    - [x] Generalise the loss function => Write a separate class for it!
- [x] Implement Cross Entropy Loss
- [ ] Data scaling
    - [x] Min Max scaler
    - [ ] Data Standardization
- [x] Change the datasample type to a tuple instead of a list.
- [x] Show Progress bar if epoch_logging is False
- [x] Use a function as a parameter to Train method to compare predictions and actual targets.
- [x] convert all camel-cased vars to snake-case.

- [ ] API docs
    - [x] Add doc strings to all functions.
    - [x] Make the class/function declarations' docs collapsable.
    - [ ] Merge API md files and embed them in Readme.
    - [ ] Create a section, API, in README to provide documentation for all prototypes.

- [ ] Implement Batch Training
- [ ] Write a separate class for Scalers as the scaling methods increase.
- [ ] Linear and Relu activation functions
- [ ] Ability to perform regression
- [ ] Separate out outputlayer from other layers. => Create a separate class for output layer which inherits Layer.


- [ ] Convolution Nets
- [ ] Recurrent Nets