public void I_should_be_able_to_save_and_load_a_pretrained_neural_network( int inputCount, int hiddenCount, int outputCount) { // Arrange var originalNetwork = new TinyNeuralNetwork(inputCount, hiddenCount, outputCount); // Act originalNetwork.Save(_filePath); var loadedNetwork = TinyNeuralNetwork.Load(_filePath); // Assert loadedNetwork.Should().BeEquivalentTo(originalNetwork); }
public void Given_a_xor_truth_table_neural_network_should_learn_the_xor_operation() { // Arrange var input = new float[][] { new [] { 1f, 1f }, new [] { 1f, 0f }, new [] { 0f, 1f }, new [] { 0f, 0f }, }; var expected = new float[][] { new [] { 0f }, new [] { 1f }, new [] { 1f }, new [] { 0f }, }; var network = new TinyNeuralNetwork(2, 4, 1); var learningRate = 1f; for (int i = 0; i < 1000; i++) { for (int j = 0; j < input.Length; j++) { network.Train(input[j], expected[j], learningRate); } Shuffle(input, expected); learningRate *= .99f; } // Act var actualCategorical = input.Select(network.Predict); // Assert var actualNumeric = actualCategorical.Select(x => Math.Round(x[0])); var expectedNumeric = expected.Select(x => x[0]); actualNumeric.Should().BeEquivalentTo(expectedNumeric); }