Форум программистов, компьютерный форум, киберфорум
ИИ, нейросети, LLM, ML, Data Science, ИИ-агенты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/88: Рейтинг темы: голосов - 88, средняя оценка - 4.66
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200

Простейшая нейронная сеть для аппроксимации параболы

08.05.2019, 16:18. Показов 21199. Ответов 229
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пробую написать свою первую нс из двух нейронов. На выходе простой сумматор.
http://images.vfl.ru/ii/155731... 2257_m.png
Задаю значения х = [0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9] и по ним получаю y = (2*x-1)^2 + 0.1 см график ниже
http://images.vfl.ru/ii/155731... 2396_m.png
у - это зеленый точки (соединенные просто для понимания) синими линиями.
y = [0,74 0,46 0,26 0,14 0,1 0,14 0,26 0,46 0,74]. Исходные значения х и y задаю в квадрате 0-1 чтобы избавиться от нужды в нормализации.
Голубая линия - это выход сети (его обозначаю в дальнейшем y1), который получаю так:
сначала задаю случайные веса от -0.5 до 0.5: w = rand(6,1)-0.5; и по ним вычисляю выход сети: y1 = ynet(x, w);
(код на матлабе специально писал предельно просто, развернуто, без матриц)
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function y = ynet(x, w) % ф-ция вычисляет выход сети
for i = 1:numel(x)
  y(i,1) = forward(x(i), w);
end
end
 
function f = forward(x, w)
% y = w5*f(xw1+w3)+w6*f(xw2+w4)
f1 = smd(x*w(1)+w(3));
f2 = smd(x*w(2)+w(4));
f = w(5)*f1 + w(6)*f2;
end
 
function f = smd(x)
f = 1./(1+exp(-x)); % логический сигмойд
end
 
function df = dsm(x)
f = smd(x); df = f.*(1-f); % производная сигмойда
end
Задача ясна: изменить так значения весов w чтобы выходные значения y1 совпали или были близки к истинным y, т.е. минимизировать ф-цию ошибки сети E см ниже
http://images.vfl.ru/ii/155731... 2684_m.png
Пробую это делать тремя способами и ни один не работает и не понимаю почему.

Способ 1.
Нахожу производную от ф-ции ошибки сети по весам (как по формулам приведенным на рис выше) и соответственно ей изменяю веса (w1 = w - a*dE; w = w1)
Matlab M
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
function full_x(w, x, y)
a = 0.1;
for i = 1:100
  dE = dE_analytic(w, x, y);
  w1 = w - a*dE;
  er1 = sumerr(x, y, w);
  er2 = sumerr(x, y, w1);
  if er1 < er2
    disp('err')
  else
    w = w1;
  end
end
end
 
function dE = dE_analytic(w, x, y) % ф-ция вычисляет градиент Е по весам w
y1 = ynet(x, w); d = y1 - y;
for i = 1:numel(x)
  de1(i) = d(i)*x(i)*dsm(x(i)*w(1)+w(3));
  de2(i) = d(i)*x(i)*dsm(x(i)*w(2)+w(4));
  de3(i) = d(i)*dsm(x(i)*w(1)+w(3));
  de4(i) = d(i)*dsm(x(i)*w(2)+w(4));
  de5(i) = d(i)*smd(x(i)*w(1)+w(3));
  de6(i) = d(i)*smd(x(i)*w(2)+w(4));
end
dE1 = w(5)*sum(de1);
dE2 = w(6)*sum(de2);
dE3 = w(5)*sum(de3);
dE4 = w(6)*sum(de4);
dE5 = sum(de5);
dE6 = sum(de6);
dE = [dE1 dE2 dE3 dE4 dE5 dE6]';
end
 
function err = sumerr(x, y, w)
temp = [];
for i = 1:numel(x)
  y1 = forward(x(i), w);
  d = y1 - y(i);
  temp = [temp; d*d];
end
err = sum(temp);
end
На выходе получаю (и всегда что-то близкое к этому)
http://images.vfl.ru/ii/155732... 2811_m.png
В чем тут дело? В чем ошибка? Через десяток итераций сеть перестает обучаться.

Способ 2.
Меняю веса по градиенту Е, но вычисленному после каждого x(i) и y(i), но результат такой же, похожий

Способ 3.
Меняю веса через вычисление обратного распространения ошибки
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function backprop(w, x, y)
a = 0.1;
for i = 1:40
  for j = 1:9
    y1 = ynet(x(j), w); d = y1 - y(j);
    d1 = d*w(5); d2 = d*w(6);
    df1 = dsm(x(j)*w(1)+w(3));
    df2 = dsm(x(j)*w(2)+w(4));
    w(1) = w(1)+d1*df1*x(j)*a;
    w(2) = w(2)+d2*df2*x(j)*a;
    w(3) = w(3)+d1*df1*a;
    w(4) = w(4)+d2*df2*a;
    f1 = smd(x(j)*w(1)+w(3));
    w(5) = w(5)+d1*f1*a;
    f2 = smd(x(j)*w(2)+w(4));
    w(6) = w(6)+d2*f2*a;
  end
end
end
Миниатюры
Простейшая нейронная сеть для аппроксимации параболы   Простейшая нейронная сеть для аппроксимации параболы   Простейшая нейронная сеть для аппроксимации параболы  

Простейшая нейронная сеть для аппроксимации параболы  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2019, 16:18
Ответы с готовыми решениями:

Нейронная сеть для аппроксимации
Написал скрипт, для нейронной сети, но при запуске ничего не происходит. clear all N=80; x=rand(1,N); y=(rand(1,N)-0.5)*4; ...

Нейронная сеть для функции
Как написать нейронную сеть для решения такой задачи: У меня есть нейронная сеть. Я хочу ее обучить, например возводить числа в куб. ...

Не работающая нейронная сеть для xor
Проблема описана в заголовке, но тут по-подробнее. Ошибка как бы изменяется в меньшую сторону, но абсолютно не значительно, и как видно...

229
1 / 1 / 0
Регистрация: 06.02.2019
Сообщений: 217
29.09.2019, 16:40
Студворк — интернет-сервис помощи студентам
Задача с 3-мя нейронами и параболой еще актуальна?
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
29.09.2019, 17:06
А почему ей не быть актуальной?
Темы на форуме не только для ТС, а и для всех пользователей и гостей т.е. для создания интересного контента привлекающего людей. Наверняка найдется 100500 чел которые заходят сделать работающий пример. Скорей всего так будет и через 10 лет…
0
1 / 1 / 0
Регистрация: 06.02.2019
Сообщений: 217
29.09.2019, 17:08
Цитата Сообщение от Excalibur921 Посмотреть сообщение
А почему ей не быть актуальной?
Тут 7 страниц сообщений. Я же не могу все прочитать и понять, помогли уже или нет.
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
29.09.2019, 17:26  [ТС]
YagDen, спасибо за желание помочь. Эта задача решена, но есть еще до конца не решенная:
на стр Проблема с обучением простой нейронной сети методом Левенберга-Марквардта посты 36 и 25 (можно читать в этом порядке) поясняют вопрос.
Исходная задача такая: как по куску дуги (части контура) на изображении найти центр тела с помощью НС.
0
1 / 1 / 0
Регистрация: 06.02.2019
Сообщений: 217
29.09.2019, 17:42
Попробуйте так. Может получится.
Code
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
sig(x) = 1 / (1 + exp(-x))
dsig(x) = x * (1 - x)
speed = 0.1 // скорость обучения
 
Прямое распространение:
s1 = w1 * x + w3;
o1 = sig(s1)
s2 = w2 * x + w4
o2 = sig(s2)
s3 = w5 * o1 + w6 * o2
o3 = sig(s3)
 
Обратное распространение:
delta = f(x) - o3 // f(x) - парабола
loss = loss + delta * delta // лосс функция. Можно не считать, нужна только для контроля процесса обучения
g3 = delta * dsig(o3) // градиент выходного нейрона
g1 = g3 * w5 * dsig(o1) // градиент соответствующего нейрона скрытого слоя
g2 = g3 * w6 * dsig(o2) // градиент соответствующего нейрона скрытого слоя
 
Коррекция весов:
w1 = w1 + speed * x * g1
w2 = w2 + speed * x * g2
w3 = w3 + speed * g1
w4 = w4 + speed * g2
w5 = w5 + speed * o1 * g3
w6 = w6 + speed * o2 * g3
Все эти действия повторить для каждого значения обучающей пары. Это называется обучающей эпохой. В начале каждой эпохи loss = 0. После каждой эпохи лосс по желанию можно выводить: корень(loss) / n (n - количество обучающих пар). Эпох для такой сети нужно хотя бы 5000000. Чем больше, тем лучше.

Не ручаюсь, что заработает, но попробуйте. Должно получиться. Отпишитесь, пожалуйста, заработало или нет. Если нет, попробуйте speed = 0.05
Изображения
 
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
29.09.2019, 17:52  [ТС]
Спасибо. Попробую немного позднее.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
29.09.2019, 19:04
Цитата Сообщение от YagDen Посмотреть сообщение
delta = f(x) - o3 // f(x) - парабола
Зачем ошибка со знаком, а не так?
delta = abs(f(x) - o3) // модуль значение функции минус ответ сети
Почему берется ошибка в одной точке а не в N? Может лучше брать сумму квадратов ошибок в N точках а X задавать?
f(x) по рис автора X от 0 до 1, брать 10 точек.
Net(x) //ответ нейросети
delta =(f(0.0) - Net(0.0) )^2+(f(0.1) - Net(0.1) )^2+…+(f(1.0) - Net(1.0) )^2
Или сложить все и в квадрате.



Инициализация весов рандом в каком диапазоне?
speed от 0 до 1? Или это абстрактное число и нет предела?

А как правильно делать примеры для обучения? Два варианта:
1)Нужно сгенерировать массив векторов a,b длинной например 10 000. Где “a” это рандом от 0 до 1 он же X, “b” это f(a), он же f(x) параболы.
А разве примеры не нужно разбить на 3 равных куска Train, Test и Validation?
На Train обучать, на Test считать loss
Кстати а зачем так?
Цитата Сообщение от YagDen Посмотреть сообщение
корень(loss) / n (n - количество обучающих пар).
Просто сумму ошибок делим на кол-во примеров.
Затем тест Eror ошибка на примерах из Validation показывает настоящую ошибку.

2)Не хранить примеры а генерировать их налету от рандом генератора.

А примеры нужно перемешивать если сгенерированы в массиве перед каждой эпохой?
0
1 / 1 / 0
Регистрация: 06.02.2019
Сообщений: 217
29.09.2019, 20:35
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Зачем ошибка со знаком, а не так?
delta = abs(f(x) - o3) // модуль значение функции минус ответ сети
delta - это не ошибка, а градиент минимизируемой функции:
https://www.cyberforum.ru/cgi-bin/latex.cgi?loss = \frac{\sqrt{\sum_{1}^{N}{(f(x) - o3)}^{2}}}{N}
в конкретной точке N. Если ее продифференцировать в этой точке, то и получится 2 * (f(x) - o3). Двойку можно выкинуть т.к. лишние вычисления, а значением speed можно регулировать значения всех коррекций весов.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Почему берется ошибка в одной точке а не в N? Может лучше брать сумму квадратов ошибок в N точках а X задавать?
Ошибка, о которой Вы говорите - это не delta, а loss. Она и считается как сумма:
Цитата Сообщение от YagDen Посмотреть сообщение
loss = loss + delta * delta // лосс функция. Можно не считать, нужна только для контроля процесса обучения
Цитата Сообщение от Excalibur921 Посмотреть сообщение
delta = abs(f(x) - o3) // модуль значение функции минус ответ сети
Модуль нельзя брать, потому что эта функция не дифференцируема, поэтому ее заменяют на квадрат.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Может лучше брать сумму квадратов ошибок в N точках а X задавать?
f(x) по рис автора X от 0 до 1, брать 10 точек.
Net(x) //ответ нейросети
delta =(f(0.0) - Net(0.0) )^2+(f(0.1) - Net(0.1) )^2+…+(f(1.0) - Net(1.0) )^2
Или сложить все и в квадрате.
То же самое. Ошибка так и считается, а вот градиент так считать нельзя. Градиент - это производная в конкретной точке функции оптимизации, а не усреднения.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Инициализация весов рандом в каком диапазоне?
в простейшем случае можете взять что нибудь типа [-0.4 -0.1] и [0.1 0.4] рандомом по равномерному закону распределения. Работать будет. Нулей избегайте.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
speed от 0 до 1? Или это абстрактное число и нет предела?
Это гиперпараметр, подбирается эмпирически. Больше 1 не может быть. Я рекомендую брать от 0,5 до 0,005. Чем меньше, тем точнее, но дольше обучение.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
А как правильно делать примеры для обучения? Два варианта:
1)Нужно сгенерировать массив векторов a,b длинной например 10 000. Где “a” это рандом от 0 до 1 он же X, “b” это f(a), он же f(x) параболы.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
2)Не хранить примеры а генерировать их налету от рандом генератора.
Можно и так, и так. Есть такое понятие, как стохастический градиент. Суть в том, обучать сеть можно не только на всем батче, но и на минибатче. В итоге обучение сойдется все равно. 2-й вариант лучше. Он исключает оверфиттинг за счет бесконечно большой выборки. Когда такой вариант возможен, лучше юзать его.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
А разве примеры не нужно разбить на 3 равных куска Train, Test и Validation?
На Train обучать, на Test считать loss
Ну, это идеал. Если не лень запариваться - то сделайте. Но если вы будете генерить все на лету, то и проверять результат тоже нужно соответственно.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
на Test считать loss
Его нужно считать на тех значениях, которые подаете во время обучения для контроля процесса. Опять же, можно дополнительно еще посчитать и на Test. Эта переменная для вас, а не для обучения, так что как вам удобнее, интереснее и проще, так и делайте.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Кстати а зачем так?
Сообщение от YagDen
корень(loss) / n (n - количество обучающих пар).
Это минимизируемая функция (см. формулу выше). Ее мы уменьшаем. Можете и с модулем брать, она тоже будет давать схожий результат, но в данном случае это уже не корректно с точки зрения математики.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
А примеры нужно перемешивать если сгенерированы в массиве перед каждой эпохой?
Хуже не будет, но работать будет и так. По крайней мере, с не рекуррентными сетями.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
30.09.2019, 00:05
Задаю веса нейросети слайдерами от -1 до 1 для теста, функция что рисует нейросеть очень слабо реагирует на изменение весов, X от -1 до 1, фактически всегда горизонтальная прямая. Тут ошибки нет?
Цитата Сообщение от YagDen Посмотреть сообщение
Прямое распространение:
s1 = w1 * x + w3;
o1 = sig(s1)
s2 = w2 * x + w4
o2 = sig(s2)
s3 = w5 * o1 + w6 * o2
o3 = sig(s3)
Название: ScreenShot00099.jpg
Просмотров: 53

Размер: 12.7 Кб
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
30.09.2019, 00:46
по памяти сделал тоже самое что и у вас.
s1=x*w1+1*w3
o1=sig(s1)
s2 = x*w2+1*w4
o2=sig(s2)
s3= o1*w5+ o2*w6
o3= sig(s3)
может мало нейронов?

Сейчас выглядит как сеть с 3 нейронами вообще не имеет потенциала аппроксимировать параболу…
Простейшая нейронная сеть для аппроксимации параболы
9 нейронов что ли было…а веса много больше -1…1.
0
1 / 1 / 0
Регистрация: 06.02.2019
Сообщений: 217
30.09.2019, 01:22
Добавлено через 9 минут
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Задаю веса нейросети слайдерами от -1 до 1 для теста, функция что рисует нейросеть очень слабо реагирует на изменение весов, X от -1 до 1, фактически всегда горизонтальная прямая. Тут ошибки нет?
Почему веса от -1 до 1? Если вы не запускаете обратное распространение ошибки, а настраиваете веса вручную, то весовые коэффициенты могут принимать любые значения. Особенно, коэффициенты входного параметра: w1 и w2. Либо нормируйте X т.е. приведите его к диапазону от -1 до 1, либо увеличьте диапазон изменения весов. Хотя бы от -50 до 50. Может больше. Без градиентного спуска трудно сказать, какие значения они будут принимать.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
30.09.2019, 10:03
YagDen, а у вас получилось обучить этой параболе?
Покажите веса? Может у меня где-то косяк? Пробовал уже разные скорости и пределы весов. Все бесполезно. Количество обучающих примеров это итерации, а количество проходов по примерам это эпохи. Так?

1)При таскании слайдерами всех весов вручную с пределами -10 10 выглядит как нейросеть физически не способна описывать такую параболу где
X от 0 до 1,
Y от 0 до 1.
Может неправильное количество нейронов\ архитектура сети?

2)Функция активации сигмоида
1 / (1 + exp(-x))
Имеет близкий к линейному участок не на интервале Y=0 до Y=1 а
Y=0.34 Y=0.66

Что может сильно замедлять обучение, может правильно подкорректировать функцию параболы f(x) так чтобы она была от X=0.34 до X=0.66?
Может неудобное для сети задание f(x)?


3)Может неправильно генерировать примеры обучения где получаем рандом вектора на параболе?
Подавать всегда случайно выбранное f(x) в 10 точках с равномерным шагом на параболе?
Может неправильное обучение?


4)
Цитата Сообщение от YagDen Посмотреть сообщение
После каждой эпохи лосс по желанию можно выводить
Это самый главный критерий идет ли обучение или нет.

Цитата Сообщение от YagDen Посмотреть сообщение
Эпох для такой сети нужно хотя бы 5000000. Чем больше, тем лучше.
Не имеет смысла. Без просмотра графика ошибки по эпохам в 99.99% случаях сеть просто не учиться. Попадает в локальный минимум и все, обучение бесполезно. Даже больше, хватает 20 эпох по 100 итераций чтобы увидеть что застряла или меньше, тяжело это угадать. Может где то ошибка?

5) Несколько раз попадались хорошие аппроксимации очень малого куска параболы,
Выглядит как алгоритм постоянно падает в локальный минимум скорость нахождения которого сильно нелинейная функция от скорости обучения и случайной удачи в выборе как пределов весов так и их значений. Выглядит больше как издевательство а не обучение.

Я бы сказал что это корректней назвать не обучение а нелинейная оптимизация в поиске 7 неизвестных параметров(скорость обучения, все начальные веса). Целевая функция это скорость уменьшения ошибки.
Получается поиск нелинейной целевой только параметров чтобы запустить поиск другой целевой минимума ошибок аппроксимации…
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
30.09.2019, 11:12
Вручную, пределы весов -20 20
Название: ScreenShot00103.jpg
Просмотров: 50

Размер: 7.3 Кб
Название: ScreenShot00101.jpg
Просмотров: 50

Размер: 7.2 Кб
Поведение НС настолько нелинейно что тут даже грубым перебором сложно найти будет экстремум, что говорить о градиенте… и всяких там улучшениях типа момента.
Исключительно плохая математическая модель. Напрашивается мысль что сама изначальная идея создания нейросети это просто специальный прикол плохого математика.
0
47 / 15 / 1
Регистрация: 26.08.2017
Сообщений: 162
30.09.2019, 13:41
Цитата Сообщение от Excalibur921 Посмотреть сообщение
А почему ей не быть актуальной?
Темы на форуме не только для ТС, а и для всех пользователей и гостей т.е. для создания интересного контента привлекающего людей. Наверняка найдется 100500 чел которые заходят сделать работающий пример. Скорей всего так будет и через 10 лет…
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Вручную, пределы весов -20 20
Поведение НС настолько нелинейно что тут даже грубым перебором сложно найти будет экстремум, что говорить о градиенте… и всяких там улучшениях типа момента.
Исключительно плохая математическая модель. Напрашивается мысль что сама изначальная идея создания нейросети это просто специальный прикол плохого математика.
По 10-ти точкам:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            int N = 11;
            double[][] inputs= new double[N][];
            double[][] outputs= new double[N][];
            int j = 0;
            for (double i = -5; i <= 5; i+=1)
            {
                inputs[j]= new[] {i};
                outputs[j] = new[] { i*i };
                j++;
            }
 
 
            var ml = new MlpC(new[] {1, 2, 1}, 0.001, 0.1, 10000, "tanh", "none");
            ml.Learn(inputs,outputs);
            var predict = ml.Predicts(inputs);
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
30.09.2019, 15:00
danila_zaytcev, Эти формулы правильные? Где же ошибка?
Простейшая нейронная сеть для аппроксимации параболы
Ну почему не получается уже с попытки 985 =)).
Напишите свои формулы вот в этом стиле выше просто текст без всяких Latex.
Какие у вас веса нашлись? А почему у вас активация тангенс а строит ломанную?
Какая инициализация весов, сколько примеров в эпохе.
0
1 / 1 / 0
Регистрация: 06.02.2019
Сообщений: 217
30.09.2019, 17:23
Цитата Сообщение от Excalibur921 Посмотреть сообщение
YagDen, а у вас получилось обучить этой параболе?
Покажите веса? Может у меня где-то косяк? Пробовал уже разные скорости и пределы весов. Все бесполезно.
Я пробовал поднять свою старую нейронку с универа. Она обучилась. Так что сама методика рабочая. Правда, там биполярный сигмоид, а не логистический. Со своими формулами я не пробовал, сейчас попробую, отпишусь.
Цитата Сообщение от danila_zaytcev Посмотреть сообщение
Напрашивается мысль что сама изначальная идея создания нейросети это просто специальный прикол плохого математика.
Не расстраивайтесь так. Нейронка - штука хорошая. Лично могу подтвердить. Но обучать действительно не всегда просто.
0
47 / 15 / 1
Регистрация: 26.08.2017
Сообщений: 162
30.09.2019, 17:59
Цитата Сообщение от Excalibur921 Посмотреть сообщение
danila_zaytcev, Эти формулы правильные? Где же ошибка?
Простейшая нейронная сеть для аппроксимации параболы
Ну почему не получается уже с попытки 985 =)).
Напишите свои формулы вот в этом стиле выше просто текст без всяких Latex.
Какие у вас веса нашлись? А почему у вас активация тангенс а строит ломанную?
Какая инициализация весов, сколько примеров в эпохе.
Ошибки искать лень, может позже...

Конфигурация сети после инициализации весов:
Layer0 : N0 : w0: 0.736 w1: 0.088 out: 0 err: 0 N1 : w0: 0.873 w1: -0.103 out: 0 err: 0
Layer1 : N0 : w0: -0.056 w1: 0.24 w2: -0.562 out: 0 err: 0

После обучения:
Layer0 : N0 : w0: 0.824 w1: 2.835 out: 1 err: 0.0004 N1 : w0: 0.833 w1: -2.892 out: 0.855 err: -3.6
Layer1 : N0 : w0: -12.5 w1: 12.495 w2: 26.193 out: 24.379 err: -0.326

10000 эпох по 11 примеров, лернрэйт 0.001

"ломаная" так как 11 точек всего, между точками линейная интерполяция, если будет 1000 точек будет всё очень гладенько.

код:
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
void mlp2Forward(mlp2* mlp, double input[])
{
    for (int l = 0; l < mlp->layerCount; ++l)
    {
        mlp->Inputs[l] = input;
        for (int n = 0; n < mlp->neuronsCount[l]; ++n)
        {
            int wcount = mlp->weightCount[l] - 1;
            double out = 0;
            for (int w = 0; w < wcount; ++w) out += mlp->Weigthts[l][n][w] * input[w];
            out += mlp->Weigthts[l][n][wcount];
            out = mlp->af.f(out);
            mlp->Out[l][n] = out;
            mlp->Drv[l][n] = mlp->af.df(out);
        }
        input = mlp->Out[l];
    }
}
 
void mlp2Backward(mlp2* mlp, double* output)
{
    int last = mlp->layerCount - 1;
    for (int n = 0; n < mlp->neuronsCount[last]; ++n)
    {
        mlp->Err[last][n] *= mlp->moment;
        mlp->Err[last][n] += (output[n] - mlp->Out[last][n])*mlp->Drv[last][n] * (1.0 - mlp->moment);
    }
 
    for (int l = last - 1; l >= 0; --l)
    {
        for (int n = 0; n < mlp->neuronsCount[l]; ++n)
        {
            double backProp = 0;
            for (int w = 0; w < mlp->neuronsCount[l + 1]; ++w)
                backProp += mlp->Weigthts[l + 1][w][n] * mlp->Err[l + 1][w];
 
            mlp->Err[l][n] = backProp * mlp->Drv[l][n];
        }
    }
}
 
void mlp2Update(mlp2* mlp)
{
    for (int l = 0; l < mlp->layerCount; ++l)
    {
        for (int n = 0; n < mlp->neuronsCount[l]; ++n)
        {
            double G = mlp->Err[l][n] * mlp->leanRate;
            for (int w = 0; w < mlp->weightCount[l] - 1; ++w)
                mlp->Weigthts[l][n][w] += mlp->Inputs[l][w] * G;
 
            mlp->Weigthts[l][n][mlp->weightCount[l] - 1] += G;
        }
    }
}
 
void mlp2Learn2(mlp2* mlp, double** inputs, double** outputs, int length)
{
    for (int e = 0; e < mlp->epohs; ++e)
    {
        for (int i = 0; i < length; ++i)
        {
            int index = rnd_int(0, length - 1);
            mlp2Forward(mlp, inputs[index]);
            mlp2Backward(mlp, outputs[index]);
            mlp2Update(mlp);
        }
    }
}
Добавлено через 6 минут
Цитата Сообщение от YagDen Посмотреть сообщение
Не расстраивайтесь так. Нейронка - штука хорошая. Лично могу подтвердить. Но обучать действительно не всегда просто.
Рекомендую просмотреть курс Воронцова, там есть про нейросети.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
30.09.2019, 19:07
А кто из них кто w1,w2,w3,w4,w5,w6?
Что это w2: -0.562 (w??) вес w7 как это?
Layer0 :
N0 :
w0: 0.736 (w1)
w1: 0.088 (w3)
out: 0 err: 0
N1 :
w0: 0.873 (w2)
w1: -0.103 (w4)
out: 0 err: 0

Layer1 :
N0 :
w0: -0.056 (w5)
w1: 0.24 (w6)
w2: -0.562 (w??)
out: 0 err: 0

Цитата Сообщение от danila_zaytcev Посмотреть сообщение
10000 эпох по 11 примеров, лернрэйт 0.001
Обучение это 2д вектора на параболе из X рандом от 0 до 1 и Y=f(x)?
Или это 2д вектора из 10 точек с постоянным шагом 0.1 по X и Y=f(x) которые просто перемешиваются на новой эпохе?
Так:
X=0.0 Y=f(X)
X=0.1 Y=f(X)
X=0.2 Y=f(X)
….
X=1.0 Y=f(X)

Цитата Сообщение от danila_zaytcev Посмотреть сообщение
Ошибки искать лень, может позже
Там 17 строк.

Добавлено через 37 минут
danila_zaytcev, У вас другое устройство сети. Это нейрон смещения?
Обозначают вроде bias
bias = w7 //нейрон смещения
тогда нейросеть такая?
s1=x*w1+1*w3
o1=sig(s1)
s2 = x*w2+1*w4
o2=sig(s2)
s3= o1*w5+ o2*w6+ bias
o3= sig(s3)
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
30.09.2019, 20:26
попробовал так:
w0: 0.736 (w1)
w0: 0.873 (w2)
w1: 0.088 (w3)
w1: -0.103 (w4)
w0: -0.056 (w5)
w1: 0.24 (w6)
w2: -0.562 (w7)
sig(x)=tanh(x)
o3(x)= sig(sig(x*w1+1*w3)*w5+ sig(x*w2+1*w4)*w6+ w7)
опять не рисует параболу.
Название: ScreenShot00109.jpg
Просмотров: 50

Размер: 8.9 Кб
Значит веса выше у меня напутаны или функция НС неправильная.
С гиперболическим тангенсом сеть намного резвей чем сигмоида.
Веса хорошо влияют на форму кривой НС.

А нельзя сделать код без специфических команд на СИ указателей и ссылок?

Понятия не имею что это:
Строка№ 1. void mlp2Forward(mlp2* mlp, double input[])
Указатель что ли и массив.

Строка№ 3. for (int l = 0; l < mlp->layerCount; ++l)
Никогда такого не видел. Обычно так
for (int i = 0; i < a; i++)

Строка№ 5. что это за команда? mlp->Inputs[l] = input;
Строка№ 12-14. указатели вроде называют хз =)). Так и не понял эту тему в С++.
out = mlp->af.f(out);
mlp->Out[l][n] = out;
mlp->Drv[l][n] = mlp->af.df(out);
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
30.09.2019, 20:42
Похоже все дело в нейроне смещения, он сильно влияет на форму. Без него никак параболу не сделать там. Даже вручную неплохо решает.
Название: ScreenShot00112.jpg
Просмотров: 49

Размер: 8.0 Кб
YagDen, Можете изменить формулы для учета нейрона смешения w7?
sig(sig(x w1 + w3) w5 + sig(x w2 + w4) w6 + w7)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2019, 20:42

Нейронная сеть для распознавания лиц
Всем привет!) Хочу посоветоватся с людьми которые знакомы с нейронными сетями. Суть дела такова, мне необходимо запрограмировать систему...

Нейронная сеть для распознавания образов
Нужно сделать нейронную сеть для распознавания образов. Кто делал такое? Где проще это делать? Где есть нормальные гайды? Думаю между...

Нейронная сеть для распознавания чисел
так и не нашел полезного гайда по созданию нс. задание такое: написать нейронку, которая может распознавать числа и обучить ее. т.е я...

Нейронная сеть для распознавания чисел
Народ, дано вот такое задание: Создать нейронную сеть для распознавания десяти чисел, по одному из следующих методов: 1) Трехслойная...

Нейронная сеть для сайта Asp.net
Подскажите, надо для учебы разместить нейронную сеть(любую) на сайте. Можете подкинуть какую-нибудь литекратуру для этого. Сайт обычный...


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

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru