Хочу спросить, почему класс perceptron после обучения функцией teach() выдает неверные ответы, причем все время? Вот весь код: Code: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace neuron { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { perceptron p = new perceptron(64); int[] v1 = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1}; p.teach(v1, 1); int[] v2 = {0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1}; p.teach(v2, 1); int[] v3 = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; p.teach(v3, 1); int[] v4 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1}; p.teach(v4, 1); int[] v5 = {0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}; p.teach(v5, 1); int[] v6 = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1}; p.teach(v6, 1); int[] d1 = { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; p.teach(d1, 0); int[] d2 = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}; p.teach(d2, 0); int[] d3 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; p.teach(d3, 0); int[] d4 = { 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}; p.teach(d4, 0); int[] d5 = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1}; p.teach(d5, 0); int[] d6 = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}; p.teach(d6, 0); int[] a = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; MessageBox.Show(p.ask(a).ToString()); } } public class perceptron { int[] W; int size; int porog; public perceptron(int n) { size = n; porog = 100; init_weight(); } public int ask(int[] vector) { int sum = 0; for (int i = 0; i < vector.Length; i++) { sum += vector[i] * W[i]; } if (sum > porog) { return 1; } else { return 0; } } public void init_weight() { this.W = new int[size]; for(int i=0;i<size;i++) { this.W[i] = new Random().Next(0, 10); } } public void teach(int[] vector, int d) { if (d != this.ask(vector)) { for (int i = 0; i < size; i++) { W[i] = d * vector[i]; } } } } }
PaRaBe1LuM, не в коем случае) просто хочу найти ошибку и попрактиковаться в этом деле, а вообще интересно все это)
По коду замечание: если известно кол-во элементов сети почему бы не определить сразу размер. А вообще python как раз и предназначен для работы с сетями. И вообще ты понимаешь что такое обучение? (кратко)Это когда есть эталон и твоя сеть, вот ты обучаешь свою сеть чтобы она стремилась к эталону, причем цикл обучения может продолжаться очень много раз(в зависимости от размера сети)... .
чувак если ты говоришь это, значит ты никогда не работал с нейронными сетями в python там все делается элемантарно=)
ох, простите, но что это за анусай написан вместо кода ? Я чета там алгоритма обучения, да и вообще ничего связанного с НС вообще не увидел кроме название классов Ты читал что такое персептрон ? а многослойный ? а методы его обучения ? например алгоритм обратного распространения ошибки ? А то как нужно обучать НС, то как это делать правильно и как делать не стоит ? О том когда стоит остановиться в обучении и о том каким должен быть набор обучающих данных ? прочитай хотябы десяток статей на этот счет. Потом бери FANN там есть обучающие примеры, посмотри как они сделаны. И юзай лучшее ее нежели свою самоделку. Но опять таки без теоретических основ это будет как говном об стену.
ТС слишком большой разброс 0 и 1 в обучаемых примерах, чтобы эта НС работала, надо максимально больше примеров, которая близка к эталону, тогда сеть более менее будет работать. Ты бы к примеру бы тоже растерялся куда двигаться, если бы оказался к примеру в 10 - мерном простанстве.