Skip to content

Instantly share code, notes, and snippets.

@ikarius6
Created October 26, 2017 05:57
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save ikarius6/26851fb7220837e8016fe0c425d34dd6 to your computer and use it in GitHub Desktop.
Save ikarius6/26851fb7220837e8016fe0c425d34dd6 to your computer and use it in GitHub Desktop.
Red Neuronal - PHP
<?php
/*
Red Neuronal 3x12x8x2 - Mr.Jack - 10/2017
3 neuronas de entrada
2 capas intermedias
12 neuronas escondidas en la capa 1
8 neuronas escondidas en la capa 2
2 neuronas de salida
*/
class RedNeuronal{
/*3x12*/
private $w1 = [
[.5, .5, .5, .5, .5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5, .5, .5, .5, .5]
];
/*12x8*/
private $w2 = [
[.5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5],
[.5, .5, .5, .5, .5, .5, .5, .5]
];
/*8x2*/
private $w3 = [
[.5, .5],
[.5, .5],
[.5, .5],
[.5, .5],
[.5, .5],
[.5, .5],
[.5, .5],
[.5, .5]
];
/*12*/
private $u2 = [.5, .5, .5, .5, .5, .5, .5, .5, .5, .5, .5, .5];
/*8*/
private $u3 = [.5, .5, .5, .5, .5, .5, .5, .5];
/*3*/
private $u4 = [.5, .5];
function run($i,$X){
return $this->Y($i,$X);
}
function A2($i,$X){
$sumatoria=0;
for($q=0; $q<3; $q++){
$sumatoria += ($X[$q]*$this->w1[$q][$i]);
}
$aux1 = $sumatoria + $this->u2[$i];
return $this->f($aux1);
}
function A3($i,$X){
$sumatoria=0;
for($q=0; $q<12; $q++){
$sumatoria += ($this->A2($q, $X)*$this->w2[$q][$i]);
}
$aux1 = $sumatoria + $this->u3[$i];
return $this->f($aux1);
}
function Y($i,$X){
$sumatoria=0;
for($q=0; $q<8; $q++){
$sumatoria += ($this->A3($q, $X)*$this->w3[$q][$i]);
}
$aux1 = $sumatoria + $this->u4[$i];
return $this->f($aux1);
}
function f($x){
return 1 / (1 + exp(-$x));
}
function delta4($Y, $sal){
return $Y*(1-$Y)*($Y-$sal);
}
function delta3($k, $d4, $X){
$a3=$this->A3($k,$X);
$sumatoria=0;
for($i=0; $i<2; $i++){
$sumatoria += ($this->w3[$k][$i]*$d4[$i]);
}
return $a3*(1-$a3)*$sumatoria;
}
function delta2($k, $d4, $X){
$a2=$this->A2($k,$X);
$sumatoria=0;
for($i=0; $i<8; $i++){
$sumatoria += ($this->w2[$k][$i]*$this->delta3($i,$d4,$X));
}
return $a2*(1-$a2)*$sumatoria;
}
function error3($k, $d4, $X){
return $this->A3($k, $X)*$d4;
}
function error2($j, $k, $d4, $X){
return $this->A2($j, $X)* $this->delta3($k, $d4, $X);
}
function error($j,$k,$d4,$X){
return $X[$j]*$this->delta2($k,$d4,$X);
}
function BackPropagation($X,$sal){
$alfa = 1;
$Y = [1, 1];
$d4 = [1, 1];
for($i=0; $i<2; $i++){
$Y[$i] = $this->run($i, $X);
$d4[$i] = $this->delta4($Y[$i], $sal[$i]);
}
for($j=0; $j<3; $j++){
for($i=0; $i<12; $i++){
$this->w1[$j][$i] -= $alfa * $this->error($j, $i, $d4, $X);
$this->u2[$i] -= $alfa * $this->delta2($i, $d4, $X);
}
}
for($j=0; $j<12; $j++){
for($i=0; $i<8; $i++){
$this->w2[$j][$i] -= $alfa * $this->error2($j, $i, $d4, $X);
$this->u3[$i] -= $alfa * $this->delta3($i, $d4, $X);
}
}
for($j=0; $j<8; $j++){
for($i=0; $i<2; $i++){
$this->w3[$j][$i] -= $alfa * $this->error3($i,$d4[$i],$X);
$this->u4[$i] -= $alfa * $d4[$i];
}
}
}
}
$rn = new RedNeuronal();
//Estado inicial de la red
echo "S1:". PHP_EOL;
print_r( $rn->run(0, [1, 1, 1]) );
echo "<br>" . PHP_EOL;
echo "S2:". PHP_EOL;
print_r( $rn->run(1, [1, 1, 1]) );
echo "<br>" . PHP_EOL;
//1000 épocas
for($i=0; $i<1000; $i++){
$rn->BackPropagation([0, 0, 0], [0.1, 0.2]); //para la entrada 0,0,0 se espera la salida 0.1, 0.2
$rn->BackPropagation([0, 0, 1], [0.3, 0.4]); //para la entrada 0,0,1 se espera la salida 0.3, 0.4
$rn->BackPropagation([0, 1, 0], [0.5, 0.6]); //para la entrada 0,1,0 se espera la salida 0.5, 0.6
$rn->BackPropagation([0, 1, 1], [0.7, 0.8]); //para la entrada 0,1,1 se espera la salida 0.7, 0.8
}
//Estado final de la red
echo "<hr>0 0 0<br>". PHP_EOL;;
echo "S1:". PHP_EOL;
print_r( $rn->run(0, [0, 0, 0]) );
echo "<br>" . PHP_EOL;
echo "S2:". PHP_EOL;
print_r( $rn->run(1, [0, 0, 0]) );
echo "<br>" . PHP_EOL;
echo "<hr>0 0 1<br>". PHP_EOL;;
echo "S1:". PHP_EOL;
print_r( $rn->run(0, [0, 0, 1]) );
echo "<br>" . PHP_EOL;
echo "S2:". PHP_EOL;
print_r( $rn->run(1, [0, 0, 1]) );
echo "<br>" . PHP_EOL;
echo "<hr>0 1 0<br>". PHP_EOL;;
echo "S1:". PHP_EOL;
print_r( $rn->run(0, [0, 1, 0]) );
echo "<br>" . PHP_EOL;
echo "S2:". PHP_EOL;
print_r( $rn->run(1, [0, 1, 0]) );
echo "<br>" . PHP_EOL;
echo "<hr>0 1 1<br>". PHP_EOL;;
echo "S1:". PHP_EOL;
print_r( $rn->run(0, [0, 1, 1]) );
echo "<br>" . PHP_EOL;
echo "S2:". PHP_EOL;
print_r( $rn->run(1, [0, 1, 1]) );
echo "<br>" . PHP_EOL;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment