Что не так с моим NN-кодом?
Привет
Я новичок в программировании
Я хочу, чтобы реализовать простой игры madaline для XOR-функции в нейронной сети
Я использовал этот алгоритм(см. ссылку ниже)
но это не дает мне правильного ответа
он должен дать правильный ответ через 4 эпохи
что не так с моим кодом?
спасибо.../
это ссылка:
алгоритм
.....
Что я уже пробовал:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace xxxxxxx { class Program { static void Main(string[] args) { int[,] x = new int[,] { { 1, 1 }, { 1, -1 }, { -1, 1 } }; int[] t = new int[] { -1, 1, 1 }; double[,] w = new double[,] { { 0.05, 0.1 }, { 0.2, 0.2 }, { 0.5, 0.5 } }; double[] b = new double[] { 0.3, 0.15, 0.5 }; bool ep = true; int x1; int x2; double zin1; double zin2; int z1; int z2; double yin; int y; while (ep) { ep = false; for (int j = 0; j < 3; j = j + 1) { x1 = x[j, 0]; x2 = x[j, 1]; zin1 = b[0] + (x1 * w[0, 0]) + (x2 * w[1, 0]); zin2 = b[1] + (x1 * w[0, 1]) + (x2 * w[1, 1]); z1 = f(zin1); z2 = f(zin2); yin = b[2] + z1 * w[2, 0] + z2 * w[2, 1]; y = f(yin); if (y != t[j]) { ep = true; if (t[j] == 1) { if (Math.Abs(zin1) < Math.Abs(zin2)) { b[0] = b[0] + 0.5 * (1 - zin1); w[0, 0] = w[0, 0] + 0.5 * (1 - zin1) * x1; w[1, 0] = w[1, 0] + 0.5 * (1 - zin1) * x2; } else { b[1] = b[1] + 0.5 * (1 - zin2); w[0, 1] = w[0, 1] + 0.5 * (1 - zin2) * x1; w[1, 1] = w[1, 1] + 0.5 * (1 - zin2) * x2; } } else if(t[j] == -1) { if (zin1 > 0 && zin2 > 0) { b[0] = b[0] + 0.5 * (-1 - zin1); w[0, 0] = w[0, 0] + 0.5 * (-1 - zin1) * x1; w[1, 0] = w[1, 0] + 0.5 * (-1 - zin1) * x2; b[1] = b[1] + 0.5 * (-1 - zin2); w[0, 1] = w[0, 1] + 0.5 * (-1 - zin2) * x1; w[1, 1] = w[1, 1] + 0.5 * (-1 - zin2) * x2; } else if (zin1 > 0 && zin2 <= 0) { b[0] = b[0] + 0.5 * (-1 - zin1); w[0, 0] = w[0, 0] + 0.5 * (-1 - zin1) * x1; w[1, 0] = w[1, 0] + 0.5 * (-1 - zin1) * x2; } else if (zin1 < 0 && zin2 > 0) { b[1] = b[1] + 0.5 * (-1 - zin2); w[0, 1] = w[0, 1] + 0.5 * (-1 - zin2) * x1; w[1, 1] = w[1, 1] + 0.5 * (-1 - zin2) * x2; } } } } } Console.WriteLine("b1:{0} , b2:{1} , b3:{2} \n w00:{3} , w10:{4} , w01:{5}, w11:{6}", b[0], b[1], b[2], w[0, 0], w[1, 0], w[0, 1], w[1, 1]); int[,] test = new int[,] { { -1, -1 } }; x1 = test[0, 0]; x2 = test[0, 1]; zin1 = b[0] + (x1 * w[0, 0]) + (x2 * w[1, 0]); zin2 = b[1] + (x1 * w[0, 1]) + (x2 * w[1, 1]); z1 = f(zin1); z2 = f(zin2); yin = b[2] + z1 * w[2, 0] + z2 * w[2, 1]; y = f(yin); if (y == 1) { Console.WriteLine("1"); } else { Console.WriteLine("-1"); } Console.ReadLine(); } private static int f(double zin) { return (zin >= 0) ? 1 : -1; } } }
BillWoodruff
Установите точки останова, один шаг через код, наблюдая, что происходит и что отличается от ваших ожиданий, и вам нужно понять, что делает алгоритм в dertail.