Форум программистов, компьютерный форум, киберфорум
Python: ИИ, нейросети, ML, агенты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для RamonN
32 / 32 / 19
Регистрация: 13.07.2011
Сообщений: 140

Нейронная сеть. Обучение с учителем

12.10.2015, 03:39. Показов 3206. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток форумчане.
Появилась необходимость написать нейронную сеть, которая обучается методом обратного распространения ошибки.
Но возникли определенные проблемы: сеть просто не хочет обучаться. На выходе сети должны выдаваться либо 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)
Вложения
Тип файла: txt data.txt (6.1 Кб, 21 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.10.2015, 03:39
Ответы с готовыми решениями:

Автоматический анализ тональности твитов (обучение с учителем)
Доброго времени суток! Кто-нибудь может подсказать, почему появляется ошибка? Задача автоматического анализа тональности твитов с...

Нейронная сеть
Ошибка: Traceback (most recent call last): File &quot;C:/Users/kiber/PycharmProjects/chernovik/venv/lerning.py&quot;, line 86, in &lt;module&gt; ...

K средних обучение с учителем
Доброго времени суток, не могу найти на просторах интернета код k-средних обучение с учителем, нахожу только код без учителя ,может у кого...

6
 Аватар для RamonN
32 / 32 / 19
Регистрация: 13.07.2011
Сообщений: 140
13.10.2015, 11:00  [ТС]
Немного ошибся в коде, вот правильный исходник (без использования функции 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 минуты
Ну неужели никто из форумчан не пытался написать нейронную сеть и не сталкивался с такими проблемами?
0
2649 / 1660 / 267
Регистрация: 19.02.2010
Сообщений: 4,393
19.10.2015, 22:03
Я, например, писал и пишу. Много разных нейронок, успешно. Но не на питоне.
Как совет чисто наугад - попробуйте уменьшить шаг обучения на 2-3 порядка. 0.01 - это слишком много.
1
 Аватар для RamonN
32 / 32 / 19
Регистрация: 13.07.2011
Сообщений: 140
19.10.2015, 22:43  [ТС]
VTsaregorodtsev, Попробовал не использовать активационную функцию на входном слое сети, стало получше достаточно, но тем не менее, хотелось бы узнать, почему без активационной функции на входном слое работает нормально, а с ней нет.
Спасибо за помощь, я уж думал, тема канет в лету

Добавлено через 18 минут
VTsaregorodtsev,
Но почему-то везде пишут, что шаг обучения 0.1 слишком маленький и сеть будет обучаться достаточно долго е время и даже предлагают ставить в начале обучения что-то вроде 0.9, а потом уменьшать со временем
0
2649 / 1660 / 267
Регистрация: 19.02.2010
Сообщений: 4,393
19.10.2015, 22:55
Значит, производные как-то не так считаете. Скорее всего.

Блин, я же где-то пару раз на форуме писал способ отладки таких нейронок...
Убираете нафиг все нелинейности отовсюду, в качестве обучающей выборки берёте лежащие на линейной функции y=x точки, добиваетесь стабильного снижения ошибки до уровней где-то 10^-6, дальше не надо.
Затем повторяете это для обучающей выборки для линейной функции от нескольких переменных (типа y=a+b+c). Ну или в качестве дополнительных входных переменных берёте просто шум.
А вот когда такая кастрированная "линейная" нейронка будет брать любые линейные функции при любом числе слоёв в нейронке и любом числе нейронов в слоях (кроме последнего - там число нейронов жёстко задаётся задачей и руками крутить его нельзя) - ставите на нейроны нелинейность (может, не на все слои нейронов - а только на какой-то один) и проводите тесты обучения заново с простейшего случая. Точность при этом можно будет снизить, до 10^-3, например.

И, вообще, надо понимать, что наряду с отладкой кода нейронки Вы отлаживаете ещё и метод оптимизации (выбор шага обучения - оттуда), и допиливаете приемлемую для задачи/нейронки схему масштабирования данных на входе-выходе. В общем, рекомендуется взять и прочитать 1-2-3... других учебника по многослойному персептрону и/или обратному распространению для полного охвата картины.

Правда, щас среди учебников полно кривого неадеквата (как, например, УлГУшное пособие "Интеллектуальные информационные системы" (там есть раздел по нейронкам, несмотря на название)), либо всё равно не даётся нужное (с моей точки зрения) описание.

Добавлено через 10 минут
Цитата Сообщение от RamonN Посмотреть сообщение
Но почему-то везде пишут, что шаг обучения 0.1 слишком маленький
Вот пусть они и дальше пишут. А у меня шага больше, чем 0.005-0.001 почти никогда не используется.

Ну и я гляжу, у Вас умножение на шаг встречается в выражении для коррекции синапсов каждого слоя. А это просто неоптимально. Можно домножить на шаг только лишь ошибки, подаваемые на выход сети. Далее они автоматически пройдут по сети в ходе обр.распространения и никуда не денутся. Если не верите - разбирайтесь с принципами алг. обратного распространения
1
 Аватар для RamonN
32 / 32 / 19
Регистрация: 13.07.2011
Сообщений: 140
19.10.2015, 23:15  [ТС]
VTsaregorodtsev, Да нет, как раз таки верю. Когда искал что-то по этой теме, натыкался на ваши сообщения и ваш сайт и, как мне кажется, вы тут единственный кто превосходно разбирается в этой области
Может быть вы посоветуете все же какие материалы (учебники) можно почитать по НС, чтобы обстоятельно вникнуть в суть вопроса. А то сколько не искал: везде пишут либо одно и то же, либо что-то невразумительное.
0
2649 / 1660 / 267
Регистрация: 19.02.2010
Сообщений: 4,393
21.10.2015, 21:54
RamonN, давно не слежу за уровнем "для чайников" (а редкие студенты приносят такииииие доморощенные "шедевры" в виде ВУЗовских методичек, что обычно рекомендую выкидывать).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2015, 21:54
Помогаю со студенческими работами здесь

Нейронная сеть
Здравствуйте, есть вопрос касаемо взвешивания весовых коэффициентов. Есть рекуррентная нейронная сеть, для определения тональности текста,...

Нейронная сеть по статье
Наткнулся я на статью в которой написано про нейронную сеть и решил попробовать, но вылезла ошибка. ValueError: shapes (6,6) and (1,3)...

Нейронная сеть на питоне
Здравствуйте! я учусь в университете и мне дал задание написать нейронную сеть на питоне, которая будет классифицировать музыку по жанрам...

Простейшая нейронная сеть
Всем привет. Я новичок в питон, но все же. Может кто ни будь может подсказать почему код не работает? synaptic_weights = 2 *...

Нейронная сеть (распознование)
Здравствуйте. Возник такой вопрос, а вернее потребность. Нужно написать скрипт, на сколько я понимаю это из разряда нейронных сетей, к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru