static int k; //кол-во нейронов в скрытом слое #endregion Fields #region Constructors public Net(int q, double n) { ///создаем сеть k = q; net = new Neiron[k]; int s = 0; ///создаем тип-т.е.считать for (int i = 0; i < k; i++) { if (s < 4) { X = new double[s + 1]; s++; } else { s = 0; } X = Neiron.Norma(X); ///////пока ничего не поняла double[] qw = new double[window]; for (int j = 0; j < window; j++) { qw[j] = X[j]; } net[i] = new Neiron(qw, k); } }
/// <summary> /// Создание нейронов /// </summary> public void CreateNeiron() { massNeiron = new Neiron[amountNeironInLayer.Length][]; massNeiron[amountLayer - 1] = new NeironInLastLayer[amountNeironInLayer[amountLayer - 1]]; for (int i = 0; i < amountLayer; i++) { massNeiron[i] = new Neiron[amountNeironInLayer[i]]; } for (int i = 0; i < amountNeironInLayer[amountLayer - 1]; i++) //последний слой { massNeiron[amountLayer - 1][i] = new NeironInLastLayer(amountNeironInLayer[amountLayer - 2]); } for (int i = 0; i < amountNeironInLayer[0]; i++) //первый слой { massNeiron[0][i] = new NeironInFirstLayer(massNeiron[1], i); } for (int numberLayer = 1; numberLayer < amountLayer - 1; numberLayer++) //скрытые слои { for (int i = 0; i < amountNeironInLayer[numberLayer]; i++) { massNeiron[numberLayer][i] = new Neiron(massNeiron[numberLayer + 1], amountNeironInLayer[numberLayer - 1], i); } } }
//Этот метод заносит в память нейрона с именем trainingName // новый вариант образа data public void SetTraining(string trainingName, int[,] data, Text textPanel) { Neiron neiron = neironArray.Find(v => v.obj_name.Equals(trainingName)); if (neiron == null) // если нейрона с таким именем не существует, создадим новыи и добавим { // его в массив нейронов neiron = new Neiron(); neiron.Clear(trainingName, neironInArrayWidth, neironInArrayHeight); neironArray.Add(neiron); } int countTrainig = neiron.Training(data); // обучим нейрон новому образу textPanel.text += ". Вариантов образа в памяти: " + countTrainig.ToString(); }
// сравниваем погрешность с эпсилон public bool Sravn(Neiron c1, double[] c2) { bool flag = true; double buf = 0, max = 0; for (int i = 0; i < 9; i++) { buf = Math.Abs(c1[i] - c2[i]); if ((buf) >= eps) { flag = false; break; } } if (flag) { max = 0; for (int i = 0; i < 9; i++) { buf = Math.Abs(c1[i] - c2[i]); if (buf > max) { max = buf; } } /////////поставить лейбл form.label18.Text = max.ToString(); } return flag; }
///что делать с выходным значением??type[] public void AlgorithmW(double[][] a, Neiron w0, double nu2, double y, int window) { Random rand = new Random(); double[,] temp = new double[k + 1, k]; // хранит частные производные int t = 0; int i_av = 0; double buff = 0; do { double[] x = a[i_av]; x = Neiron.Norma(x); i_av++; //определение частных производных for (int q = 0; q < 4; q++) { ///////вместо x.type должен быть выходной вектор temp[0, q] = Neiron.F(net, w0, x, k, q,window) - x.type[q]; temp[0, q] = Neiron.F(net, w0, x, k, q, window) - y; } for (int i = 0; i < k; i++) { for (int q = 0; q < 4; q++) { temp[i + 1, q] = (Neiron.F(net, w0, x, k, q, window) - x.type[q]) * (Neiron.Fi(x, net[i], window)); } } //коррекция весов for (int q = 0; q < k; q++) { w0.setW(q, w0.getW(q) - nu2 * temp[0, q]); } for (int i = 0; i < k; i++) { for (int q = 0; q < k; q++) { net[i].setW(q, net[i].getW(q) - nu2 * temp[i + 1, q]); } } t++; buff = Neiron.F(net, w0, x, k, 0, window) - x.type[0]; for (int q = 0; q < 4; q++) { if ((Neiron.F(net, w0, x, k, q, window) - x.type[q]) > buff) { buff = Neiron.F(net, w0, x, k, q, window) - x.type[q]; } } double h = buff * buff / 2; //лейбл!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! form.label19.Text = h.ToString(); } while (t < window * k && ((buff * buff / 2) > eps)); }