OnlyOn
20.01.2011, 00:10
Примеры нейронных сетей на PHP
Совокупность нейронов соединённых тем или иным способом называется искусственной нейронной сетью или просто нейронной сетью.
Закон по которому нейроны соединены в сеть носит название структуры или топологией сети.
Иску́сственные нейро́нные се́ти (ИНС)
— математические модели, а также их программные или аппаратные реализации, построенные по принципу организации и функционирования биологических нейронных сетей — сетей нервных клеток живого организма. Это понятие возникло при изучении процессов, протекающих в мозге, и при попытке смоделировать эти процессы. Первой такой попыткой были нейронные сети Маккалока и Питтса. Впоследствии, после разработки алгоритмов обучения, получаемые модели стали использовать в практических целях: в задачах прогнозирования, для распознавания образов, в задачах управления и др.
Иску́сственный нейро́н (Математический нейрон Маккалока — Питтса, Формальный нейрон)
— узел искусственной нейронной сети, являющийся упрощённой моделью естественного нейрона. Математически, искусственный нейрон обычно представляют как некоторую нелинейную функцию от единственного аргумента — линейной комбинации всех входных сигналов. Данную функцию называют функцией активации или функцией срабатывания, передаточной функцией. Полученный результат посылается на единственный выход. Такие искусственные нейроны объединяют в сети — соединяют выходы одних нейронов с входами других. Искусственные нейроны и сети являются основными элементами идеального нейрокомпьютера
Множество нейронов не соединённых между собой, но соедененные с другими нейронами носит название слоя нейрона.
ИНС бывают 2х видов:
1) Однослойные
2) Многослойные
Перцептрон или "атом" ИНС
Обычный перцептрон состоит из 1-го нейрона (Первый тип - однослойный), у которого n входов и пороговая функция активации.
Поскольку выходами сети является +1 или -1. То перцептрон эффективен для решение задачи классификации 2-х классов.
Если выход +1, то поданный на вход вектор принадлежит к I-классу, если -1 — II классу.
Вначале на 0-шаге обучения, веса входа перцептрона задаются случайным образом.
Суть обучения состоит в изменение весов.
Для осуществления процедуры обучения для всякой нейронной сети в том числе и для простого перцептрона до начала формируется обучающая выборка состоящая из векторов, которые называются обучающими векторами, причем каждый обучающий вектор состоит их 2х частей:
1) Те значения, которые подаются на вход
2) То, что должно быть с нашей точки зрения на выходе сети когда на вход сети поданы компоненты из 1-й части
Общий вид обучающего вектора:
( x1, x2, ..., Xn, {+1, -1}).
Вообще говоря, вторая часть может быть пустой, в этом случае говорят, что обучение происходит без учителя.
Если есть — с учителем.
Вектора обучающей выборки подаются на вход сети и в соответствии с поданными векторами меняются веса Wi, i=1, n в ходе процедуры обучения.
Для простого перцептрона процедура выглядит следующим образом:
1) Подаем на вход компоненты 1й части вектора обучающей выборки Xp = (X1p, ..., Xnp), p=1, P. P — индекс вектора обучающей выборки. На этой стадии считается выход y = (Xp).
2) Сравниваем выход сети с желаемым значением.
y(xp)? d(xp),
— d(xp) — желаемое значение
— y(xp) — значение сети
Если y(xp) == d(xp) (как и надо), то p=p+1, переходим на шаг1.
Иначе — шаг 3.
3) Новое значение i-веса: Wi(t) = Wi(t-1) + d(Xp)*Xi.
p=p+1, шаг 1
Вообще говоря процедура завершена, если все вектора прошли.
Возможны 2 случая:
— обучающей выборки мало для обучения сети
— обучение завершилось гораздо раньше, чем конец выборки.
Теорема сходимости (Новикова):
Если существует набор весов W* способный разделить 2 класса с помощью простого перцептрона, то предложенный алгоритм сходится к некому решению не обязательно совпадающего с W*, причем сходится за конечное число шагов.
Доказательство.
В силу использовании функции sign в определении нейрона мы можем считать ||W*||=1.
Введем в рассмотрение косинус угла между текущим значением набора весов и W*.
cos угол = (W, W*)/||W||.
(1) (W(t+1), W*) = (W(t), W*) + d(X)*(X, W*).
Поскольку W* является точным решением, то |(W*, X)|>=delta>0.
Коль скоро происходит процедура обучения, то текущий набор векторов W(t) неправильно осуществляет классификацию для текущего вектора X, а значит величина d(x)*(x, W*) = |(X, W*)|, а потому имеем (1) >= (W(t), W*)+delta.
|| W(t+1) || **2 = ||W(t)||**2 + ||X||**2 + 2d(X)*(x, w(t)).
В силу той же логики, коль скоро происходит обучение, то знаки d(x)*(X, W(T)) (W(0), W*)+tdelta.
||W(t+1)|| (W(0), W*)+tdelta.
||W(t+1)|| +inf.
Полученное противоречие доказывает, что существует некая tmax после которой веса уже не меняются, что означает сходимость алгоритма обучения за конечное число шагов.
Доказано.
Замечания 1: Если положить W(0) = 0, то из равенства косинуса tmax = M2/Delta.
Очевидно, что tmax здесь чем больше разброс векторов выборки и тем больше, чем меньше расстояние между классами.
Замечание 2: Существенно важно при формировании существования W*.
Если классы неразделимы, то простого перцептрона не хватит для решения задачи.
Классический пример задачи, которую не сможет решить простой перцептрон является XOR.
Нейронная сеть на PHP1) Для начала создадим класс перцептрона. Там мы зададим веса, размерности и пороги.
Так-же реализуем функцию активации, которая в цикле будет разберать "веса".
W[$i];
}
if($sum>$this->porog) return1;
return -1;
}
2) Теперь зададим функцию "порогов".
/**
* Конструктор
* Аргумент - размерность перцептрона
*
* @param int $n
*/
public function__construct($n)
{
$this->size=$n;
$this->porog=100;
$this->init_weight();
}
3) Опять займёмся весами. Будем тыкать пальцем в небо и используем рандом
/**
* Инициализация ачальных весов.
* Рандом
*
*/
public functioninit_weight()
{
for($i=0;$isize;$i++)$this->W[] =rand(0,10);
}
/**
* Сохраняем в фа л
* Если файл есть - перезапишет
*
* @param string $filename
*/
public functionweight_save($filename)
{
$serialize=serialize($this->W);
fwrite(fopen($filename,"w"),$serialize);
}
4) Теперь загружаем ранее сгенерированый результат.
/**
* Грузим весы из файла
*
*
* @param string $filename
*/
public functionweight_load($filename)
{
$this->W=unserialize(file_get_contents($filename));
}
public functionteach($vector,$d)
{
if($d!=$this->ask($vector))
{
// teach
for($i=0;$isize;$i++)
{
$this->W[$i] +=$d*$vector[$i];
}
}
}
}
5) Теперь перейдём к самому вкусному =) Тут Мы зададим матрицу для распознавания линий и квадраток.
Как Вы понимаете 1 - это "обозначенные" пиксели, а 0 - "пустые". В нашем случае - черное и белое.
Тут мы зададим обучение в видео матриц 8х8 пикселей.
/**
* Example
*/
$filename='w1.txt';
/**
* Наш перцептрон буд т говорить что дали на в од, квадрат или прямую.
* Следует учесть, что в этом примере перцептро на спрашивают
* о том, чего небыло в учении.
*/
$neural= newPerceptron(64);// матрица будет 8х8, размер ость 64.
6) Обучаем перцептрон распознавать квадраты.
if(!isset($filename))
{
/**
* Учим квадраты
*/
$v1= array(1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,
);
$neural->teach($v1,1);
$v1= array(0,1,1,1,1,1,1,1,
0,1,0,0,0,0,0,1,
0,1,0,0,0,0,0,1,
0,1,0,0,0,0,0,1,
0,1,0,0,0,0,0,1,
0,1,0,0,0,0,0,1,
0,1,0,0,0,0,0,1,
0,1,1,1,1,1,1,1,
);
$neural->teach($v1,1);
$v1= array(0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,
);
$neural->teach($v1,1);
$v1= array(0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,
);
$neural->teach($v1,1);
$v1= array(0,0,1,1,1,1,1,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
);
$neural->teach($v1,1);
$v1= array(1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,
);
$neural->teach($v1,1);
7) Тут обучим распознавать разного рода прямые
/**
* Теперь учим пр мые.
*/
$v1= array(1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
);
$neural->teach($v1,-1);
$v1= array(0,0,0,0,0,0,0,1,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
);
$neural->teach($v1,-1);
$v1= array(0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
);
$neural->teach($v1, -1);
$v1= array(0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
);
$neural->teach($v1,-1);
$v1= array(1,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,0,1,
);
$neural->teach($v1,-1);
$v1= array(0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
);
$neural->teach($v1,-1);
8) Теперь запишем выученый материал в файл
/**
* Выучили неболь ой выборкой.
* Запишем веса в файл.
*/
$neural->weight_save("w1.txt");
}
else
{
// Чтобы каждый раз не учит ся, грузим.
$neural->weight_load($filename);;
}
9) Теперь проверим нашу ИНС =)
// Даем на вход квадрат, ко орого нету в выборке
$v1= array(0,0,1,1,1,1,1,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,1,1,1,1,1,
);
echo$neural->ask($v1)==1?"Квадратик":"прямая";
echo"\r\n";
// Еще один
$v1= array(0,0,0,0,0,0,0,0,
0,0,1,1,1,1,1,0,
0,0,1,0,0,0,1,0,
0,0,1,0,0,0,1,0,
0,0,1,0,0,0,1,0,
0,0,1,0,0,0,1,0,
0,0,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
);
echo$neural->ask($v1)==1?"Квадратик":"прямая";
echo"\r\n";
// Теперь спросим про линии
$v1= array(0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
);
echo$neural->ask($v1)==1?"Квадратик":"прямая";
echo"\r\n";
// Здесь просим про прямую длиной 5, а не 8.
$v1= array(0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
);
echo$neural->ask($v1)==1?"Квадратик":"прямая";
echo"\r\n";
?>
Скачать (http://www.sendspace.com/file/yfs6hj) архив с PHP скриптом!
Материал взят from google
Изложил более-менее подробно. Как-раз решил занятся написанием нейронки для распознавания текстов
Всем спасибо за внимание! Надеюсь Вам понравилось =)
Совокупность нейронов соединённых тем или иным способом называется искусственной нейронной сетью или просто нейронной сетью.
Закон по которому нейроны соединены в сеть носит название структуры или топологией сети.
Иску́сственные нейро́нные се́ти (ИНС)
— математические модели, а также их программные или аппаратные реализации, построенные по принципу организации и функционирования биологических нейронных сетей — сетей нервных клеток живого организма. Это понятие возникло при изучении процессов, протекающих в мозге, и при попытке смоделировать эти процессы. Первой такой попыткой были нейронные сети Маккалока и Питтса. Впоследствии, после разработки алгоритмов обучения, получаемые модели стали использовать в практических целях: в задачах прогнозирования, для распознавания образов, в задачах управления и др.
Иску́сственный нейро́н (Математический нейрон Маккалока — Питтса, Формальный нейрон)
— узел искусственной нейронной сети, являющийся упрощённой моделью естественного нейрона. Математически, искусственный нейрон обычно представляют как некоторую нелинейную функцию от единственного аргумента — линейной комбинации всех входных сигналов. Данную функцию называют функцией активации или функцией срабатывания, передаточной функцией. Полученный результат посылается на единственный выход. Такие искусственные нейроны объединяют в сети — соединяют выходы одних нейронов с входами других. Искусственные нейроны и сети являются основными элементами идеального нейрокомпьютера
Множество нейронов не соединённых между собой, но соедененные с другими нейронами носит название слоя нейрона.
ИНС бывают 2х видов:
1) Однослойные
2) Многослойные
Перцептрон или "атом" ИНС
Обычный перцептрон состоит из 1-го нейрона (Первый тип - однослойный), у которого n входов и пороговая функция активации.
Поскольку выходами сети является +1 или -1. То перцептрон эффективен для решение задачи классификации 2-х классов.
Если выход +1, то поданный на вход вектор принадлежит к I-классу, если -1 — II классу.
Вначале на 0-шаге обучения, веса входа перцептрона задаются случайным образом.
Суть обучения состоит в изменение весов.
Для осуществления процедуры обучения для всякой нейронной сети в том числе и для простого перцептрона до начала формируется обучающая выборка состоящая из векторов, которые называются обучающими векторами, причем каждый обучающий вектор состоит их 2х частей:
1) Те значения, которые подаются на вход
2) То, что должно быть с нашей точки зрения на выходе сети когда на вход сети поданы компоненты из 1-й части
Общий вид обучающего вектора:
( x1, x2, ..., Xn, {+1, -1}).
Вообще говоря, вторая часть может быть пустой, в этом случае говорят, что обучение происходит без учителя.
Если есть — с учителем.
Вектора обучающей выборки подаются на вход сети и в соответствии с поданными векторами меняются веса Wi, i=1, n в ходе процедуры обучения.
Для простого перцептрона процедура выглядит следующим образом:
1) Подаем на вход компоненты 1й части вектора обучающей выборки Xp = (X1p, ..., Xnp), p=1, P. P — индекс вектора обучающей выборки. На этой стадии считается выход y = (Xp).
2) Сравниваем выход сети с желаемым значением.
y(xp)? d(xp),
— d(xp) — желаемое значение
— y(xp) — значение сети
Если y(xp) == d(xp) (как и надо), то p=p+1, переходим на шаг1.
Иначе — шаг 3.
3) Новое значение i-веса: Wi(t) = Wi(t-1) + d(Xp)*Xi.
p=p+1, шаг 1
Вообще говоря процедура завершена, если все вектора прошли.
Возможны 2 случая:
— обучающей выборки мало для обучения сети
— обучение завершилось гораздо раньше, чем конец выборки.
Теорема сходимости (Новикова):
Если существует набор весов W* способный разделить 2 класса с помощью простого перцептрона, то предложенный алгоритм сходится к некому решению не обязательно совпадающего с W*, причем сходится за конечное число шагов.
Доказательство.
В силу использовании функции sign в определении нейрона мы можем считать ||W*||=1.
Введем в рассмотрение косинус угла между текущим значением набора весов и W*.
cos угол = (W, W*)/||W||.
(1) (W(t+1), W*) = (W(t), W*) + d(X)*(X, W*).
Поскольку W* является точным решением, то |(W*, X)|>=delta>0.
Коль скоро происходит процедура обучения, то текущий набор векторов W(t) неправильно осуществляет классификацию для текущего вектора X, а значит величина d(x)*(x, W*) = |(X, W*)|, а потому имеем (1) >= (W(t), W*)+delta.
|| W(t+1) || **2 = ||W(t)||**2 + ||X||**2 + 2d(X)*(x, w(t)).
В силу той же логики, коль скоро происходит обучение, то знаки d(x)*(X, W(T)) (W(0), W*)+tdelta.
||W(t+1)|| (W(0), W*)+tdelta.
||W(t+1)|| +inf.
Полученное противоречие доказывает, что существует некая tmax после которой веса уже не меняются, что означает сходимость алгоритма обучения за конечное число шагов.
Доказано.
Замечания 1: Если положить W(0) = 0, то из равенства косинуса tmax = M2/Delta.
Очевидно, что tmax здесь чем больше разброс векторов выборки и тем больше, чем меньше расстояние между классами.
Замечание 2: Существенно важно при формировании существования W*.
Если классы неразделимы, то простого перцептрона не хватит для решения задачи.
Классический пример задачи, которую не сможет решить простой перцептрон является XOR.
Нейронная сеть на PHP1) Для начала создадим класс перцептрона. Там мы зададим веса, размерности и пороги.
Так-же реализуем функцию активации, которая в цикле будет разберать "веса".
W[$i];
}
if($sum>$this->porog) return1;
return -1;
}
2) Теперь зададим функцию "порогов".
/**
* Конструктор
* Аргумент - размерность перцептрона
*
* @param int $n
*/
public function__construct($n)
{
$this->size=$n;
$this->porog=100;
$this->init_weight();
}
3) Опять займёмся весами. Будем тыкать пальцем в небо и используем рандом
/**
* Инициализация ачальных весов.
* Рандом
*
*/
public functioninit_weight()
{
for($i=0;$isize;$i++)$this->W[] =rand(0,10);
}
/**
* Сохраняем в фа л
* Если файл есть - перезапишет
*
* @param string $filename
*/
public functionweight_save($filename)
{
$serialize=serialize($this->W);
fwrite(fopen($filename,"w"),$serialize);
}
4) Теперь загружаем ранее сгенерированый результат.
/**
* Грузим весы из файла
*
*
* @param string $filename
*/
public functionweight_load($filename)
{
$this->W=unserialize(file_get_contents($filename));
}
public functionteach($vector,$d)
{
if($d!=$this->ask($vector))
{
// teach
for($i=0;$isize;$i++)
{
$this->W[$i] +=$d*$vector[$i];
}
}
}
}
5) Теперь перейдём к самому вкусному =) Тут Мы зададим матрицу для распознавания линий и квадраток.
Как Вы понимаете 1 - это "обозначенные" пиксели, а 0 - "пустые". В нашем случае - черное и белое.
Тут мы зададим обучение в видео матриц 8х8 пикселей.
/**
* Example
*/
$filename='w1.txt';
/**
* Наш перцептрон буд т говорить что дали на в од, квадрат или прямую.
* Следует учесть, что в этом примере перцептро на спрашивают
* о том, чего небыло в учении.
*/
$neural= newPerceptron(64);// матрица будет 8х8, размер ость 64.
6) Обучаем перцептрон распознавать квадраты.
if(!isset($filename))
{
/**
* Учим квадраты
*/
$v1= array(1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,
);
$neural->teach($v1,1);
$v1= array(0,1,1,1,1,1,1,1,
0,1,0,0,0,0,0,1,
0,1,0,0,0,0,0,1,
0,1,0,0,0,0,0,1,
0,1,0,0,0,0,0,1,
0,1,0,0,0,0,0,1,
0,1,0,0,0,0,0,1,
0,1,1,1,1,1,1,1,
);
$neural->teach($v1,1);
$v1= array(0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,
);
$neural->teach($v1,1);
$v1= array(0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,
);
$neural->teach($v1,1);
$v1= array(0,0,1,1,1,1,1,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
);
$neural->teach($v1,1);
$v1= array(1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,
);
$neural->teach($v1,1);
7) Тут обучим распознавать разного рода прямые
/**
* Теперь учим пр мые.
*/
$v1= array(1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
);
$neural->teach($v1,-1);
$v1= array(0,0,0,0,0,0,0,1,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
);
$neural->teach($v1,-1);
$v1= array(0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
);
$neural->teach($v1, -1);
$v1= array(0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
);
$neural->teach($v1,-1);
$v1= array(1,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,0,1,
);
$neural->teach($v1,-1);
$v1= array(0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
);
$neural->teach($v1,-1);
8) Теперь запишем выученый материал в файл
/**
* Выучили неболь ой выборкой.
* Запишем веса в файл.
*/
$neural->weight_save("w1.txt");
}
else
{
// Чтобы каждый раз не учит ся, грузим.
$neural->weight_load($filename);;
}
9) Теперь проверим нашу ИНС =)
// Даем на вход квадрат, ко орого нету в выборке
$v1= array(0,0,1,1,1,1,1,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,0,0,0,0,1,
0,0,1,1,1,1,1,1,
);
echo$neural->ask($v1)==1?"Квадратик":"прямая";
echo"\r\n";
// Еще один
$v1= array(0,0,0,0,0,0,0,0,
0,0,1,1,1,1,1,0,
0,0,1,0,0,0,1,0,
0,0,1,0,0,0,1,0,
0,0,1,0,0,0,1,0,
0,0,1,0,0,0,1,0,
0,0,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
);
echo$neural->ask($v1)==1?"Квадратик":"прямая";
echo"\r\n";
// Теперь спросим про линии
$v1= array(0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
);
echo$neural->ask($v1)==1?"Квадратик":"прямая";
echo"\r\n";
// Здесь просим про прямую длиной 5, а не 8.
$v1= array(0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
);
echo$neural->ask($v1)==1?"Квадратик":"прямая";
echo"\r\n";
?>
Скачать (http://www.sendspace.com/file/yfs6hj) архив с PHP скриптом!
Материал взят from google
Изложил более-менее подробно. Как-раз решил занятся написанием нейронки для распознавания текстов
Всем спасибо за внимание! Надеюсь Вам понравилось =)