import neuralfit as nf import matplotlib.pyplot as plt import numpy as np
The next step is to define the dataset, in this case the sine wave. We want to fit \sin(x) on the domain x\in[0,2\pi], exactly one period. For this example we will linearly sample 1000 datapoints in the domain, but feel free to change the sampling method or the number of points.
x = np.linspace(0, 2*np.pi, 1000).reshape(-1,1) y = np.sin(x)
Now we can create the NeuralFit model. We specify the inputs and outputs, and initialize it with 2 hidden neurons (4 minus the input and output) in order to avoid initial local minima. Afterwards the model can be compiled, specifying the Alpha optimizer and the mean-squared error loss function. Next to the loss, we would also like to model the size of the best-performing network during training so we specify the size monitor.
model = nf.Model(inputs=1, outputs=1, size=4) model.compile(optimizer='alpha', loss='mse', monitors=['size'])
Now that the model and dataset have been set up, we can simply call
model.evolve to train the model! We specify 1000 epochs, which should be (on average) plenty of time to get good results.
model.evolve(x, y, epochs=1000)
Note that neuro-evolution is typically much more sensitive to the initial weights compared to standard (backprop) optimizers, so evolution might not always converge! But once you have a good run (
mse<0.01) you can ask the model for predictions and visualize them using
# Get model predictions y_hat = model.predict(x) # Plot results plt.plot(x, y, label='True', color='k', linestyle='--') plt.plot(x, y_hat, label='Predicted',color='#52C560', linewidth=2) plt.show()
If all went well, you should get a plot similar to the one below! If you want an extra challenge, try varying the frequency of the sinusoid to see how it affects the performance of the model.