Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Нейронная сеть. Обучение с учителем

Доброго времени суток форумчане.
Появилась необходимость написать нейронную сеть, которая обучается методом обратного распространения ошибки.
Но возникли определенные проблемы: сеть просто не хочет обучаться. На выходе сети должны выдаваться либо 0, либо 1 (то есть если выход сети будет больше 0.5, то 1, меньше - 0). Но на выходе получаются значения практически одинаковые и для 0, и для 1. Не могу понять в чем дело и почему так происходит.
Ниже представлены исходный код и файл с обучающими выборками, по типу [0.304, 0.930, 0.402, 0.878], [1.0], где первые 4 значения это входные значения, а последнее, которое должно получится.
Надеюсь на вашу помощь, так как не могу уже разобраться с этим примерно неделю. Спасибо большое заранее

Исходный код:
Кликните здесь для просмотра всего текста
Код Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
import math as m
import random as r
 
MAX_INP = 4
MAX_HID = 2
MAX_OUT = 1
LEARNING_RATE = 0.01
E = 0.0
Emin = 1.5
 
 
inpL = []
hidL = []
outL = []
 
Inputs = []
Outputs = []
 
f = open('data.txt', 'r')
 
for line in f:
    Inputs.append(line)
 
f.close()
 
for i in range(len(Inputs)):
    Inputs[i] = float(Inputs[i].split())
    Outputs.append(float(Inputs[i][4]))
 
def Shuffle(Inputs, Outputs):
    Outputs.clear()
    r.shuffle(Inputs)
    for i in range(len(Inputs)):
        Outputs.append(float(Inputs[i][4]))
 
def Sigmoid(x, deriv = False):
    if (deriv == True):
        return x * (1 - x)
    else:
        return 1 / (1 + m.exp(-x))
 
class Neuron:
    def __init__(self, countW):
        self.weights = []
        self.out = 0.0
        self.error = 0.0
        self.threshold = 0.0
        for i in range(countW):
            self.weights.append(r.uniform(-.05, .05))
            self.threshold = r.uniform(0.0 , 1.0)
        print(self.weights)
        print('Neuron created')
 
def RunNet(): 
    for i in range(MAX_INP):
        inpL.append(Neuron(0))
 
    for i in range(MAX_HID):
        hidL.append(Neuron(MAX_INP))
 
    for i in range(MAX_OUT):
        outL.append(Neuron(MAX_HID))
 
def CalcErrorsAndUpdateWeights(Output):
    global LEARNING_RATE
    
    for i in range(MAX_OUT):
        outL[i].error = Output * Sigmoid(outL[i].out, True)
 
    for i in range(MAX_HID):
        total = 0.0
        for j in range(MAX_OUT):
            total += outL[j].error * outL[j].weights[i]
        hidL[i].error = total * Sigmoid(hidL[i].out, True)
 
    for i in range(MAX_INP):
        total = 0.0
        for j in range(MAX_HID):
            total += hidL[j].error * hidL[j].weights[i]
        inpL[i].error = total * Sigmoid(inpL[i].out, True)
 
 
    #Update weights
 
    for i in range(MAX_INP):
        inpL[i].threshold -= -1 * LEARNING_RATE * inpL[i].error
 
    for j in range(MAX_OUT):
        for i in range(MAX_HID):
            outL[j].weights[i] += -1 * LEARNING_RATE * outL[j].error * hidL[i].out
            #outL[j].threshold -=  LEARNING_RATE * outL[j].error
 
    for j in range(MAX_HID):
        for i in range(MAX_INP):
            hidL[j].weights[i] += -1 * LEARNING_RATE * hidL[j].error * inpL[i].out
            #hidL[j].threshold -=  LEARNING_RATE * hidL[j].error
 
 
def TrainNet(Inputs, Output):
    global E
    global LEARNING_RATE
    Error = 0.0
    
    print('\nInput ', Inputs, '\nOutputs ', Output)
    
    for i in range(MAX_INP):
        inpL[i].out = Sigmoid(float(Inputs[i])) # - inpL[i].threshold
        print(i, ' Input neuron is out ', inpL[i].out)
 
    for i in range(MAX_HID):
        total = 0.0
        for j in range(MAX_INP):
            total += hidL[i].weights[j] * inpL[j].out
        print(i, 'Hidden neuron is ', hidL[i].weights, 'weights')
        hidL[i].out = Sigmoid(total) # - hidL[i].threshold
        print(i, 'Hidden neuron is out ', hidL[i].out)
        
    for i in range(MAX_OUT):
        total = 0.0
        for j in range(MAX_HID):
            total += outL[i].weights[j] * hidL[j].out
        print(i, 'Out neuron is ', outL[i].weights, 'weights')
        outL[i].out = Sigmoid(total) # - outL[i].threshold
        print(i, 'Out neuron is out ', outL[i].out)
        
        Error = ((float(Output[0]) - outL[i].out)**2) / 2 
        E += (outL[i].out - (float(Output[0]))**2) / 2 
 
    CalcErrorsAndUpdateWeights(outL[i].out - (float(Output[0])))
 
 
def CheckNet(Inputs, Output):
    print('\nInput ', Inputs, '\nOutputs ', Output)
    
    for i in range(MAX_INP):
        inpL[i].out = Sigmoid(float(Inputs[i]))
        print(i, ' Input neuron is out ', inpL[i].out)
 
    for i in range(MAX_HID):
        total = 0.0
        for j in range(MAX_INP):
            total += hidL[i].weights[j] * inpL[j].out
        hidL[i].out = Sigmoid(total)
        print(i, 'Hidden neuron is out ', hidL[i].out)
        
    for i in range(MAX_OUT):
        total = 0.0
        for j in range(MAX_HID):
            total += outL[i].weights[j] * hidL[j].out
            print(i, 'Out neuron is ', outL[i].weights, 'weights')
        outL[i].out = Sigmoid(total)
        print(i, 'Out neuron is out ', outL[i].out)
 
 
def Code(Inputs):
    codeIn = []
    for i in range(4):
        if (float(Inputs[i]) >= 0.5):
            codeIn.append(1.0)
        else:
            codeIn.append(0.0)
    return codeIn
 
RunNet()
for i in range(len(Inputs)):
    TrainNet(Code(Inputs[i]), Outputs[i])
print('E: ', E)
while E > Emin:
    print('E: ', E)
    #LEARNING_RATE -= .0001
##    if (E <= 20):
##        LEARNING_RATE = .005
##        print('Success')
    E = 0.0
    Shuffle(Inputs, Outputs)
    for i in range(len(Inputs)):
        
        TrainNet(Code(Inputs[i]), Outputs[i])    
 
print('\n---------------Test---------------\n')
CheckNet([0.304, 0.930, 0.402, 0.878], [1.0])
CheckNet([0.612, 0.250, 0.474, 0.271], [0.0])
CheckNet([0.540, 0.352, 0.782, 0.682], [1.0])
CheckNet([0.435, 0.438, 0.545, 0.312], [0.0])
CheckNet([0.698, 0.051, 0.785, 0.506], [1.0])
CheckNet([0.304, 0.930, 0.402, 0.878], [1.0])
 
print('E: ', E)
Ответ: Немного ошибся в коде, вот правильный исходник (без использования функции Code)
Кликните здесь для просмотра всего текста
Код Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
import math as m
import random as r
 
MAX_INP = 4
MAX_HID = 2
MAX_OUT = 1
LEARNING_RATE = 0.01
E = 0.0
Emin = 1.5
 
 
inpL = []
hidL = []
outL = []
 
Inputs = []
Outputs = []
 
f = open('data.txt', 'r')
 
for line in f:
    Inputs.append(line)
 
f.close()
 
for i in range(len(Inputs)):
    Inputs[i] = Inputs[i].split()
    Outputs.append(Inputs[i][4])
 
def Shuffle(Inputs, Outputs):
    Outputs.clear()
    r.shuffle(Inputs)
    for i in range(len(Inputs)):
        Outputs.append(float(Inputs[i][4]))
 
def Sigmoid(x, deriv = False):
    if (deriv == True):
        return x * (1 - x)
    else:
        return 1 / (1 + m.exp(-x))
 
class Neuron:
    def __init__(self, countW):
        self.weights = []
        self.out = 0.0
        self.error = 0.0
        self.threshold = 0.0
        for i in range(countW):
            self.weights.append(r.uniform(-.05, .05))
            self.threshold = r.uniform(0.0 , 1.0)
        print(self.weights)
        print('Neuron created')
 
def RunNet(): 
    for i in range(MAX_INP):
        inpL.append(Neuron(0))
 
    for i in range(MAX_HID):
        hidL.append(Neuron(MAX_INP))
 
    for i in range(MAX_OUT):
        outL.append(Neuron(MAX_HID))
 
def CalcErrorsAndUpdateWeights(Output):
    global LEARNING_RATE
    
    for i in range(MAX_OUT):
        outL[i].error = Output * Sigmoid(outL[i].out, True)
 
    for i in range(MAX_HID):
        total = 0.0
        for j in range(MAX_OUT):
            total += outL[j].error * outL[j].weights[i]
        hidL[i].error = total * Sigmoid(hidL[i].out, True)
 
    for i in range(MAX_INP):
        total = 0.0
        for j in range(MAX_HID):
            total += hidL[j].error * hidL[j].weights[i]
        inpL[i].error = total * Sigmoid(inpL[i].out, True)
 
 
    #Update weights
 
    for i in range(MAX_INP):
        inpL[i].threshold -= -1 * LEARNING_RATE * inpL[i].error
 
    for j in range(MAX_OUT):
        for i in range(MAX_HID):
            outL[j].weights[i] += -1 * LEARNING_RATE * outL[j].error * hidL[i].out
            #outL[j].threshold -=  LEARNING_RATE * outL[j].error
 
    for j in range(MAX_HID):
        for i in range(MAX_INP):
            hidL[j].weights[i] += -1 * LEARNING_RATE * hidL[j].error * inpL[i].out
            #hidL[j].threshold -=  LEARNING_RATE * hidL[j].error
 
 
def TrainNet(Inputs, Output):
    global E
    global LEARNING_RATE
    Error = 0.0
    
    print('\nInput ', Inputs, '\nOutputs ', Output)
    
    for i in range(MAX_INP):
        inpL[i].out = Sigmoid(float(Inputs[i])) # - inpL[i].threshold
        print(i, ' Input neuron is out ', inpL[i].out)
 
    for i in range(MAX_HID):
        total = 0.0
        for j in range(MAX_INP):
            total += hidL[i].weights[j] * inpL[j].out
        print(i, 'Hidden neuron is ', hidL[i].weights, 'weights')
        hidL[i].out = Sigmoid(total) # - hidL[i].threshold
        print(i, 'Hidden neuron is out ', hidL[i].out)
        
    for i in range(MAX_OUT):
        total = 0.0
        for j in range(MAX_HID):
            total += outL[i].weights[j] * hidL[j].out
        print(i, 'Out neuron is ', outL[i].weights, 'weights')
        outL[i].out = Sigmoid(total) # - outL[i].threshold
        print(i, 'Out neuron is out ', outL[i].out)
        
        Error = ((float(Output[0]) - outL[i].out)**2) / 2 
        E += (outL[i].out - (float(Output[0]))**2) / 2 
 
    CalcErrorsAndUpdateWeights(outL[i].out - (float(Output[0])))
 
 
def CheckNet(Inputs, Output):
    print('\nInput ', Inputs, '\nOutputs ', Output)
    
    for i in range(MAX_INP):
        inpL[i].out = Sigmoid(float(Inputs[i]))
        print(i, ' Input neuron is out ', inpL[i].out)
 
    for i in range(MAX_HID):
        total = 0.0
        for j in range(MAX_INP):
            total += hidL[i].weights[j] * inpL[j].out
        hidL[i].out = Sigmoid(total)
        print(i, 'Hidden neuron is out ', hidL[i].out)
        
    for i in range(MAX_OUT):
        total = 0.0
        for j in range(MAX_HID):
            total += outL[i].weights[j] * hidL[j].out
            print(i, 'Out neuron is ', outL[i].weights, 'weights')
        outL[i].out = Sigmoid(total)
        print(i, 'Out neuron is out ', outL[i].out)
 
 
def Code(Inputs):
    codeIn = []
    for i in range(4):
        if (float(Inputs[i]) >= 0.5):
            codeIn.append(1.0)
        else:
            codeIn.append(0.0)
    return codeIn
 
RunNet()
for i in range(len(Inputs)):
    TrainNet(Inputs[i], Outputs[i])
print('E: ', E)
while E > Emin:
    print('E: ', E)
    #LEARNING_RATE -= .0001
##    if (E <= 20):
##        LEARNING_RATE = .005
##        print('Success')
    E = 0.0
    Shuffle(Inputs, Outputs)
    for i in range(len(Inputs)):
        
        TrainNet(Inputs[i], Outputs[i])    
 
print('\n---------------Test---------------\n')
CheckNet([0.304, 0.930, 0.402, 0.878], [1.0])
CheckNet([0.612, 0.250, 0.474, 0.271], [0.0])
CheckNet([0.540, 0.352, 0.782, 0.682], [1.0])
CheckNet([0.435, 0.438, 0.545, 0.312], [0.0])
CheckNet([0.698, 0.051, 0.785, 0.506], [1.0])
CheckNet([0.304, 0.930, 0.402, 0.878], [1.0])
 
print('E: ', E)


Добавлено через 18 часов 11 минут
Проблема все еще актуальная, надеюсь на вашу помощь.

Добавлено через 12 часов 54 минуты
Ну неужели никто из форумчан не пытался написать нейронную сеть и не сталкивался с такими проблемами?
Вопрос: Нейронная сеть не работает. Почему?

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;                                                           //Neiron
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.Windows.Forms;
 
namespace NeiroNet1
{
    // это по сути контейнер для массива нейронов neironArray
    // загружет его при создании из файла и сохраняет при выходе
 
    class NeiroWeb
    {
        
        public  const int          neironInArrayWidth  =           10; // количество по горизонтали
        public  const int          neironInArrayHeight =           10; // количество по вертикали
        private const string       memory              = "memory.txt"; // имя файла хранения сети
        private       List<Neiron> neironArray         =         null; // массив нейронов
 
        // конструктор
        public NeiroWeb()
        {
            neironArray = InitWeb();            
        }
 
        // функция открывает текстовой файл и преобразовывает его в массив нейронов
        private static List<Neiron> InitWeb()
        {
            if (!File.Exists(memory)) return new List<Neiron>();
            string[] lines = File.ReadAllLines(memory);
            if (lines.Length == 0)    return new List<Neiron>();
            string jStr = lines[0];
            JavaScriptSerializer json = new JavaScriptSerializer();
            List<Object> objects = json.Deserialize<List<Object>>(jStr);
            List<Neiron> res = new List<Neiron>();
            foreach (var o in objects) res.Add(NeironCreate((Dictionary<string,Object>)o));
            return res;
        }
 
        // преобразовать структуру данных в клас нейрона
        private static Neiron NeironCreate(Dictionary<string, object> o)
        {
            Neiron res = new Neiron();
            res.name = (string)o["name"];
            res.countTrainig = (int)o["countTrainig"];
            Object[] veightData = (Object[])o["veight"];
            int arrSize = (int)Math.Sqrt(veightData.Length);
            res.veight = new double[arrSize, arrSize];
            int index = 0;
            for (int n = 0; n < res.veight.GetLength(0); n++)
                for (int m = 0; m < res.veight.GetLength(1); m++)
                {
                    res.veight[n, m] = Double.Parse(veightData[index].ToString());
                    index++;
                }
            return res;
        }
 
        // функция сравнивает входной массив с каждым нейроном из сети и 
        // возвращает имя нейрона наиболее похожего на него
        // именно эта функция отвечает за распознавание образа
 
        public string CheckLitera(int[,] arr)
        {
            string res = null;
            double max = 0;
            foreach (var n in neironArray)
            {
                double d = n.GetRes(arr);
                if (d > max)
                {
                    max = d;
                    res = n.GetName();
                }
            }
            return res;
        }
 
        // функция сохраняет массив нейронов в файл
        public void SaveState()
        {
            JavaScriptSerializer json = new JavaScriptSerializer();
            string jStr = json.Serialize(neironArray);
            System.IO.StreamWriter file = new System.IO.StreamWriter(memory);
            file.WriteLine(jStr);
            file.Close();
        }      
 
        // получить список имён образов, имеющихся в памяти
        public string[] GetLiteras()
        {
            var res = new List<string>();
            for (int i = 0; i < neironArray.Count; i++) res.Add(neironArray[i].GetName());
            res.Sort();
            return res.ToArray();
        }
 
        // эта функция заносит в память нейрона с именем trainingName
        // новый вариант образа data
        
        public void SetTraining(string trainingName, int[,] data)
        {
            Neiron neiron = neironArray.Find(v => v.name.Equals(trainingName));
            if (neiron == null) // если нейрона с таким именем не существует, создадим новыи и добавим
            {                   // его в массив нейронов
                neiron = new Neiron();
                neiron.Clear(trainingName, neironInArrayWidth, neironInArrayHeight);
                neironArray.Add(neiron);
            }
            int countTrainig = neiron.Training(data); // обучим нейрон новому образу
            string messageStr = "Имя образа - " + neiron.GetName() + 
                                " вариантов образа в памяти - " + countTrainig.ToString();
 
            // покажем визуальное отображение памяти обученного нейрона
            Form resultForm = new ShowMemoryVeight(neiron);
            resultForm.Text = messageStr;
            resultForm.Show();
        }
 
       
    }
}


Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;                                             //NeiroWeb
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.Windows.Forms;
 
namespace NeiroNet1
{
    // это по сути контейнер для массива нейронов neironArray
    // загружет его при создании из файла и сохраняет при выходе
 
    class NeiroWeb
    {
        
        public  const int          neironInArrayWidth  =           10; // количество по горизонтали
        public  const int          neironInArrayHeight =           10; // количество по вертикали
        private const string       memory              = "memory.txt"; // имя файла хранения сети
        private       List<Neiron> neironArray         =         null; // массив нейронов
 
        // конструктор
        public NeiroWeb()
        {
            neironArray = InitWeb();            
        }
 
        // функция открывает текстовой файл и преобразовывает его в массив нейронов
        private static List<Neiron> InitWeb()
        {
            if (!File.Exists(memory)) return new List<Neiron>();
            string[] lines = File.ReadAllLines(memory);
            if (lines.Length == 0)    return new List<Neiron>();
            string jStr = lines[0];
            JavaScriptSerializer json = new JavaScriptSerializer();
            List<Object> objects = json.Deserialize<List<Object>>(jStr);
            List<Neiron> res = new List<Neiron>();
            foreach (var o in objects) res.Add(NeironCreate((Dictionary<string,Object>)o));
            return res;
        }
 
        // преобразовать структуру данных в клас нейрона
        private static Neiron NeironCreate(Dictionary<string, object> o)
        {
            Neiron res = new Neiron();
            res.name = (string)o["name"];
            res.countTrainig = (int)o["countTrainig"];
            Object[] veightData = (Object[])o["veight"];
            int arrSize = (int)Math.Sqrt(veightData.Length);
            res.veight = new double[arrSize, arrSize];
            int index = 0;
            for (int n = 0; n < res.veight.GetLength(0); n++)
                for (int m = 0; m < res.veight.GetLength(1); m++)
                {
                    res.veight[n, m] = Double.Parse(veightData[index].ToString());
                    index++;
                }
            return res;
        }
 
        // функция сравнивает входной массив с каждым нейроном из сети и 
        // возвращает имя нейрона наиболее похожего на него
        // именно эта функция отвечает за распознавание образа
 
        public string CheckLitera(int[,] arr)
        {
            string res = null;
            double max = 0;
            foreach (var n in neironArray)
            {
                double d = n.GetRes(arr);
                if (d > max)
                {
                    max = d;
                    res = n.GetName();
                }
            }
            return res;
        }
 
        // функция сохраняет массив нейронов в файл
        public void SaveState()
        {
            JavaScriptSerializer json = new JavaScriptSerializer();
            string jStr = json.Serialize(neironArray);
            System.IO.StreamWriter file = new System.IO.StreamWriter(memory);
            file.WriteLine(jStr);
            file.Close();
        }      
 
        // получить список имён образов, имеющихся в памяти
        public string[] GetLiteras()
        {
            var res = new List<string>();
            for (int i = 0; i < neironArray.Count; i++) res.Add(neironArray[i].GetName());
            res.Sort();
            return res.ToArray();
        }
 
        // эта функция заносит в память нейрона с именем trainingName
        // новый вариант образа data
        
        public void SetTraining(string trainingName, int[,] data)
        {
            Neiron neiron = neironArray.Find(v => v.name.Equals(trainingName));
            if (neiron == null) // если нейрона с таким именем не существует, создадим новыи и добавим
            {                   // его в массив нейронов
                neiron = new Neiron();
                neiron.Clear(trainingName, neironInArrayWidth, neironInArrayHeight);
                neironArray.Add(neiron);
            }
            int countTrainig = neiron.Training(data); // обучим нейрон новому образу
            string messageStr = "Имя образа - " + neiron.GetName() + 
                                " вариантов образа в памяти - " + countTrainig.ToString();
 
            // покажем визуальное отображение памяти обученного нейрона
            Form resultForm = new ShowMemoryVeight(neiron);
            resultForm.Text = messageStr;
            resultForm.Show();
        }
 
       
    }
}


Program.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace NeiroNet1
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }
    }
}
Ответ:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace NeiroNet1
{
    // в этом классе собраны функции для преобразования изображений
    class NeiroGraphUtils
    {
 
        // очищает рисунок
        public static void ClearImage(PictureBox pictureBox)
        {
            pictureBox.Image = (Image)new Bitmap(pictureBox.Width, pictureBox.Height);
        }
 
        // преобразовать рисунок в массив, все цвета кроме белого заносятся как 1, белый  - 0
        public static int[,] GetArrayFromBitmap(Bitmap image)
        {
            int[,] res = new int[image.Width, image.Height];
            for (int n = 0; n < res.GetLength(0); n++)
                for (int m = 0; m < res.GetLength(1); m++)
                {
                    int color = (image.GetPixel(n, m).R + image.GetPixel(n, m).G + image.GetPixel(n, m).B) / 3;
                    res[n, m] = color > 0 ? 1 : 0;
                }
            return res;
        }
 
        // отпечатать строковый символ на графическом рисунке
        public static Image DrawLitera(Image bmp, string l)
        {
            Font myFont = new Font("Arial", 40f);           
            using (Graphics g = Graphics.FromImage(bmp))
            {
                SizeF size = g.MeasureString(l, myFont);
                g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.PixelOffsetMode = PixelOffsetMode.HighQuality;
                g.DrawString(l, myFont, new SolidBrush(Color.Black), Point.Empty);
            }
            return bmp;
        }
 
        // преобразовать массив в рисунок
        public static Bitmap GetBitmapFromArr(int[,] array)
        {
            Bitmap bitmap = new Bitmap(array.GetLength(0), array.GetLength(1));
            for (int x = 0; x < array.GetLength(0); x++)
                for (int y = 0; y < array.GetLength(1); y++)
                    if (array[x, y] == 0)
                        bitmap.SetPixel(x, y, Color.White);
                    else
                        bitmap.SetPixel(x, y, Color.Black);
            return bitmap;
        }
 
        // обрезать рисунок по краям и преобразовать в массив
        public static int[,] CutImageToArray(Bitmap b, Point max)
        {
            int x1 = 0;
            int y1 = 0;
            int x2 = max.X;
            int y2 = max.Y;
            
            for (int y = 0; y < b.Height && y1 == 0; y++)
                for (int x = 0; x < b.Width && y1 == 0; x++)
                    if (b.GetPixel(x, y).ToArgb() != 0) y1 = y;
            for (int y = b.Height - 1; y >= 0 && y2 == max.Y; y--)
                for (int x = 0; x < b.Width && y2 == max.Y; x++)
                    if (b.GetPixel(x, y).ToArgb() != 0) y2 = y;
            for (int x = 0; x < b.Width && x1 == 0; x++)
                for (int y = 0; y < b.Height && x1 == 0; y++)
                    if (b.GetPixel(x, y).ToArgb() != 0) x1 = x;
            for (int x = b.Width - 1; x >= 0 && x2 == max.X; x--)
                for (int y = 0; y < b.Height && x2 == max.X; y++)
                    if (b.GetPixel(x, y).ToArgb() != 0) x2 = x;
 
            if (x1 == 0 && y1 == 0 && x2 == max.X && y2 == max.Y) return null;            
 
            int size = x2 - x1 > y2 - y1 ? x2 - x1 + 1 : y2 - y1 + 1;
            int dx = y2 - y1 > x2 - x1 ? ((y2 - y1) - (x2 - x1)) / 2 : 0;
            int dy = y2 - y1 < x2 - x1 ? ((x2 - x1) - (y2 - y1)) / 2 : 0;            
 
            int[,] res = new int[size, size];
            for (int x = 0; x < res.GetLength(0); x++)
                for (int y = 0; y < res.GetLength(1); y++)
                {
                    int pX = x + x1 - dx;
                    int pY = y + y1 - dy;
                    if (pX < 0 || pX >= max.X || pY < 0 || pY >= max.Y)
                        res[x, y] = 0;
                    else
                        res[x, y] = b.GetPixel(x + x1 - dx, y + y1 - dy).ToArgb() == 0 ? 0 : 1;
                }
            return res;
        }
 
        // пересчитать массив source в массив res - используется для 
        // приведения произвольного массива данных к массиву стандартных размеров
        public static int[,] LeadArray(int[,] source, int[,] res)
        {
            for (int n = 0; n < res.GetLength(0); n++)
                for (int m = 0; m < res.GetLength(1); m++) res[n, m] = 0;
 
            double pX = (double)res.GetLength(0) / (double)source.GetLength(0);
            double pY = (double)res.GetLength(1) / (double)source.GetLength(1);
 
            for (int n = 0; n < source.GetLength(0); n++)
                for (int m = 0; m < source.GetLength(1); m++)
                {
                    int posX = (int)(n * pX);
                    int posY = (int)(m * pY);
                    if (res[posX, posY] == 0) res[posX, posY] = source[n, m];
                }
            return res;
        }
    }
}


Кликните здесь для просмотра всего текста
[CSHARP]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace NeiroNet1
{
    // это класс нейрона, каждый нейрон хранит в себе массив определённого образа
    // он может обучаться и сравнивать значение с имеющимся в памяти
 
    public class Neiron
    {
        public  string      name; // имя - текстовое значение образа который хранит нейрон
        public  double[,] veight; // массив весов - именно это и есть память нейрона
        public  int countTrainig; // количество вариантов образа в памяти
                                  // нужно для правильного пересчёта весов при обучении
 
        // конструктор
         public Neiron() {}
 
        // получить имя
         public string GetName() { return name; }
 
        // очистить память нейрона и присвоить ему новое имя
         public void Clear(string name, int x, int y)
         {
             this.name = name;
             veight = new double[x,y];
             for (int n = 0; n < veight.GetLength(0); n++)
                 for (int m = 0; m < veight.GetLength(1); m++) veight[n, m] = 0;
             countTrainig = 0;
         }
 
         // функция возвращает сумму величин отклонения входного массива от эталонного
         // другими словами чем результат ближе к 1це тем больше похож входной массив 
         // на образ из памяти нейрона
         public double GetRes(int[,] data){
             if (veight.GetLength(0) != data.GetLength(0) || veight.GetLength(1) != data.GetLength(1)) return -1;
             double res = 0;
             for (int n = 0; n < veight.GetLength(0); n++)
                 for (int m = 0; m < veight.GetLength(1); m++) 
                     res += 1 - Math.Abs(veight[n, m] - data[n, m]);  // в этой строке мы считаем отклонения 
                                                                      // каждого элемента входного массива от 
                                                                      // усреднённого значения из памяти
 
             return res / (veight.GetLength(0) * veight.GetLength(1));// возвращем среднее арифметическое отклонение по массиву
                                                                      // на самом деле эта операция не обязательная
                                                                      // но в теории должна дать лучшую стабильность
                                                                      // при большом количестве образов
         }
 
         // добавить входной образ в память массива
         public int Training(int[,] data)
         {
             // проверим что массив существует и тех же размеров что и массив памяти
             if (data == null || veight.GetLength(0) != data.GetLength(0) || veight.GetLength(1) != data.GetLength(1)) return countTrainig;
             countTrainig++;
             for (int n = 0; n < veight.GetLength(0); n++)
                 for (int m = 0; m < veight.GetLength(1); m++)
                 {
                     // на всякий случай приведём значение элемента входного массива к дискретному
                     double v = data[n, m] == 0 ? 0 : 1; 
                     // вот сейчас будет самая главная строчка
                     // каждый элемент в памяти пересчитывается с учетом значения из data
                     veight[n, m] += 2 * (v - 0.5f) / countTrainig;
                     if (veight[n, m] > 1) veight[n, m] = 1; // значение памяти не может быть больше 1
                     if (veight[n, m] < 0) veight[n, m] = 0; // значение памяти не может быть меньше 0
                 }
             return countTrainig; // вернуть количество обучений
         }
       
    }
 
}


Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.Windows.Forms;
 
namespace NeiroNet1
{
    // это по сути контейнер для массива нейронов neironArray
    // загружет его при создании из файла и сохраняет при выходе
 
    class NeiroWeb
    {
        
        public  const int          neironInArrayWidth  =           10; // количество по горизонтали
        public  const int          neironInArrayHeight =           10; // количество по вертикали
        private const string       memory              = "memory.txt"; // имя файла хранения сети
        private       List<Neiron> neironArray         =         null; // массив нейронов
 
        // конструктор
        public NeiroWeb()
        {
            neironArray = InitWeb();            
        }
 
        // функция открывает текстовой файл и преобразовывает его в массив нейронов
        private static List<Neiron> InitWeb()
        {
            if (!File.Exists(memory)) return new List<Neiron>();
            string[] lines = File.ReadAllLines(memory);
            if (lines.Length == 0)    return new List<Neiron>();
            string jStr = lines[0];
            JavaScriptSerializer json = new JavaScriptSerializer();
            List<Object> objects = json.Deserialize<List<Object>>(jStr);
            List<Neiron> res = new List<Neiron>();
            foreach (var o in objects) res.Add(NeironCreate((Dictionary<string,Object>)o));
            return res;
        }
 
        // преобразовать структуру данных в клас нейрона
        private static Neiron NeironCreate(Dictionary<string, object> o)
        {
            Neiron res = new Neiron();
            res.name = (string)o["name"];
            res.countTrainig = (int)o["countTrainig"];
            Object[] veightData = (Object[])o["veight"];
            int arrSize = (int)Math.Sqrt(veightData.Length);
            res.veight = new double[arrSize, arrSize];
            int index = 0;
            for (int n = 0; n < res.veight.GetLength(0); n++)
                for (int m = 0; m < res.veight.GetLength(1); m++)
                {
                    res.veight[n, m] = Double.Parse(veightData[index].ToString());
                    index++;
                }
            return res;
        }
 
        // функция сравнивает входной массив с каждым нейроном из сети и 
        // возвращает имя нейрона наиболее похожего на него
        // именно эта функция отвечает за распознавание образа
 
        public string CheckLitera(int[,] arr)
        {
            string res = null;
            double max = 0;
            foreach (var n in neironArray)
            {
                double d = n.GetRes(arr);
                if (d > max)
                {
                    max = d;
                    res = n.GetName();
                }
            }
            return res;
        }
 
        // функция сохраняет массив нейронов в файл
        public void SaveState()
        {
            JavaScriptSerializer json = new JavaScriptSerializer();
            string jStr = json.Serialize(neironArray);
            System.IO.StreamWriter file = new System.IO.StreamWriter(memory);
            file.WriteLine(jStr);
            file.Close();
        }      
 
        // получить список имён образов, имеющихся в памяти
        public string[] GetLiteras()
        {
            var res = new List<string>();
            for (int i = 0; i < neironArray.Count; i++) res.Add(neironArray[i].GetName());
            res.Sort();
            return res.ToArray();
        }
 
        // эта функция заносит в память нейрона с именем trainingName
        // новый вариант образа data
        
        public void SetTraining(string trainingName, int[,] data)
        {
            Neiron neiron = neironArray.Find(v => v.name.Equals(trainingName));
            if (neiron == null) // если нейрона с таким именем не существует, создадим новыи и добавим
            {                   // его в массив нейронов
                neiron = new Neiron();
                neiron.Clear(trainingName, neironInArrayWidth, neironInArrayHeight);
                neironArray.Add(neiron);
            }
            int countTrainig = neiron.Training(data); // обучим нейрон новому образу
            string messageStr = "Имя образа - " + neiron.GetName() + 
                                " вариантов образа в памяти - " + countTrainig.ToString();
 
            // покажем визуальное отображение памяти обученного нейрона
            Form resultForm = new ShowMemoryVeight(neiron);
            resultForm.Text = messageStr;
            resultForm.Show();
        }
 
       
    }
}
Вопрос: Линейная нейронная сеть

Доброго времени суток!
Можете скинуть пример простейшей нейронной сети на Си/С++, Матлабе, или Java? У меня есть код для матлаба, но не могу найти в нем ошибку, почему-то не обучается фильтрации, в алгоритме корректировал веса по правилу w(i) = w(i) + input(i)*(d-output), где d - реальный сигнал, output - вычесленный,w(i) - вес, input(i) - вход
Ответ: Я бы перед произведением добавил множитель (шаг, скорость обучения) из интервала 0.001-0.000001.
Вопрос: Нейронные сети и ГА

Люди, помогите плиз... горю...
Нужна инфа, а главное - ПРИМЕРЫ по нейронным сетям и генетическим алгоритмам...
Ответ: Доброго времени суток. Начал изучать нейронные сети и запнулся на первой же лабе. Штудирую теорию уже ни один вечер и хочется разобраться с простейшим ибо дальше будет хуже.
Суть задания, с помощью линейно НС спрогнозировать функцию, дана функция, размер
обучаемой и прогнозируемой выборки. Нейронная сеть обучается на основе алгоритма Видроу Хоффа (дельта правила). Почитал теорию, для прогнозирования один из методов применяется метод
"скользящего" окна, ширина окна равна количеству входов нейронной сети, оно задано в условии.
Непонятны следующие моменты -  
спрогнозировать нужно функцию 0,4*sin(0.3*x)+0.5, размерность обучаемой выборки L=20, х=(1, 20)
Что будет подаваться на вход нейронной сети?, сначала нужно найти значения функции при всех иксах и потом уже значения из этого ряда будут подаваться на вход нейронной сети?
Вопрос: Самообучающаяся нейронная сеть имитирующая сознание

В последнее время загорелся идеей нейронной сети. Решил написать свою. Задумка такая:
1. Поместить сеть в 3D пространство игры. Пространство представляет из себя бесконечное поле (1км² и зациклить его). Сеть в этом пространстве имитирует прогулку по нему девушки.
2. Сеть в буквальном смысле видит это самое пространство(обладает в нем зрением). Ведёт в нём себя по разному: то пройдется немного, то отдохнет.
3. Сеть умеет читать. При первом запуске прочитывает несколько книг, которые лежат на полке(Старт сети происходит в доме, а потом она выходит из него и попадает в поле).
4. Сеть умеет говорить с пользователем. Обсудить может прочитанные книги и то, что её окружает(поле). В общем встроенная программа собеседник на основе нейронной сети(большинство других основаны на экспертной системе). Количество тем разговора зависит от прочитанных книг и случайных факторов. (Симуляция сознания в общем)
5. Возможность самообучения.
Однако, я вообще не представляю как это все реализовать. Конечно, вы можете сказать, что с моим знанием c# не стоит этим заниматься. Но именно так я и учусь программировать(ставлю сложную задачу, на интересующую меня тему, которую сам выполнить не могу, прошу помощи, а после разбираю код "на зап. части": передылываю его на новый лад и смотрю что получится. Благодаря этому уже пишу не очень сложные программы самостоятельно, основываясь на полученном опыте). Надеюсь, вы и в этот раз мне поможете выполнить эту задачу. Заранее благодарен.
Ответ: Рядовой,
Сообщение от Рядовой
И вообще не представляю как код может производить произвольные действия..
Нейронные сети сплошной рандом
Вопрос: Нейронная сеть: распознать букву "Т"

Нужно написать нейронную сеть для распознавания буквы "Т", которая задается в массиве 3 на 3, причем она может быть перевернутой.

Например:
111
010
010

100
111
100

010
010
111

001
111
001

Это верные комбинации, которые сеть должна распознавать, как правильные. Любые другие комбинации являются неверными.

Пока для решений проблемы вижу два пути:

1) Создать 5 персептронов, 4 для каждого положения буквы Т и 1 для остальных неверных комбинаций. А потом просто смотреть какой персептрон набрал большую сумму.
Это решение кажется, мне не верным..

2) Реализовать посредством персептронов логические операции "И"(AND) и "исключающее ИЛИ"(XOR) и соединить их в сеть, то есть создать аналог логического выражения..
Тут у меня возникают сложности с реализацией..

Собственно, хочу услышать путь решения данной задачи..
Ответ: Вы точно уверены, что здесь необходима нейронная сеть? Не проще ли будет вбить в программму все эти четыре варианта поворота и сраавнивать на равенство введённые данные. Или вбить только один вариант буквы, а исходные данные поворачивать и проверять на равенство.
Или вы хотели потренироваться в нейронных сетях?
Вопрос: Нейронная сеть на php

Всем привет, в основном занимаюсь веб дизайном.
Но тут начитался про нейронные сети, и захотелось разобраться, ближе всего мне всё-таки php( в C++ знаком только с базовыми понятиями).
Так вот, что можно почитать, + кто может подсказать что-то о создании нейронной сети.
Видел пишут про FANN и т.д.
Сразу скажу, цель - написать полностью всю ИНС.
Функционал - стандартно, определение цифр для начала)

(Отредактировано автором: 28 Мая, 2015 - 20:00:49)

Ответ:
DeepVarvar пишет:
Google -> нейронная сеть на пхп
Ничего не выдал?
Там десятки ссылок, и даже рабочие примеры.

первым делом так сделал, везде c FANN
Вопрос: Нейронная сеть усредняющая цвета

Всем доброго времени суток!
К сожалению мой уровень знаний и практических навыков не позволяет создать нейронную сеть, но есть большое желание

Суть желаемой сети проста: допустим изображение имеет 256 цветов, а в палитре у художника всего 12. Сеть должна "нарисовать" картинку с наименьшими искажениями.

Даже не знаю с чего начать...
Буду рад любым комментариям
Ответ: Jason, Вы мне очень помогли!! Большое спасибо!

А нейронные сети подождут
Вопрос: Нейронные сети и распознавание рукописного текста

1)В общем дело в том,что хочу реализовать распознавание рукописного текста(с картинки).
2)Самое подходящее-нейронные сети(в частности персептрон,если не прав исправьте),самый подходящий язык-С# и компания,кто рыл в этом направлении?
3)помогите,в принципе рассматриваются все языки,кроме java (смотрел ниче не понял),но желательно С#.
4)Желательно исходники и литература!
Ответ: я сделал нейронные сети в matlab (там реально легче, уже все есть для построения обычной сети) прилинковал библиотеки matlab к C# проекту и ву а ля.Примеров куча по инету, нет возможности найти сейчас. Удачи вам.
Вопрос: Создание нейронной сети для подбора растений в аквариум

Здравствуйте.

Кто сталкивался, скиньте пример создания нейронной сети для задачи типа: "Подбор растений для аквариума на основании определенных параметров".

Заранее благодарен.
Ответ: Пример КАКОЙ-НИБУДЬ нейронной сети еще можно найти, хоть и с трудом. Но прицельно под вашу задачу - нет.
Ищите
1) на сайтах, где делают за деньги рефераты, курсачи и дипломные. Там обычно есть коллекция БЕСПЛАТНЫХ курсовых и дипломов, и некотороыен с исходниками.
2) коллекция нейросетей была здесь
http://apsheronsk.bozo.ru/Neural/Neural1.htm
3. И вот здесь надо найти страничку Карпова (а не Карповой!) и там есть куски кода по нейросетям
http://rema44.ru/resurs/students/karpov/