Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2017, 11:15   #1
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
Смущение Нейросети. Хочу разобраться в этом деле

всем здрасти, надеюсь тут есть живые люди...

delphi язык

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

Хочу разобраться в этом деле, оказывается все те статьи что я читал, меня лишь запутали, эти аксоны, дендриты, синопсы. муть голубая...
я уже после просмотра исходников из НЭТа, смотрел на свой код и гадал что там синопс что дендрит и каких еще отростков там не хватает
короче я совсем запутался, нужно распутаться, помогите пожалуйста понять что к чему
я был бы оч признателен
за например- код на трехслойную сеть, по три нейрона на слой с пояснениями, просто чтобы понимать, для дальнейшего развития. копи паст меня не интересует, хочу понимать.
НУ ИЛИ ХОТЯБЫ РАСПИСАТЬ ЧТО ЗА ПЕРЕМЕННЫЕ в примере ниже что за что отвечает

вот к примеру один кусок исходника:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
             ...
             ...
    Timer2: TTimer;
     procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button8MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer2Timer(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
 
 buk:array [1..33] of tbitmap; // тут понятно 33 битмапа соответственно для 33 нейронов
  i:integer;                           // тут НЕ понятно, нафига оно нужно, нигде не используется, в каждой функ, своя объявлена
  nerv:array [1..33] of real;    //а вот тут сомнения, сами ниероны?
  w,dw:array [1..150,1..150,1..33] of real;   // а что тогда вот ЭТО трехмерный 150,150,33. последнее соответствует кол-ву  nerv что тогда 150,150 ??????
  v:array [1..150,1..150] of real;   // ну и это???  что это, зачем :confused:
  N:real;
  size: integer;
  t: integer;


procedure initweights;

var
  but: boolean;
тут исходник весь Unit1.rar
собствеено, суть такого количества всех данных не ясна, если в принципе один неирон может получить картинку на вход сравнить выдать 0 или 1 на выход второму неирону, а а он третьему, а он 4му....
как передача 0 или 1 из рук в руки может влиять на на ответ сетки. бла бла бла я сошол с ума
направьте на путь истиный
___________________________________ ___________________________________ _______________
прога должна лежать в одной папке с папкой мемо для работы, из мемо грузится память нейрона
UAmoba.rar
Memo.rar

Последний раз редактировалось Михаил22042016; 08.01.2017 в 08:40.
Михаил22042016 вне форума Ответить с цитированием
Старый 08.01.2017, 08:18   #2
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

чтоли нет людей шарящих?
хотябы переменнве расписать
типа так
Код:
buk:array [1..33] of tbitmap; // это память неиронов
  i:integer;                           // 
  nerv:array [1..33] of real;    //это сами неироны котор, данные в этом массиве зависят от ....
  w,dw:array [1..150,1..150,1..33] of real;   // а  тото тото каждая ячека связана , зависит от..
  v:array [1..150,1..150] of real;   //  аэто тото тото связано , зависит от..
  N:real;          //      аэто 
  size: integer;//  аэто 
  t: integer;//  аэто
и что тут синоп аксон

Последний раз редактировалось Михаил22042016; 08.01.2017 в 08:42.
Михаил22042016 вне форума Ответить с цитированием
Старый 09.01.2017, 16:51   #3
Михаил22042016
Пользователь
 
Регистрация: 21.04.2016
Сообщений: 54
По умолчанию

начал пилить
Код:
type
  PixelRGB = packed record b,g,r: byte; end;
  tXarray = array[0..0] of PixelRGB;
  Xarray = ^tXarray;
  YXarray = array of Xarray;
Type
 TNeuron = Record            // Нейрон.         tbitmap
  input: Array of Array of real;        // Входы нейрона - В случае входного нейрона: input=output.
                                        //В остальных, в поле input попадает суммарная информация
                                        //всех нейронов с предыдущего слоя, после чего, она нормализуется,
                                        // с помощью функции активации (пока что просто представим ее f(x))
                                        // и попадает в поле output.
  output : Array of Array of real;        // Массив весовых коэффициентов нейрона.
  sinopsW: Array of Array of real;       // Массив изменений весов нейрона.- Синапс это связь между двумя нейронами. У синапсов есть 1 параметр — вес.
  sigma: real;             // Ошибка нейрона.
  OutN: real;              // Выход нейрона.    Для выходного слоя
  ko: Real;                    // коэфициент крутизны сигмоида (обычно от 0.1 до 1.5)
  e: Real;                     // скорость обучения. (обычно от 0.01 до 0.9)
 end;
  TX = Array of TNeuron;     // Массив нейронов В слое.  {строка}
  YxX= Array[0..2] of TX;          // Массив слоев             {столбец}
  Procedure SetIn(inBM:TBitmap);
 var
 Setb: YxX; // Setb[y,x].X:=0;  y-№ слоя, x-№ нейрона

implementation

uses
  Unit1;

Procedure SetIn(inBM:TBitmap); // Подача ВХОДных данных на ВХОДной слой.
var x,y,z:Integer; Skan:YXarray;
//    Skan - карта бит РГБ для быстрого доступа
begin
  inBM.PixelFormat:=pf24bit;
  SetLength(Skan,inBM.Height);
  SetLength(Setb[0],5); // размер ВХОДного слоя - 5 нейронов
  SetLength(Setb[1],33); // размер скрытого слоя - 33 нейронов
  SetLength(Setb[2],1); // размер ВЫходного слоя - 1 нейронов
  for z := 0 to inBM.Height-1 do  //перебор строк TBitmap для ScanLine
  Skan[z]:= inBM.ScanLine[z];
  for z := 0 to Length(Setb[0])-1 do
  begin // перебор нейронов слоя - ВХОДного
    SetLength(Setb[0,z].sinopsW,inBM.Height,inBM.Width); // уст. размер массива sinopsW, число связей, приходящих в нейрон
    for y := 0 to inBM.Height-1 do  //  перебор пикселей по Y
    begin
      for x := 0 to inBM.Width-1 do  // перебор пикселей по X
      begin
        Setb[0,z].sinopsW[y,x]:=(Skan[y,x].r+Skan[y,x].g+Skan[y,x].b)/3;
тут наверно можно было сразу все значения присваивать на Setb[0,z].output[y,x] ???
      end;
    end;
  end;
end;
блин...
если надо алфавит распазновать то входной слой должен быть 33 нейрона?
... переделывать...
а каким размером тогда должен быть второй слой
и следующий скок их вообще надо

Последний раз редактировалось Михаил22042016; 09.01.2017 в 19:33.
Михаил22042016 вне форума Ответить с цитированием
Старый 28.03.2017, 13:34   #4
k_123
Новичок
Джуниор
 
Регистрация: 20.10.2011
Сообщений: 1
По умолчанию

Я тоже столкнулся с некоторыми непонятками в нейросети.
Алгоритм обратного распространения ошибки вроде получился, но только для сети у которой всего один нейрон на выходе. Я пока его тестировал просто забивая в него входные данные-числа и результат пока вроде был допустимый. Но как этот алгоритм применить к распознаванию хотябы для начала простых геометрических фигур пока непонятно. Например квадраты,треугольники, и тд. могут быть разных
площадей. Какой тогда размер брать за эталон? Хорошо, задам сеть для обработки
черно-белого битмапа, где за каждый пиксель будед отвечать отдельный входной нейрон, а что тогда выбрать(какой эталон) для сравнения-вычисления ошибки. Или
что взять для желаемой цели на выходе? Черный квадрат?
k_123 вне форума Ответить с цитированием
Старый 28.03.2017, 21:50   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Какой тогда размер брать за эталон?
Наименьший. Возьмите 20х20.
Цитата:
и тд. могут быть разных площадей.
Сделайте пирамиду изображений. Начинайте распознавать с верхних слоёв переходя на нижние.
Цитата:
а что тогда выбрать(какой эталон) для сравнения-вычисления ошибки.
Возьми реальное изображение. Выбери случайным образом 10 точек. Собственными глазами определи, что у тебя получилось. Уверяю большая часть как раз и будут контр примеры. Если рассматривать совсем идеальные условия, то да чёрный квадрат.

Что касается вычисления ошибки, то видимо вы читали не хорошую статью про нейронные сети или же не до конца поняли или разобрались в статье.
У вас есть несколько эталонов. Возьмите паинт и сами нарисуте несколько примеров. Вот подовайте их на вход и смотрите выходной вектор. Он должен быть
Пусть у нас 3 класса:
1) квадрат;
2) круг;
3) треугольник.
Тогда выходные значений НС должны соответствовать
при подаче на вход квадрата
1.0 0.0 0.0
при подаче на вход круга
0.0 1.0 0.0
при подаче на вход треугольника
0.0 0.0 1.0
при подачи чёрного или абсолютно белого(в зависимости от вашего фона) изображения
0.0 0.0 0.0

Цитата:
блин...
если надо алфавит распазновать то входной слой должен быть 33 нейрона?
... переделывать...
а каким размером тогда должен быть второй слой
и следующий скок их вообще надо
Соль и перец по вкусу. Тут нет одного рецепта и быть не может. Всё зависит от ваших убеждений и выбранной методики обучения.
Для ГА вообще без различно. Если вы матричный подход используете то там достаточно однослойной сети. Метод обратного распространения ошибки хорошо работает с сетями где на каждом уровне одинаковое число нейронов. А число выходов соответствует числу распознаваемых объектов.
А если брать глубинное обучение нейронной сетей, то там промежуточные слои отличаются на один нейрон. Причем сеть строиться с двух сторон обучаясь на сжатие и по серёдке у неё самое узкое место.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решить задачку по VBA. Есть же специалисты в этом деле. Nfdjyzycrfz Помощь студентам 0 25.03.2012 15:50
Помогите. Хочу разобраться PEHAT Помощь студентам 2 13.05.2009 21:19