Нейронная сеть на PHP (однослойный персептрон)

<!DOCTYPE html> 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Нейронная сеть на PHP (однослойный персептрон)</title>
<body>
<?php
class Perceptron{
public $mul; //отмасштабированные сигналы
public $weight; //коэфициенты связей
public $sinaps; //синапсы
public $sizeX;
public $sizeY;
public $filename;
public $sum; //сумма сигналов
public $limit; //порог

public function __construct($filename){
$this->sizeX=3;
$this->sizeY=5;
$this->limit=100;
$this->filenameW="wp/w".$filename.".txt";
}
public function set_filenameP($filename){
$this->filenameP="wp/p".$filename.".png";
}
public function save_weight_file(){
$serialize = serialize($this->weight);
fwrite( fopen($this->filenameW,"w"), $serialize);
}
public function load_weight_file(){
if(file_exists($this->filenameW)){
$this->weight = unserialize(file_get_contents($this->filenameW));
}else{
for($x=0;$x<$this->sizeX;$x++){
for($y=0;$y<$this->sizeY;$y++){
$this->weight[$x][$y]="0";
}
}
}
}
public function load_file(){
$im = imagecreatefrompng($this->filenameP);
for($x=0;$x<$this->sizeX;$x++){
for($y=0;$y<$this->sizeY;$y++){
$rgb = imagecolorat($im, $x, $y);
$color=imagecolorsforindex($im, $rgb);
if($color['red']>127){
$color=0;
}else{
$color=1;
}
$this->sinaps[$x][$y]=$color;
}
}
imagedestroy($im);
}
public function mul_weights(){
for($x=0;$x<$this->sizeX;$x++){
for($y=0;$y<$this->sizeY;$y++){
$this->mul[$x][$y]=$this->sinaps[$x][$y]*$this->weight[$x][$y];
}
}
}
public function sum_muls(){
$this->sum=0;
for($x=0;$x<$this->sizeX;$x++){
for($y=0;$y<$this->sizeY;$y++){
$this->sum+=$this->mul[$x][$y];
}
}
}
public function porog(){
if($this->sum >= $this->limit){
return true; //true - отнимаем
}else{
return false; //false - прибавляем
}
}
public function teach_plus(){
for($x=0;$x<$this->sizeX;$x++){
for($y=0;$y<$this->sizeY;$y++){
$this->weight[$x][$y]+=$this->sinaps[$x][$y];
}
}
}
public function teach_minus(){
for($x=0;$x<$this->sizeX;$x++){
for($y=0;$y<$this->sizeY;$y++){
$this->weight[$x][$y]-=$this->sinaps[$x][$y];
}
}
}
}
for($i=0;$i<10;$i++){
echo "<img style=\"border:1px solid #000000;\" src=\"wp/p".$i.".png\" width=\"30\" height=\"50\" /> ";
}
echo "<form style=\"padding-bottom:10px;\" action=\"".$_SERVER['PHP_SELF']."\" method=\"get\">\n";
echo "Изучить выбранную картинку <input type=\"text\" name=\"n\" value=\"";
echo (int)$_GET['n'];
echo "\" /><br>\n";
echo "Очистить коэффициенты связей <input type=checkbox Name=\"del\"/><br>";
echo "<input type=\"submit\" value=\"Поехали!\" /><br>\n";
echo "</form>\n";

if(isset($_GET['del'])){
for($i=0;$i<10;$i++){
$fp="wp/w".$i.".txt";
if(file_exists($fp)){
unlink($fp);
}
}
echo "Коэффициенты связей очищены. Можете заново обучить нейронную сеть :)<br>\n";
}else{
if((isset($_GET['n']))&&($_GET['n']>=0)&&($_GET['n']<=9)){
$n=(int)$_GET['n'];
echo "Грузим картинку ".$n.".<br>\n<br>\n";
echo "<img src=\"wp/p".$n.".png\" width=\"30\" height=\"50\" /><br>\n<br>\n";
do{
$errors=0;
for($i=0;$i<10;$i++){
$perc[$i]=new Perceptron($i);
$perc[$i]->set_filenameP($n);
$perc[$i]->load_weight_file();
$perc[$i]->load_file();
$perc[$i]->mul_weights();
$perc[$i]->sum_muls();
$porog[$i]=$perc[$i]->porog();
$say="false";
if($porog[$i]){
$say="true";
}
echo "Нейрон ".$i." сказал ".$say;
if($i==$n){
if($porog[$i]==true){
/*$perc[$i]->teach_minus();*/
}else{
$perc[$i]->teach_plus();
echo ", учим нейрон ".$i." не говорить чепуху (плюсуем веса).";
$errors++;
}
}else{
if($porog[$i]==true){
$perc[$i]->teach_minus();
echo ", учим нейрон ".$i." не говорить чепуху (минусуем веса).";
$errors++;
}else{
/*$perc[$i]->teach_plus();*/
}
}
echo "<br>\n";
$perc[$i]->save_weight_file();
}
echo "Нейронная сеть ошиблась ".$errors." раз.";
if($errors>0){
echo " Продолжаем обучаться<br>\n<br>\n";
}else{
$finded=array_search('true', $porog);
echo "<br>\nНейронная сеть определила на картинке: <span style=\"font-weight: bold; font-size:18px;\">".$finded."</span> <br>\n";
}
}while($errors!=0);
}
}
?>
</body>
</html>

Добавлено: 29 Июня 2017 06:33:32 Добавил: Андрей Ковальчук