Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
RamonN
32 / 32 / 19
Регистрация: 13.07.2011
Сообщений: 138
1

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

12.10.2015, 03:39. Просмотров 986. Ответов 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)
0
Вложения
Тип файла: txt data.txt (6.1 Кб, 9 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2015, 03:39
Ответы с готовыми решениями:

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

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

Обучение языку
Доброго времени суток! Уже год как изучаю C++ и Qt. Набрался кое-каких знаний....

Обучение питону
Хотел, бы спросить, где и как онлайн можно выучить питон и джанго, что-бы мочь...

Python возможности и обучение
Здравствуйте, имеется ряд вопросов по python, ответе пожалуйста! 1. Что может...

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

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

Блин, я же где-то пару раз на форуме писал способ отладки таких нейронок...
Убираете нафиг все нелинейности отовсюду, в качестве обучающей выборки берёте лежащие на линейной функции 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
Сообщений: 138
19.10.2015, 23:15  [ТС] 6
VTsaregorodtsev, Да нет, как раз таки верю. Когда искал что-то по этой теме, натыкался на ваши сообщения и ваш сайт и, как мне кажется, вы тут единственный кто превосходно разбирается в этой области
Может быть вы посоветуете все же какие материалы (учебники) можно почитать по НС, чтобы обстоятельно вникнуть в суть вопроса. А то сколько не искал: везде пишут либо одно и то же, либо что-то невразумительное.
0
VTsaregorodtsev
524 / 463 / 68
Регистрация: 19.02.2010
Сообщений: 1,745
21.10.2015, 21:54 7
RamonN, давно не слежу за уровнем "для чайников" (а редкие студенты приносят такииииие доморощенные "шедевры" в виде ВУЗовских методичек, что обычно рекомендую выкидывать).
0
21.10.2015, 21:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2015, 21:54

Многослойная нейронная сеть и её обучение
Здравствуйте! :) Нужно создать многослойную нейронную сеть и обучить для...

Нейронная сеть
Добрый день. Помогите, пожалуйста с решением задачи Код(исходные данные)...

Нейронная сеть
Не поможет ли мне кто-нибудь? Может ли алгоритмист написать алгоритм по...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru