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

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

08.05.2019, 16:18. Показов 21180. Ответов 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
3129 / 1719 / 273
Регистрация: 19.02.2010
Сообщений: 4,511
18.05.2019, 09:02
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от tur9 Посмотреть сообщение
Путь ясен, можете сами попробовать
Ох, чувствую я, что обожрусь попкорном, наблюдая длинный сериал

Ибо забавные у Вас выходят размышления:
1) Правильно считать градиент Вы не научились - но для обучения нейронки хотите перейти к методам использования вторых производных. Видимо, с Вашей точки зрения, их правильно посчитать - проще Но почему-то забываете (или не увидели в формулах), что по прежнему надо будет считать-использовать вектор градиента.
2) Желание взять более быстро сходящиеся методы оптимизации (из-за надуманной проблемы якобы медленного обучения "простыми" методами) - видимо, Вы ещё не знаете о том факте, что решение СЛАУ или обращение матрицы выполняется за
https://www.cyberforum.ru/cgi-bin/latex.cgi?N^3 вычислительных операций. И этот эн-куб будет возникать на каждой эпохе обучения сети. Т.е., может, и удастся обойтись меньшим числом итераций=эпох, но эти итерации станут сильно более "тяжёлыми".
3) Исходя из предыдущего пункта - полный и беспросветный тупик любому увеличению размеров нейросетки сильно выше сотни нейронов (цифра чисто как ориентир порядка величины). Ибо в матрицах из нескольких тысяч столбцов на несколько тысяч строк (матрица же выйдет по числу синапсов в сети - а не нейронов) начнёте огребать вычислительные проблемы с накоплением ошибок округления, надо будет от "наивных" методов решения СЛАУ или обращения матриц переходить к специально созданным для решения задач большой размерности.

В итоге в совокупности прогнозирую вот это:
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
18.05.2019, 21:11  [ТС]
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
1) Правильно считать градиент Вы не научились - но для обучения нейронки хотите перейти к методам использования вторых производных. Видимо, с Вашей точки зрения, их правильно посчитать - проще Но почему-то забываете (или не увидели в формулах), что по прежнему надо будет считать-использовать вектор градиента.
Конечно увидел что надо будет использовать вектор градиента, но не вижу ошибки в моих вычислениях его.
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
2) Желание взять более быстро сходящиеся методы оптимизации (из-за надуманной проблемы якобы медленного обучения "простыми" методами) - видимо, Вы ещё не знаете о том факте, что решение СЛАУ или обращение матрицы выполняется за вычислительных операций. И этот эн-куб будет возникать на каждой эпохе обучения сети. Т.е., может, и удастся обойтись меньшим числом итераций=эпох, но эти итерации станут сильно более "тяжёлыми".
Желание вычислять с помощью вторых производных вызвано тем, что матлаб именно так и делает в подобных случаях.
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
3) Исходя из предыдущего пункта - полный и беспросветный тупик любому увеличению размеров нейросетки сильно выше сотни нейронов (цифра чисто как ориентир порядка величины). Ибо в матрицах из нескольких тысяч столбцов на несколько тысяч строк (матрица же выйдет по числу синапсов в сети - а не нейронов) начнёте огребать вычислительные проблемы с накоплением ошибок округления, надо будет от "наивных" методов решения СЛАУ или обращения матриц переходить к специально созданным для решения задач большой размерности.
Да, есть такая проблема, но она в будущем толи может возникнуть толи нет этого я сейчас не вижу. Кроме того я не вижу другого пути, не вижу своих ошибок как в вычислении градиента так и в обратном распространении ошибки. Если увижу что то, то непременно исправлю. А пока что, увы, это моя ситуация, я новичок в нс, делаю первые шаги, ошибаюсь, не вижу своих ошибок и рассчитываю на помощь старших товарищей и не понимаю почему все идет так тяжело.
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
21.05.2019, 13:18  [ТС]
Вот ход моих мыслей. Прямую линию одним нейроном аппроксимировать научился, перешел к параболе из 9-ти точек. А не попробовать ли аппроксимировать три точки? Так и сделал:

Кликните здесь для просмотра всего текста
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
44
45
46
47
48
49
50
51
52
53
54
55
function targ_two_2n_3p_forforum
% задача получить на выходе сети
% с двумя нейронами и сумматором
% три заданные точки y при трех
% заданных точках x
% ф-ции активации два сигмойда
% y = w5*f(xw1+w3)+w6*f(xw2+w4)
x = [0.1 0.5 0.9]'; y = (2*x - 1).^2 + 0.1;
w = 10*rand(6,1) - 5; y1 = ynet(x, w);
N = 4000; a = a_by_num(N);
for i = 1:N
  [d d1 d2 j] = maxerr(w, x, y);
  [f1 df1 f2 df2] = f_df(w, x(j));
  dw = d_w(d,d1,d2,f1,df1,f2,df2,x(j));
  w = w + a(i)*dw;
end
end
 
function [d d1 d2 i] = maxerr(w, x, y)
y1 = ynet(x, w); err = y - y1; 
[val i] = max(abs(err));
d = err(i); d1 = d*w(5); d2 = d*w(6);
end
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 dw = d_w(d,d1,d2,f1,df1,f2,df2,x)
dw(1,1) = d1*df1*x;
dw(3,1) = d1*df1*1;
dw(2,1) = d2*df2*x;
dw(4,1) = d2*df2*1;
dw(5,1) = d*f1;
dw(6,1) = d*f2;
end
function [f1 df1 f2 df2] = f_df(w, x)
s1 = x*w(1)+w(3); f1 = smd(s1); df1 = dsm(s1);
s2 = x*w(2)+w(4); f2 = smd(s2); df2 = dsm(s2);
end
function f = smd(x)
f = 1./(1+exp(-x));
end
function df = dsm(x)
f = smd(x); df = f.*(1-f);
end
function a = a_by_num(N)
i = 1:N; a = (0.00025*i).^2 + 1; a = a';
end

и вот что получил: https://youtu.be/X5J0EQSgho4
Эта программка targ_two_2n_3p_forforum по случайным весам w создает случайную ломаную y1 и находит максимальную абсолютную ошибку (от трех заданных красных точек параболы). maxerr возвращает ошибки d d1 d2 и индекс этой точки j (1, 2 или 3). Только для этой точки j ф-ция f_df вычисляет выходы нейронов (f1 f2) и их производные (df1 df2). Ф-ция d_w вычисляет значения добавок для каждого веса (массив dw). Скорость обновления весов (массив а) я сделал параболически возрастающей (ф-ция a_by_num). При 4000 итераций максимальной отклонение менее 0.01. После обновления весов (строка 15) ф-ция по новым весам находит новую ломаную y1 = ynet(x, w); (эта ф-ция внутри maxerr), новую максимальную ошибку и ее индекс j.

Если получил это для трех точек, то почему бы это не попробовать для 9-ти точек параболы. Всего то надо заметить в строке 8 в коде x = (0.1:0.1:0.9)'; Тогда можно увидеть нечто подобное:https://youtu.be/-gqixOw7Jcs При том же количестве итераций абсолютное значение максимальной ошибки в данном случае менее 0.03

Оказывается то же самое можно делать не только для точки с максимальной ошибкой, но с любой случайной данной точкой.

Интересно что массив dw это то же самое что и производная ф-ции ошибки сети dE, где Е = 0.5*(y1 - y), где y = w5*f(xw1+w3)+w6*f(xw2+w4), y1 - значение y для конкретных весов w. А главная ошибка моих предшествующих программ была в том что искал эту dE для всех точек (x, y), а следовало ее искать для одной конкретной точки(xi, yi).

Ясно что это только начало, что малая ошибка достигнута силой, а не умом. Теперь следует подключить сюда оптимизацию второго порядка.
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
18.06.2019, 16:31  [ТС]
Мне удалось научить сеть методом Левенберга-Марквардта. На сей день пока сети однослойные.
Вот код для двух нейронов
Кликните здесь для просмотра всего текста
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
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
function targ_levenberg
global ww ndw ndE; ww = []; ndw = []; ndE = [];
[x y w h i] = start; b = 200;
j = 1; mov(j,1) = getframe(gcf);
err = []; m = 0.0001; E = eye(6);
while 1
  [dE J] = grad_and_jac(w, x, y);
  n =  norm(dE);
  if 10^(-5) < n
    [w er m] = one_step(E, dE, J, w, x, y, m);
  else
    [w er] = naiskor_spusk(dE/n, w, x, y);
  end
  if er < 1.2*10^(-3)
    break
  end
  j = j + 1; mov(j,1) = getframe(gcf);
  h = draw_h(w, x, h, i, er);
  err = [err; er];
  if mod(i,b)== 0
    disp(i)
  end
  i = i + 1;
end
save_video(mov)
end
function [dE J] = grad_and_jac(w, x, y)
global ndE
J = jacobi_matrix(w, x);
y1 = ynet(x, w); d = y1 - y;
dE = (d'*J)'; ndE = [ndE; norm(dE)];
end
function [w er1 m] = one_step(E,dE,J,w,x,y,m)
global ww ndw % J2 = hessian2n(w, x);
er = sumerr(x, y, w);
J2 = J'*J; t = 0; flag = 0;
while 1
  H = J2 + m*E; t = t + 1;
  H1 = H^(-1); dw = H1*dE; 
%   while norm(dw) < 0.001
%     dw = 10*dw;
%   end
  w1 = w - dw; 
  er1 = sumerr(x, y, w1);
  if er < er1
    m = 2*m; flag = 1;
  else
    w = w1; ww = [ww w];
    ndw = [ndw; norm(dw)];
    if flag 
      m = m/2;
    end
    break
  end
end
end
% ============================================
function [w er] = naiskor_spusk(dE, w, x, y)
a = 0.1; er1 = sumerr(x, y, w);
while 1
  w1 = w - a*dE;
  er = sumerr(x, y, w1);
  if er1 < er
    a = a/2;
  else
    w = w1; return
  end
end
end
function save_video(mov)
newVid = VideoWriter('1', 'MPEG-4'); % New
newVid.FrameRate = 10;
newVid.Quality = 100;
open(newVid);
% within the for loop saving one frame at a time
for i = 1:numel(mov)
  writeVideo(newVid,mov(i));
end
close(newVid);
end
 
function [x y w h i] = start
close all; clc; x = (0.1:0.01:0.9)';
y = (2*x - 1).^2 + 0.1; pot(x,y,'.r');
set(gcf,'position',[1680 950 560 420])
N = 100; n = 6; m = 2; k = 10;
[w er] = rand_plus(N, n, m, k, x, y);
y1 = ynet(x, w); h = plot(x,y1,'-w');
str = [num2str(0) '     ' num2str(er)];
title(str); i = 0;
end
 
function [w err] = find_best(ww, x, y)
[r c] = size(ww); er = zeros(c,1);
for i = 1:c
  w = ww(:,i);
  er(i) = sumerr(x, y, w);
end
[err ind] = min(er);
w = ww(:,ind);
end
function [w er] = rand_plus(N, n, m, k, x, y)
ww = m*rand(n,N) - m/2; err = [];
[w er] = find_best(ww, x, y);
for i = 1:k
  m = m - 1/(k);
  A = m*rand(n,N) - m/2;
  ww = repmat(w, 1, N) + A;
  ww = cat(2, w, ww);
  [w er] = find_best(ww, x, y);
  err = [err; er];
end
end
 
function J = jacobi_matrix(w, x)
% матрица Якоби для ф-ции:
% y = w5*f(xw1+w3)+w6*f(xw2+w4) 
J = [];
for i = 1:numel(x)
  s1 = x(i)*w(1)+w(3);
  s2 = x(i)*w(2)+w(4);
  f1 = smd(s1); df1 = dsm(s1);
  f2 = smd(s2); df2 = dsm(s2);
  dy1 = w(5)*x(i)*df1;
  dy2 = w(6)*x(i)*df2;
  dy3 = w(5)*df1;
  dy4 = w(6)*df2;
  dy5 = f1;
  dy6 = f2;
  df = [dy1 dy2 dy3 dy4 dy5 dy6];
  J = [J; df];
end
end

не указанные в этом коде функции приведены в предшествующих постах.
Видео работы кода https://www.youtube.com/watch?... e=youtu.be

Функция start возвращает не первую попавшуюся последовательность весов, а немного подправленную: сначала создаю 100 случайных векторов (по 6-ти в каждом векторе). Затем отбираю наилучший, затем еще некоторые преобразования, уличшения его. (не пишу об этом подробно поскольку вряд ли это кому то нужно, да и в дальнейшем в других сетях с ростом числа нейронов этот механизм не нужен, т.е. и без него все работает)
0
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,820
18.06.2019, 20:29
А я так и не понял, а что MLP не справился с параболой?
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
18.06.2019, 21:38  [ТС]
Цитата Сообщение от Mikhaylo Посмотреть сообщение
А я так и не понял, а что MLP не справился с параболой?
До MLP руки не дошли. Зачем MLP когда один слой справляется и не только с параболой? Моя цель была научиться обучать простейшие НС. Это я сделал в первом приближении. Теперь перехожу к своей основной задаче: на изображении по куску контура падающих таблеток находить их центр. Может второй слой понадобится, а может и нет. У вас есть на этот счет соображения?
0
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,820
19.06.2019, 04:59
Задача нечетко поставлена, хз.
0
3129 / 1719 / 273
Регистрация: 19.02.2010
Сообщений: 4,511
19.06.2019, 10:07
Ну, проще же от нейронки потребовать хз что - чем самостоятельно и явно, например, с помощью метода наименьших квадратов, решить задачу аппроксимации набора точек контура эллипсом.
Ну, или преобразование Хафа использовать для поиска эллипсов / частей эллипсов. Сколько там получается у преобразования параметров - 5 (икс, игрек, угол поворота, размеры по большой и по малой оси)? Тяжело же в пространстве такой размерности перебирать комбинации, а затем искать экстремумы
0
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,820
19.06.2019, 16:05
Цитата Сообщение от tur9 Посмотреть сообщение
Может второй слой понадобится, а может и нет.
Слои чего? MLP?
Первый слой научится лишь окружать точки точно в определенных координатах изображения, понадобятся еще слои, которые будут обобщать первичные данные. MLP чувствителен к положению и размерам объектов на изображении, CNN менее чувствителен, но тоже не ахти. Самое забавное, что вы хотите алгоритм, который собственно должен измерять положение тех самых объектов. То есть эта парочка вам не подходит. А вы про одноклеточные нейронки...
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
19.06.2019, 18:09  [ТС]
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Ну, проще же от нейронки потребовать хз что - чем самостоятельно и явно, например, с помощью метода наименьших квадратов, решить задачу аппроксимации набора точек контура эллипсом.
Это я уже сделал и работает, но не во всех случаях и получилось громоздко. Посоветовали то же самое сделать через НС.
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Слои чего? MLP?
Первый слой научится лишь окружать точки точно в определенных координатах изображения, понадобятся еще слои, которые будут обобщать первичные данные.
Контуры у меня уже есть. Но не у каждого объекта они замкнуты. Есть обрывки контуров, которые надо собирать, относить к верному объекту.

Я почти всегда стараюсь упростить задачу. Начал с простейшей НС из двух нейронов. А вот как работает сеть с одним слоем в котором 20 нейронов https://www.youtube.com/watch?... e=youtu.be
Вот такую сложную функцию легко аппроксимирует. Там уже через матрицы все сделал. Код не привожу, т.к. он видимо никого не интересует.

Цитата Сообщение от Mikhaylo Посмотреть сообщение
Задача нечетко поставлена, хз.
Поставим ее четко предельно упростив. На единичном квадрате даны четыре окружности (каждая радиуса 0.1). На каждой окружности отмечены 8 точек. Набираем по три последовательные точки с каждой окружности. Всего в одной окружности будет 8 троек. В 4-х окружностях 32 тройки и у каждой тройки свой центр окружности.
Данные для тренировки сети: x1 x2 x3 y1 y2 y3 xo yo - восемь чисел. Таких строк 32.

Сеть должна по заданным трем точкам находить центр окружности.
Такая сеть сгодится или нужно соединить x и y?
Миниатюры
Простейшая нейронная сеть для аппроксимации параболы   Простейшая нейронная сеть для аппроксимации параболы  
0
820 / 579 / 75
Регистрация: 20.09.2014
Сообщений: 3,820
19.06.2019, 19:36
Так в этой задаче центр можно находить по одной точке... зачем три точки?
0
3129 / 1719 / 273
Регистрация: 19.02.2010
Сообщений: 4,511
19.06.2019, 20:07
Цитата Сообщение от tur9 Посмотреть сообщение
Набираем по три последовательные точки с каждой окружности.
В реальной задаче с падающими таблетками Вы не сможете быть уверены, что возьмёте 3 точки с контура ОДНОЙ таблетки.

Если только у Вас таблетки не падают настолько редко, что в кадре НИКОГДА не могут контачить друг с другом.
Но тогда Вы страдаете фигнёй - нафиг поиск контуров, нафиг нейросетки, можно просто на контрастном фоне искать области пикселов другого цвета (таблеточные). И затем простое вычисление среднего координат пикселов в каждой несвязной области сразу даст Вам центр соответствующей таблетки независимо от её поворота (хоть по оси на неё будете смотреть, хоть под углом, хоть с ребра).
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
19.06.2019, 21:45  [ТС]
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Так в этой задаче центр можно находить по одной точке... зачем три точки?
Эта задача в том чтобы для любых трех последовательных точек захватывающих четверть круглого контура на единичном квадрате находить центр. По одной или двум точкам это невозможно сделать однозначно. Не только для этих четырех окружностей, но для любых окружностей радиуса 0.1 на единичном квадрате находить центр.
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
В реальной задаче с падающими таблетками Вы не сможете быть уверены, что возьмёте 3 точки с контура ОДНОЙ таблетки.
Конечно.
Таблетки падают соприкасаясь друг с другом, контуры случаются разорванными. Поэтому задача в том чтобы как минимум по четверти контура находить центр тела. Если для двух кусков их найденные центры окажутся близки - значит эти куски принадлежат одному объекту. Если же уже есть скажем 3/4 или более контура, то ясно что ни НС ни аппроксимация не нужны, достаточно среднего значения. Центр тел нужен не только для объединения отдельных дуг, но и для отслеживания падающих тел между соседними фреймами.
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
20.06.2019, 07:54  [ТС]
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
В реальной задаче с падающими таблетками Вы не сможете быть уверены, что возьмёте 3 точки с контура ОДНОЙ таблетки.
Ситуация такова что контуры разбиты на дуги, причем каждая дуга (как правило, почти всегда) принадлежит одной таблетке. Не двум.
0
47 / 15 / 1
Регистрация: 26.08.2017
Сообщений: 162
20.06.2019, 17:54
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Желание взять более быстро сходящиеся методы оптимизации (из-за надуманной проблемы якобы медленного обучения "простыми" методами) - видимо, Вы ещё не знаете о том факте, что решение СЛАУ или обращение матрицы выполняется за
вычислительных операций. И этот эн-куб будет возникать на каждой эпохе обучения сети. Т.е., может, и удастся обойтись меньшим числом итераций=эпох, но эти итерации станут сильно более "тяжёлыми".
Не очень уж это сложно Виктор Генадиевич. Вы как всегда преувеличиваете и вводите народ в заблуждение.

Внимательно наблюдаем за ловкостью рук:
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
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
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sys.h"
#include "matrix.h"
 
 
 
mat* mat_new(int rows, int colls)
{
    double **data = malloc(rows * sizeof(double*));
    for (int i = 0; i < rows; ++i) data[i] = calloc(colls, sizeof(double));
    mat tmp = { data,rows,colls };
    return localcpy(&tmp, sizeof(mat));
}
 
void mat_del(mat* m)
{
    for (int i = 0; i < m->rows; ++i) free(m->data[i]);
    free(m->data);
    free(m);
}
 
mat* mat_transp(mat* m)
{
    mat *res = mat_new(m->colls, m->rows);
    for (int i = 0; i < m->rows; ++i)
        for (int j = 0; j < m->colls; ++j)
            res->data[j][i] = m->data[i][j];
 
    return res;
}
 
mat* mat_pw(mat* m1, mat* m2, double f(double, double))
{
    mat *res = mat_new(m1->colls, m1->rows);
    for (int i = 0; i < m1->rows; ++i)
        for (int j = 0; j < m1->colls; ++j)
            res->data[i][j] = f(m1->data[i][j], m2->data[i][j]);
 
    return res;
}
 
mat* mat_fromvec(double* vec, int len)
{
    mat* m = mat_new(len, 1);
    for (int i = 0; i < len; ++i) m->data[i][0] = vec[i];
    return m;
}
 
mat* mat_mult(mat* m1, mat* m2)
{
    mat *res = mat_new(m1->colls, m1->rows);
    for (int i = 0; i < m1->rows; ++i)
    {
        for (int j = 0; j < m1->colls; ++j)
        {
            double p = 0;
            for (int k = 0; k < m1->colls; ++k)
                p += m1->data[i][k] * m2->data[k][j];
 
            res->data[i][j] = p;
        }
    }
    return res;
}
 
void mat_multvec(double* v, mat* m, double* res)
{
    int l = _msize(v) / sizeof(double);
    for (int i = 0; i < m->rows; ++i)
    {
        res[i] = 0;
        for (int j = 0; j < m->colls; ++j)
        {
            double c = j < l ? v[j] : 1;
            res[i] += c * m->data[i][j];
        }
    }
}
 
mat* mat_copy(mat* m)
{
    mat* res = mat_new(m->rows, m->colls);
    for (int i = 0; i < m->rows; ++i)
        for (int j = 0; j < m->colls; ++j)
            res->data[i][j] = m->data[i][j];
 
    return res;
}
 
mat* mat_one(mat* m)
{
    mat* res = mat_new(m->rows, m->colls);
    for (int i = 0; i < m->rows; ++i)
    {
        for (int j = 0; j < m->colls; ++j)
        {
            if (i == j) res->data[i][j] = 1;
            else  res->data[i][j] = 0;
        }
    }
    return res;
}
 
void mat_print(mat *m)
{
    for (int i = 0; i < m->rows; ++i)
    {
        for (int j = 0; j < m->colls; ++j)
            printf("%f\t", m->data[i][j]);
 
        printf("\n");
    }
}
 
double mat_det(mat* m)
{
    mat* tmp = mat_copy(m);
 
    for (int x = 1; x < m->rows; ++x)
    {
        int x1 = x - 1;
        for (int i = x; i < m->rows; ++i)
        {
            double k = tmp->data[i][x1] / tmp->data[x1][x1];
            for (int j = 0; j < m->colls; ++j)
                tmp->data[i][j] -= tmp->data[x1][j] * k;
        }
    }
 
    double det = 1;
    for (int i = 0; i < m->rows; ++i)
        for (int j = 0; j < m->colls; ++j)
            if (i == j) det *= tmp->data[i][j];
 
    mat_del(tmp);
 
    return  det;
}
 
double mat_minor(mat* m, int mi, int mj)
{
    mat *minor = mat_new(m->rows - 1, m->colls - 1);
 
    for (int i = 0; i < m->rows; ++i)
    {
        for (int j = 0; j < m->colls; ++j)
        {
            if (i != mi && j != mj)
            {
                int ii = i < mi ? i : i - 1;
                int jj = j < mj ? j : j - 1;
                minor->data[ii][jj] = m->data[i][j];
            }
        }
    }
 
    double det = mat_det(minor);
    mat_del(minor);
    return det;
}
 
mat* mat_inverse(mat* m)
{
    mat* adds = mat_new(m->rows, m->colls);
    for (int i = 0; i < m->rows; ++i)
    {
        for (int j = 0; j < m->colls; ++j)
        {
            int k = ((i % 2) ^ (j % 2)) ? -1 : 1;
            adds->data[i][j] = k * mat_minor(m, i, j);
        }
    }
 
    mat* tadds = mat_transp(adds);
    mat_del(adds);
    double det = mat_det(m);
    mat* res = mat_new(m->rows, m->colls);
 
    for (int i = 0; i < m->rows; ++i)
        for (int j = 0; j < m->colls; ++j)
            res->data[i][j] = tadds->data[i][j] / det;
 
    mat_del(tadds);
 
    return res;
}
 
void mat_test()
{
    int N = 3;
    mat *m = mat_new(N, N);
    double v1[] = { 2,5,7 };
    double v2[] = { 6,3,4 };
    double v3[] = { 5,-2,-3 };
    m->data[0] = v1;
    m->data[1] = v2;
    m->data[2] = v3;
 
 
    mat* inv1 = mat_inverse(m);
    mat_print(inv1);
}
0
3129 / 1719 / 273
Регистрация: 19.02.2010
Сообщений: 4,511
20.06.2019, 23:06
Цитата Сообщение от danila_zaytcev Посмотреть сообщение
Внимательно наблюдаем за ловкостью рук:
Ты не шарлатань - а кинь ссылку на официальную публикацию, где утверждается, что нахождение обратной матрицы с помощью алгебраических дополнений имеет сложность меньше, чем эн-куб.
Вариант - кинь такую ссылку для способа вычисления определителя матрицы, если не использовать быстрый (Штрассена, Копперсмита-Винограда и т.д.) алгоритм перемножения матриц.
Да - обязательно для матриц произвольного размера, т.е. не ограничиваясь 3*3. Т.е. чтобы и для 100*100 работало, и для 1000*1000.

А совать в виде доказательства очередной говнокод, в котором даже не проверяется / не обрабатывается возможность деления на ноль (при нулевом определителе матрицы) - не надо
Тем более, что там и в функции вычисления определителя (строка 126) тоже нет проверки деления на ноль - а уж вероятность-то встречи хотя-бы одного нулевого элемента в матрице гораздо выше, чем вероятность встречи матрицы с нулевым определителем
0
47 / 15 / 1
Регистрация: 26.08.2017
Сообщений: 162
21.06.2019, 00:26
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
кинь ссылку на официальную публикацию
не не... публикации это для... ну короче тех кто только и может что читать публикации, больше ничего не в состоянии. Я писал код по памяти как в школьном курсе обращали матрицы, дешево и сердито, работает и со 100 и с 1000 должно, но дольше. Поверять не очень советую, мы же все помним на сколько мой MLP быстрее Вашего)))

Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
говнокод, в котором даже не проверяется / не обрабатывается возможность деления на ноль
проверяют деление на ноль трусы(шутка), действительно надо, спасибо.
0
3129 / 1719 / 273
Регистрация: 19.02.2010
Сообщений: 4,511
21.06.2019, 11:23
Цитата Сообщение от danila_zaytcev Посмотреть сообщение
проверяют деление на ноль трусы(шутка), действительно надо, спасибо.
Да там не только кровати надо переставлять деление на ноль проверять - там девочек весь алгоритм надо менять
Попробуй обратить диагональную матрицу (с любыми рандомными числами на главной диагонали) - узнаешь, где/когда дешёвый-сердитый школьный алгоритм применим.
Давай код, который работает на всех структурах матриц (с любым возможным заполнением нулями - т.е. и диагональных, и блочно-диагональных, и блочных, и просто с нулём в любом элементе) - тогда и поговорим о вычислительной сложности алгоритма, который это делает.


Цитата Сообщение от danila_zaytcev Посмотреть сообщение
на сколько мой MLP быстрее
Напоминаю фрагмент удалённого модератором поста (из другой темы, ЕМНИП).
А именно - векторизация (SIMD-команды, неизвестные софту прошлого тысячелетия) расчётов сама по себе должна была дать прирост в скорости в 4/8 раз (в 8 - если под AVX компилировать и юзать флоаты, а не даблы).
Прошедшее за 20 лет улучшение компиляторов - дополнительный множитель >1.
Так что увы - ты не быстрее, ты максимум дотянул до референсной точки 20летней давности
А уж если вспомнить, что ты упорно пытаешься сравнивать реализации СОВЕРШЕННО РАЗНЫХ АЛГОРИТМОВ (MLP - это не алгоритм, это структура нейросетки, а батч-обучение по направлению, отличному от направления наискорейшего спуска, с адаптивным на каждой эпохе шагом и онлайн-обучение с постоянным неадаптивным шагом- это КАЧЕСТВЕННО РАЗНЫЕ АЛГОРИТМЫ) - то, наверное, неспроста ты так задачу сравнения ставишь Видимо, в одних и тех же рамках тебе ловить совершенно нечего
0
47 / 15 / 1
Регистрация: 26.08.2017
Сообщений: 162
23.06.2019, 16:39
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Да там не только кровати надо переставлять деление на ноль проверять - там девочек весь алгоритм надо менять
Попробуй обратить диагональную матрицу (с любыми рандомными числами на главной диагонали) - узнаешь, где/когда дешёвый-сердитый школьный алгоритм применим.
Давай код, который работает на всех структурах матриц (с любым возможным заполнением нулями - т.е. и диагональных, и блочно-диагональных, и блочных, и просто с нулём в любом элементе) - тогда и поговорим о вычислительной сложности алгоритма, который это делает.
Добавить пару проверок и будет продакшн код. нули на диагонали значит нулевой детерминант, матрица сингулярная, это на скорость ни как не влияет.
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Напоминаю фрагмент удалённого модератором поста (из другой темы, ЕМНИП).
...дополнительный множитель >1.... это КАЧЕСТВЕННО РАЗНЫЕ АЛГОРИТМЫ...
[censored], "батч" по идее должен ускорять Ваш алгоритм, не говоря уже о динамической скорости обучения в зависимости от вторых производных или их фэйков, всё только Вам на руку, а результат -5х что файспалм и эпикфэйл и отмазки про "процессорные команды" совсем уж жалкие, [censored]
0
3129 / 1719 / 273
Регистрация: 19.02.2010
Сообщений: 4,511
23.06.2019, 21:56
Цитата Сообщение от danila_zaytcev Посмотреть сообщение
"батч" по идее должен ускорять
С какого перепугу он это должен?
Ты не фантазируй про "по идее" - а доказывай.

Цитата Сообщение от danila_zaytcev Посмотреть сообщение
не говоря уже о динамической скорости обучения в зависимости от вторых производных или их фэйков
Ну, вот и опять началось враньё.
Доказывай использование вторых производных или любых их оценок (например, левенбергом-марквардтом, в обоих его видах - "наивном" и диагональном ЛеКуновском) в той древней проге.
Более того - доказывай зависимость алгоритма подбора шага обучения (я ведь правильно понимаю слова о "динамической скорости обучения"?) от этих вторых производных.
А когда докажешь - не забудь указать, каков там вклад этих вычислений в общую вычислительную сложность. Может, там вычислений делается в 100 раз больше, чем у тебя?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.06.2019, 21:56

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Установка 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 реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru