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

Проблема с обучением простой нейронной сети методом Левенберга-Марквардта

04.09.2019, 17:22. Показов 6654. Ответов 69

Студворк — интернет-сервис помощи студентам
На простом примере сформулирую свой вопрос. Сеть ниже прекрасно обучается методом Левенберга



Вот процесс обучения https://youtu.be/eL8rE4VMBMA Как видим всего 12 итераций
На вход подаю (с шагом 0.05) 17 точек x = 0.1:0.05:0.9, на выходе надо получить параболу: y = (2*x - 1).^2 + 0.1; (синие точки на видео и в программе).
Программа написана на матлабе специально в упрощенном виде так, чтобы каждый мог ее легко понять.
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function leven_parabola1
E = eye(12); % единичная матрица
[x y u v h] = start;
i = 0;
while 1
  [dE J] = grad_jac(u, v, x, y);
  [er u v] = one_step(E, dE, J, u, v, x, y);
  i = i + 1;
  h = draw(u, v, x, h, i, er); 
  if er < 10^(-4) || 50 < i
  % выход из цикла когда или ошибка меньше 0.0001 или число итераций больше 50
    break
  end
end
end

Опишу подробно каждую функцию.
Кликните здесь для просмотра всего текста
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
function [x y u v h] = start
x = (0.1:0.05:0.9)'; % столбец входных х
y = (2*x - 1).^2 + 0.1; % парабола, которую надо получить на выходе
plot(x, y, '.'); % выводим параболу на график
u = rand(2,4); v = rand(4,1); % генерация двух матриц весов
y1 = fnet(x, u, v);  % функция сети получает значения у через веса сети
h = plot(x,y1,'-w');  % выводим эти значения на график
% h - указатель на линию x,y1 чтобы потом ее можно было стереть
end
function f = fnet(x, u, v)
% функция сети f = v1*f(xu11+u21)+v2*f(xu12+u22)+v3*f(xu13+u23)+v4*f(xu14+u24);
rows = size(x,1);
for i = 1:rows
  x1 = x(i,1);
  s1 = x1*u(1,1) + u(2,1);
  s2 = x1*u(1,2) + u(2,2);
  s3 = x1*u(1,3) + u(2,3);
  s4 = x1*u(1,4) + u(2,4);
  f1 = smd(s1); f2 = smd(s2);
  f3 = smd(s3); f4 = smd(s4);
  f(i,1) = f1*v(1)+f2*v(2)+f3*v(3)+f4*v(4);
end
end
function f = smd(x)
f = 1./(1+exp(-x)); % сигмоид
end
function [dE J] = grad_jac(u, v, x, y)
J = jacobi_mat(u, v, x); % J - матрица Якоби
y1 = fnet(x, u, v); d = y1 - y; % d - столбец разностей
dE = J'*d; % градиент (J' - символ ' - транспонирование матрицы J)
end

Формула для матрицы Якоби



Матрица ниже есть раскрытие матрицы выше.
Многоточие означает дополнительные строки для каждого х. Всего 17 строк.
Кликните здесь для просмотра всего текста
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
function J = jacobi_mat(u, v, x)
% матрица Якоби для функции: y = v11*f1 + v21*f2 + v31*f3 + v41*f4
J = []; n = numel(x); % n - число элементов в массиве х (в данном случае n = 17)
for i = 1:n
  row = one_row(x(i), u, v);
  J = [J; row];
end
end
function row = one_row(x, u, v)
s1 = x*u(1,1)+u(2,1); [f1 df1] = sgm(s1);
s2 = x*u(1,2)+u(2,2); [f2 df2] = sgm(s2);
s3 = x*u(1,3)+u(2,3); [f3 df3] = sgm(s3);
s4 = x*u(1,4)+u(2,4); [f4 df4] = sgm(s4);
 
du11 = v(1,1)*x*df1;
du12 = v(2,1)*x*df2;
du13 = v(3,1)*x*df3;
du14 = v(4,1)*x*df4;
 
du21 = v(1,1)*df1;
du22 = v(2,1)*df2;
du23 = v(3,1)*df3;
du24 = v(4,1)*df4;
 
du = [du11 du12 du13 du14 du21 du22 du23 du24];
 
dv11 = f1; dv21 = f2; dv31 = f3; dv41 = f4;
dv = [dv11 dv21 dv31 dv41];
row = [du dv];
end
function [f df] = sgm(x)
f = 1./(1+exp(-x)); df = f.*(1-f); % сигмоид и его производная
end


Кликните здесь для просмотра всего текста
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
function [er1 u v] = one_step(E, dE, J, u, v, x, y)
er = sumerr(x, y, u, v);
J2 = J'*J; % произведение транспонированной матрицы на себя - аппроксимация матрицы Гессе
m = 0.0001;
while 1
  H = J2 + m*E;
  H1 = H^(-1); % Н1 - обратная матрица к Н
  dw = H1*dE;  % dw - столбец изменения весов
  du = reshape(dw(1:8),4,2); % из первых восьми чисел dw создаем матрицу размером 4х2
  dv = reshape(dw(9:12),4,1); % из элементов с 9 по 12 столбца dw создаем матрицу 4х1
  % обновляем веса
  u1  = u - du'; % здесь транспонирование du необходимо ввиду того что du сейчас 4х2, а u 2х4
  v1 = v - dv;
  er1 = sumerr(x, y, u1, v1); % er1 - новая ошибка при новых весах
  if er < er1
    m = 2*m;
  else
    u = u1; v = v1; break
  end
end
end
function err = sumerr(x, y, u, v)
% err - суммарная ошибка сети при данных u, v
y1 = fnet(x, u, v);
d = y1 - y; err = sum(d.*d);
end

Перехожу к моей проблеме. Рассмотрим похожую сеть с двумя выходами



Каждый выход должен нарисовать свою параболу. Изменения в функциях ниже
Кликните здесь для просмотра всего текста
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
function [x y u v h] = start
x = (0.1:0.05:0.9)'; % входной столбец значений х тот же самый
y1 = (2*x - 1).^2 + 0.1;  % парабола на верхнем выходе
y2 = -3*(x - 0.6).^2 + 0.9; % парабола на нижнем выходе
y = [y1 y2]; % выходной массив у состоит уже из двух столбцов
pot(x,y1,'.'); plot(x,y2,'.k'); % выводим два графика: первый синие точки, второй - черные
 
u = rand(2,4); v = rand(4,2); % матрица весов v состоит уже из двух столбцов
 
f = fnet(x, u, v); % функция сети выдает два столбца
h(1) = plot(x,f(:,1),'-c');
h(2) = plot(x,f(:,2),'-y');
end
function f = fnet(x, u, v)
% y1 = v11*f1 + v21*f2 + v31*f3 + v41*f4
% y2 = v12*f1 + v22*f2 + v32*f3 + v42*f4
rows = size(x,1);
for i = 1:rows
  x1 = x(i,1);
  s1 = x1*u(1,1) + u(2,1);
  s2 = x1*u(1,2) + u(2,2);
  s3 = x1*u(1,3) + u(2,3);
  s4 = x1*u(1,4) + u(2,4);
  f1 = smd(s1);
  f2 = smd(s2);
  f3 = smd(s3);
  f4 = smd(s4);
  f(i,1) = f1*v(1,1)+f2*v(2,1)+f3*v(3,1)+f4*v(4,1);
  f(i,2) = f1*v(1,2)+f2*v(2,2)+f3*v(3,2)+f4*v(4,2);
end
end

Проблема моя в том что я не знаю как посчитать матрицу Якоби для "функции" с двумя выходами. Есть вариант считать последовательно для первого выхода J и dE, и обновлять веса, затем для второго выхода J и dE и обновлять веса. Но этот метод работает не так хорошо как функции net в матлабе. В матлабе эта сеть обучается за 10-30 итераций, а этот способ последовательного обновления дает десятки тысяч итераций.
Можно минимизировать функцию ошибки сети



Но это тоже не работает: https://youtu.be/ekuE5zfobOo
Считал я это так:

Не по теме:

Кликните здесь для просмотра всего текста
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
function [J dE] = grad_jac(u, v, x, y)
f = fnet(x, u, v); d = f - y; % в d здесь два столбца
J = jacobi_matE(x, u, v, d); % матрица Якоби для функции ошибки сети Е
er = sum(d.*d,2);  % один столбец = сумма квадратов двух столбцов d
dE = J'*er; % градиент ?  
end
function J = jacobi_matE(x, u, v, d)
% матрица Якоби для ф-ции:
% E = 1/2*sum[(y1-Y1)^2+(y2-Y2)^2]
% y1 = v11*f1 + v21*f2 + v31*f3 + v41*f4
% y2 = v12*f1 + v22*f2 + v32*f3 + v42*f4
% аналитические выкладки дифференцирования не привожу, но все проверил
% через функцию численного дифференцирования. Результат совпал.
% если нужно могу это все описать подробно
n = numel(x); e = ones(n,1); xe = [x e]; 
s = xe*u; [f df] = sgm(s); J = [];
for i = 1:numel(x)
  df1 = df(i,:); f1 = f(i,:); dr = d(i,:);
  row = one_row(x(i), df1, f1, dr, v);
  J = [J; row];
end
end
function row = one_row(x, df, f, dy, v)
dE_du11 = x*df(1)*(v(1,1)*dy(1) + v(1,2)*dy(2));
dE_du12 = x*df(2)*(v(2,1)*dy(1) + v(2,2)*dy(2));
dE_du13 = x*df(3)*(v(3,1)*dy(1) + v(3,2)*dy(2));
dE_du14 = x*df(4)*(v(4,1)*dy(1) + v(4,2)*dy(2));
 
dE_du21 = df(1)*(v(1,1)*dy(1) + v(1,2)*dy(2));
dE_du22 = df(2)*(v(2,1)*dy(1) + v(2,2)*dy(2));
dE_du23 = df(3)*(v(3,1)*dy(1) + v(3,2)*dy(2));
dE_du24 = df(4)*(v(4,1)*dy(1) + v(4,2)*dy(2));
 
dE_dv11 = f(1)*dy(1);
dE_dv21 = f(2)*dy(1);
dE_dv31 = f(3)*dy(1);
dE_dv41 = f(4)*dy(1);
 
dE_dv12 = f(1)*dy(2);
dE_dv22 = f(2)*dy(2);
dE_dv32 = f(3)*dy(2);
dE_dv42 = f(4)*dy(2);
 
row = [dE_du11 dE_du12 dE_du13 dE_du14 ...
       dE_du21 dE_du22 dE_du23 dE_du24 ...
       dE_dv11 dE_dv21 dE_dv31 dE_dv41 ...
       dE_dv12 dE_dv22 dE_dv32 dE_dv42];
end

0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.09.2019, 17:22
Ответы с готовыми решениями:

Обучение сверточной нейронной сети LeNet-5 методом Левенберга Марквардта
Здравствуйте! Ранее задавал вопрос о формирований слоя C3 в калссической архитектуре LeNet-5...

Решение системы интегральных уравнений методом Левенберга-Марквардта
Доброго времени суток, уважаемые Гуру форума =) Появилась необходимость решить систему уравнений: \begin{cases} &amp; \text{ }...

Проблемы с обучением нейронной сети
Решаю задачу регрессии. Прогнозируемая величина изменяется в основном в пределах от 1 до 2, но иногда попадаются большие значения вроде 10,...

69
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
11.09.2019, 14:22  [ТС]
Студворк — интернет-сервис помощи студентам
Неясно также как работают единицы. С одной стороны с ними обучение гораздо быстрее, но с другой т.к. сигмойд ведь почти не меняется за +/- 7, то в чем же смысл значений единиц(посмотрите напр 14.2936, -7.5627, -7.4926...)
0
3131 / 1722 / 273
Регистрация: 19.02.2010
Сообщений: 4,513
11.09.2019, 22:23
Цитата Сообщение от tur9 Посмотреть сообщение
А в третьем вложении получившиеся матрицы весов. Меня смущают цифры в них: по абс величине более 10 и чуть ли не 40. Это вообще нормально?
Нет, не нормально.
Возможно, влияние взятых Вами сигмоид. Любые нецентрированные (по выборке) сигналы в сети - это рост обусловленности матрицы Гессе, т.е. рост овражности целевой функции. И любая ошибка с выбором шага обучения - выкидывает состояние сети из оврага куда-то вдаль, после чего обучение может начинаться с начала (если у Вас график значений целевой функции уменьшается при обучении плавно - то указанной проблемы нет, но при скачках суммарной ошибки вверх - это именно потеря локальности выполняемой оптимизации).
Ну и выполняйте останов обучения пораньше. Точность er < 10^(-4) - может быть избыточна. ХЗ что у Вас за требуемые данные на выходе сети - но не нужно ставить точность выше, чем точность получения этих данных. Т.е. если нет в ответных данных цифр на четвёртой позиции после запятой - то, значит, абсолютно бредово требовать точность до 0.0001.
1
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
12.09.2019, 13:42  [ТС]
Спасибо. Заменил сигмойд на тангенс, поднял ошибку и добавил функцию, которая находит в матрицах весов u v значения большие 7 и делит их пополам каждые 50 итераций. Ответ во вложении. Можно сказать, что эта "проблема" решена. Кавычки потому, что это скорее только у меня в голове, не проверено как это все может сказаться на окончательном результате. Я думаю что исходные данные (7 точек дуги - отсюда 14 входов) избыточны. Может быть достаточно было бы 4-х точек. Эта избыточность и вызывает выбросы весов. Вот добавленная функция сокращающая выбросы весов
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function [u v] = update_u_v(u, v)
u = reduce_all(u, 7, 2);
v = reduce_all(v, 7, 2);
end
function u = reduce_all(u, lim, div)
global mt; w = abs(u);
while 1
% ф-ция maxmat - находит максимум (val) матрицы (w)
% и возвращает строку (r) и столбец (с) где этот максимум
  [r c val] = mt.maxmat(w);
  if lim < val
    w(r,c) = 0;
    u(r,c) = u(r,c)/div;
  else
    return
  end
end
end
Немного позднее я объясню как решаю свою задачу и что это за черные точки на графике.
Миниатюры
Проблема с обучением простой нейронной сети методом Левенберга-Марквардта  
0
3131 / 1722 / 273
Регистрация: 19.02.2010
Сообщений: 4,513
12.09.2019, 20:03
Цитата Сообщение от tur9 Посмотреть сообщение
Заменил сигмойд на тангенс, поднял ошибку и добавил функцию, которая находит в матрицах весов u v значения большие 7 и делит их пополам каждые 50 итераций.
Я надеюсь, что Вы ради понимания, где/что влияет, всё-таки изучили/изучите эти 3 изменения ПО-ОТДЕЛЬНОСТИ

Цитата Сообщение от tur9 Посмотреть сообщение
Я думаю что исходные данные (7 точек дуги - отсюда 14 входов) избыточны. Может быть достаточно было бы 4-х точек. Эта избыточность и вызывает выбросы весов.
Взамен полУчите недоопределённую задачу (размер "системы уравнений" станет меньше, чем число неизвестных в этой системе). Сколько можно провести прямых через одну точку на плоскости / в пространстве? Будет аналог такого континуума возможных решений.
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
19.09.2019, 16:31  [ТС]
Попробую описать путь решения задачи отыскания центра тела по небольшому куску его контура. На одном форуме мне намекнули что такие задачи решаются с помощью нейросетей. Тогда я имел самое поверхностное представление о нейросетях. Затем встретил https://www.youtube.com/watch?... QJY7L4gL3I и увидел, что это совсем не так сложно как казалось вначале. Мысль о том что человек почти всегда по куску контура может легко определить центр не оставляла меня. В самом деле если человек может, но не знает как он это делает, то почему бы эту способность не вложить в систему коэффициентов-весов? Как делать сеть? Надо взять куски дуг, скажем четвертинки круга, расположенные в разных местах круга, взять скажем по три точки (расположенные равномерно) на каждой дуге и координаты всех их последовательно подавать на вход какой-нибудь простейшей сети. Центр мы знаем — значит легко можем обучить сеть. Так я и сделал и (ура!) получил на выходе центр круга. Какую бы дугу с этого круга я не брал всегда на выходе получал правильный центр круга. Затем попробовал взять дугу из другого, смещенного круга, но в результате получил центр все того старого круга, т.е. моя сеть оказывается научилась выдавать только один и тот же центр что бы я ни подавал на ее вход. Вот и приехали. Затем началась длинная история упражнений чтобы сеть выдавала две различные точки, три... научился аппроксимировать параболы и т.д. Постепенно прояснился градиентный спуск, но только для простых сетей. Для простых т.к. перед написанием кода уходил день на дифференцирование, т.к. бэкпроп почему то отличался от того что я получал на бумаге. Но мне было не до бэкпропа, надо было решать задачу. Код надо было писать с нуля, я не мог полагаться на готовые пакеты для нейросетей, т.к. затем надо было передавать код программисту для процессора. После того как т.о. градиентный спуск был освоен надо было создавать базу данных для обучения сети. Мой реальный фрейм меня не интересовал, т.к. легко обращался в любой прямоугольник. Было ясно что надо проводить симуляцию на единичном квадрате (ввиду ограничения сигмойдов). Естественно было начать с круга, взять на нем дуги, каждая в его четверть, причем дуги взять внахлест как показано на рис ниже

На каждой дуге можно для начала выбрать три точки: на концах по одно и одна в середине. Тогда у сети будет 6 входов (каждая точка две координаты X Y). Возьмем четыре окружности и на каждой по 16 дуг, каждая дуга три точки для каждой дуги известен ее центр

Так построим данные для обучения сети 4*16 = 64 строки. Каждая строка 6 + 2 = 8 чисел. 6 - координаты точек дуги и 2 - координаты центра дуги. Возьмем какую-нибудь простую сетьскажем из 4-х нейронов одного слоя и двумя выходами и обучим ее градиентным спуском, получим примерно такой результат:

Вверху на графике 1000 - число итераций, 0.00606489 - ошибка сети 14.450 - максимальное отклонение от истинного центра выраженное в пикселях. В центре красные точки - это тест сети, результат обучения которой - зеленые точки. er = 0.008911 - ошибка сети, md = 26.92 - макс ошибка в пикселях. Поскольку эта симуляция чисто геометрическая важно было получить максимальную ошибку в пикселях +/- 1 пиксель (на реальных данных она будет больше). Высокая ошибка в центре видимо из-за того что слабую сеть не удалось натянуть на весь единичный квадрат. Поэтому добавил еще круг с 16-тью дугами в центр квадрата и получил нечто похожее:

Красные точки это тесты. Я уже не помню какая там была сеть, интересно что там 10 миллионов итераций, что уже неприемлемо. И это только круг. Надо было переходить к эллипсу, все дуги получить на нем. Но у эллипса кроме центра добавляется угол поворота:

А ниже результаты работы какой-то моей сети, может и двуслойной

Как видим все очень плохо, ошибка неприемлемая. Вообще я много игрался, экспериментировал и с сетями и с данными для тренировки. Кроме того таблетка поворачивается, и нужно чтобы сеть работала и с кругом и с эллипсом одновременно и для разных длин дуг (что отдельная катастрофа). В конце концов встал вопрос: как избавится от необходимости натягивать сеть на весь квадрат, на все углы ориентации? Может есть у кого-нибудь соображения как избавится?
Продолжу на следующей неделе.
0
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
19.09.2019, 17:56
Как эллипс интерполировать? Какая цель главная?
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
19.09.2019, 18:11  [ТС]
Цитата Сообщение от nuHrBuH Посмотреть сообщение
Какая цель главная?
Я же пишу: найти центр тела, если дан только кусок его дуги.
Вот здесь пост 66 и далее подробней Простейшая нейронная сеть для аппроксимации параболы Таблетки совсем не обязательно эллипсы.
0
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
19.09.2019, 18:16
А по касательным нельзя?
Миниатюры
Проблема с обучением простой нейронной сети методом Левенберга-Марквардта  
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
19.09.2019, 18:20  [ТС]
Цитата Сообщение от nuHrBuH Посмотреть сообщение
А по касательным нельзя?
Контур - почти произвольный (тень от выпуклого тела), не эллипс. Поэтому ни по касательным ни по хордам, ни аппроксимацией, ни аппроксимацией эллипсом с заданными полуосями нельзя. А человек как то интуитивно почти всегда понимает и только по куску дуги где центр тела. Поэтому я оставил все другие подходы и в этой теме рассматриваю решение только через НС.
0
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
19.09.2019, 18:28
Если контур произвольный, то октуда извесно: эллипс это или парабола?
Миниатюры
Проблема с обучением простой нейронной сети методом Левенберга-Марквардта  
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
19.09.2019, 19:39  [ТС]
Цитата Сообщение от nuHrBuH Посмотреть сообщение
Если контур произвольный, то октуда извесно: эллипс это или парабола?
Это неизвестно. Я всего лишь для простоты и на начальном этапе тренирую сеть на эллипсе.
0
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
19.09.2019, 20:34
Тренированная сеть сможет отличить круг от эллипса?
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
19.09.2019, 22:27  [ТС]
Цитата Сообщение от nuHrBuH Посмотреть сообщение
Тренированная сеть сможет отличить круг от эллипса?
В данном случае нужно научить сеть не отличать одну кривую от другой, а находить центр тела, не более. Чтобы какая-то сеть смогла отличать одно от другого ее именно этому специально надо научить. У меня такой задачи нет.
0
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
19.09.2019, 23:21
Как найти центр не зная эллипс это или круг?
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
20.09.2019, 00:05
Зная размер таблетки сделать контур от 3д модели таблетки с большим допуском
например тут 10 пикселей.
Название: ScreenShot00079.jpg
Просмотров: 44

Размер: 12.4 Кб
Взять N положений и сделать такие маски всем.

Прикладывая зеленые маски к растру считаем в какую маску вошло больше всего пикселей. Получаем примерную ориентацию таблетки.
Дальше можно уточнить взяв меньше шаг поворота и более узкий контур.

В итоге если нужно точно найти ориентацию можно не перебирать например 200 положений а постепенно увеличивать точность. Такой классификатор похоже на дерево.

Тут не нужна нейросеть, но как не касячить с выделением контуров я незнаю…поиски контуров объектов могут выдавать такое ( рис внизу)
Простейшая нейронная сеть для аппроксимации параболы
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
20.09.2019, 00:15  [ТС]
nuHrBuH, представьте себе конвейер по которому движутся таблетки плотно соприкасаясь. Камера сверху снимает этот конвейер, его кусок и выдает фреймы. Программа находит все контуры и нарезает их на дуги. Там где есть касание нет контура. Поэтому получаются обрывки дуг. Таблетки все одинаковые, все их размеры известны и в пикселях тоже. Но встречаются и бракованные по форме и даже по цвету таблетки. Их программа должна опознать. Итак, есть априорно известный контур правильной таблетки и множество отдельных дуг (массивов чисел). Эти дуги надо объединить в группы дуг относящиеся к отдельной таблетке. Т.о. можно установить сколько в данном фрейме таблеток. Как объединить дуги в группы дуг принадлежащие одной таблетке? Один из способов установить для каждой дуги центр таблетки и по близости друг от друга этих центров можно объединить дуги в группы. Как по куску дуги найти центр таблетки? Например наложением дуги на нормативный, известный заранее, контур таблетки. Как это делать — особый разговор. Человек, глядя на кусок дуги, почти всегда может как то интуитивно определить примерное положение центра таблетки. Предлагается вместо человека и вместо наложения дуги на нормативный контур (эта процедура медленная) использовать нейросеть. Форма таблеток может быть и не эллипс и не круг. Есть другой проект когда камера снимает падающие таблетки, там все сложнее.
Чем занимаюсь я в этой теме? Не реальностью. Я придумал задачу предварительную такую: есть окружность, ее радиус известен. Она может поворачиваться и превращаться в эллипс с осями a = R и b = от R до R/2. Далее предположим что даны только какие то четвертинки=дуги полного периметра контура (круга или эллипса). Как по ним находить центр всего тела? Понятно что геометрия меня не интересует в данном случае. Это же только упрощенный пример на котором следует научить сеть. Теперь яснее стало?

Добавлено через 3 минуты
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Тут не нужна нейросеть
Сколько бы я ни думал у меня получается что нужна и это лучший вариант. С масками в 3д тоже думал, но что-то меня пока это отпугивает, может потом займусь этим. Сначала надо закончить с сетью.
1
 Аватар для nuHrBuH
483 / 427 / 205
Регистрация: 04.03.2011
Сообщений: 1,259
20.09.2019, 00:56
Кроме дуг больше ничего нету?
Изображения можно обработать?
Миниатюры
Проблема с обучением простой нейронной сети методом Левенберга-Марквардта  
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
20.09.2019, 10:36
Чтобы детектировать разные формы таблеток можно сделать 3д модель через скан поверхности по фотке “структурированный свет ”

Тут очень много свертки изображения с маской( вот та зеленая), возможно для ускорения работы уменьшить размер фото опять же сверткой.
“перевод RGB 64x64 в растр в 8x8”
Странное поведение при классификации изображений
Понятия не имею зачем резать на дуги усложняя матан, проще детектировать сразу весь контур, будет сразу два зайца:
1)принадлежность отдельных контуров одному телу
2) центр тела
Дальше обычный подсчет пикселей, в каких координатах какая маска набрала больше всего пикселей та и победила. Может даже простой фильтр выделения границ тоже прокатит как сырая обработка фотки, т.к. маски большие и крупные, схожим образом работают глубокие нейросети это называют детектор фичей. feature detection

А вот когда контур принадлежащий таблетке найден, нужно будет наверно анализировать шероховатость контура чтобы увидеть где сколы поверхности. А если скол повернулся и смотрит прям в камеру а алгоритм контура обводит гладкий периметр таблетки? Тогда брак пройдет….вот тут альтернатив 3д скану поверхности просто нет. Вот вам и снова нужен 3д скан, снова структурированный свет.
Простейшая нейронная сеть для аппроксимации параболы
0
47 / 15 / 1
Регистрация: 26.08.2017
Сообщений: 162
20.09.2019, 14:07
На мой взгляд не нужно выпендриваться с маргинальными датасетами, есть XOR для начала и MNIST как завершающая точка всей катавасии с нейросетями. Метод Левенберга-Марквардта MNIST не проглотит, укакается, да и зачем? Обычный Mlp({ 196, 100, 50, 20, 10 }, lr=0.01, mom=0.1, epohs=50) делает <2.3% за 3 минуты, а хвалёный NeuroPro пол часа будет мучиться, как и MatLab наверно, если вообще сможет.
0
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
20.09.2019, 17:16  [ТС]
Цитата Сообщение от nuHrBuH Посмотреть сообщение
Изображения можно обработать?
Зачем? Для решения какой задачи?

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Чтобы детектировать разные формы таблеток можно сделать 3д модель через скан поверхности по фотке
3д модель можно сделать по фото фаз и профиль.
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Понятия не имею зачем резать на дуги усложняя матан, проще детектировать сразу весь контур, будет сразу два зайца
Объясните как можно ''детектировать сразу весь контур''.

Цитата Сообщение от danila_zaytcev Посмотреть сообщение
На мой взгляд не нужно выпендриваться с маргинальными датасетами, есть XOR для начала и MNIST как завершающая точка всей катавасии с нейросетями. Метод Левенберга-Марквардта MNIST не проглотит, укакается, да и зачем? Обычный Mlp({ 196, 100, 50, 20, 10 }, lr=0.01, mom=0.1, epohs=50) делает <2.3% за 3 минуты, а хвалёный NeuroPro пол часа будет мучиться, как и MatLab наверно, если вообще сможет.
Какое отношение это имеет к теме, к задаче о центре тела?



Напоминаю свой вопрос:
Цитата Сообщение от tur9 Посмотреть сообщение
как избавится от необходимости натягивать сеть на весь квадрат, на все углы ориентации?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.09.2019, 17:16

Проблемы с обучением LSTM нейронной сети
Всем привет! Обращаюсь за помощью к людям, имеющим практический опыт обучения LSTM нейронных сетей. Задача - обучить LSTM сеть переводу с...

Как же обучать автокодировщик? Непонятная ситуация с обучением нейронной сети
Доброго времени суток! Сразу к делу. Пытаюсь использовать метод обратного распространения ошибки при обучении автокодировщика. Обучаю на...

Метод Левенберга - Марквардта
Доброго времени суток. Помогите пожалуйста с реализацией метода Левенберга-Марквардта для нахождения значений некоторой заданной функции.

Алгоритм Левенберга-Марквардта
Доброе время суток! Помогите в реализации алгоритма Левенберга-Марквардта в Матлабе. Есть теоретические выкладки, возникает проблема с...

Применение алгоритма Левенберга-Марквардта
представим, есть матрица, в которой содержится нечто похожее на 2умерную ф-цию гаусса, т.е i - это у, j это х, и значение каждого элемента...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru