using System.Collections.Generic;
public class NeuralNetwork
public void Init(List<List<float>> inputs, List<List<float>> outputs, int extraCount, int extraSize) {
List<List<List<float>>> weights = new List<List<List<float>>>();
int totalCount = extraCount + 1;
List<int> totals = getCount(inputs[0], outputs[0], extraCount, extraSize);
for(int a = 0; a < totalCount; a++) {
weights.Add(new List<List<float>>());
for(int b = 0; b < totals[a]; b++) {
weights[a].Add(new List<float>());
for(int c = 0; c < totals[a + 1]; c++) {
weights[a][b].Add(RandomValue(0, 10000, 10000f));
List<float> outputsTemp = new List<float>();
for(int q = 0; q < inputs.Count(); q++) {
outputsTemp = InitOne(inputs[q], outputs[q], weights);
foreach(float i in outputsTemp) Console.Write(i + " | ");
for(int j = 0; j < trainTimes; j++) {
weights = BackProp(inputs[q], outputsTemp, outputs[q], weights);
outputsTemp = InitOne(inputs[q], outputs[q], weights);
if(outputsTemp == outputs[q]) {
foreach(float i2 in outputsTemp) Console.Write(i2 + " | ");
for(int u9 = 0; u9 < inputs.Count(); u9++) {
outputsTemp = InitOne(inputs[u9], outputs[u9], weights);
foreach(float i3 in outputsTemp) Console.Write(i3 + " | ");
public List<List<List<float>>> BackProp(List<float> inputs, List<float> outputsGot, List<float> outputsExpected, List<List<List<float>>> weights) {
for(int a = 0; a < 1; a++) {
for(int b = 0; b < weights[weights.Count() - (a + 1)].Count(); b++) {
diffrence = outputsGot[b] - outputsExpected[b];
for(int c = 0; c < weights[weights.Count() - (a + 1)][b].Count(); c++) {
weights[weights.Count() - (a + 1)][b][c] -= diffrence / weights[weights.Count() - (a + 1)][b].Count();
weights[weights.Count() - (a + 1)][b][c] = (float)Math.Round(weights[weights.Count() - (a + 1)][b][c] * 1000) / 1000f;
outputsGot = InitOne(inputs, outputsExpected, weights);
public List<float> InitOne(List<float> inputs, List<float> outputs, List<List<List<float>>> weights) {
List<List<float>> inputsTemp = new List<List<float>>();
for(int a = 0; a < weights.Count(); a++) {
List<float> resultTemp = new List<float>();
inputsTemp.Add(new List<float>());
for(int b = 0; b < weights[a].Count(); b++) {
for(int c = 0; c < weights[a][b].Count(); c++) {
temoValue += inputsTemp[a][b] * weights[a][b][c];
resultTemp.Add(temoValue);
inputsTemp[a + 1] = resultTemp;
return inputsTemp[inputsTemp.Count() - 1];
public List<int> getCount(List<float> inputs, List<float> outputs, int eCount, int eSize) {
List<int> l = new List<int>();
for(int a = 0; a < eCount; a++) {
public float RandomValue(int smallest, int highest, float by) {
return r.Next(smallest, highest + 1) / by;
public class Program : NeuralNetwork
List<List<float>> inputs = new List<List<float>>();
List<List<float>> outputs = new List<List<float>>();
inputs.Add(new List<float>());
outputs.Add(new List<float>());
inputs.Add(new List<float>());
outputs.Add(new List<float>());
inputs.Add(new List<float>());
outputs.Add(new List<float>());
Init(inputs, outputs, 3, 3);