Віктор Андрійович Шевченко, Виктор Андреевич Шевченко, Victor Andriyovich Shevchenko

Июн 10

Персептрон на HAXE (C++,PHP,JS): распознавание цифр

Автор: admin | Категория: Наука и Размышления, Прочее | Опубликовано: 10-06-2014

Здравствуйте!
Сегодня я продолжу цикл записей о нейронных сетях, а в частности и однослойном персептроне.
В конце записи размещена ссылка на полный архив с HAXE кодом, а также уже скомпилированные примеры на PHP, C++ и JavaScript.
Во всех примерах взята минимальная обучающая выборка, соответственно больше примеров — больше точность.

Кратко о HAXE

Haxe — замечательный кросс-компилируемый язык программирования, поддерживающий целый ряд платформ:

Java
C#
PHP
JavaScript
C++
Flash
NekoVM

Синтаксис haxe удобен и краток, во многом напоминает ActionScript.
Не может не радовать большое количество кросс-платформенных библиотек в частности Json, Xml, Http, crypto, etc.
Haxe прост в установке, удобен в использовании и однозначно заслуживает внимания широкой аудитории.

Реализация

Перейдем непосредственно к реализации персептрона.
Ниже приведен код сети из 10 нейронов, на основе сигмоидальной функции, для распознавания цифр от 0 до 9.

class Neuron {
var pos : Int;
var size : Int;
var weight : Array<Float>;

function read_weight(){
if(sys.FileSystem.exists("/tmp/"+pos+".txt"))
weight=haxe.Json.parse(sys.io.File.getContent("/tmp/"+pos+".txt"));
if(weight.length!=size){
for(i in 0...size){
weight[i]=Math.random()*10;
}
}
}

public function write_weight(){
if(weight.length!=size){
return false;
}else{
var fp=sys.io.File.write("/tmp/"+pos+".txt");
fp.writeString(haxe.Json.stringify(weight));
fp.close();
return true;
}
}

public function ask(vector : Array<Int>){
var sum=0.;
for(i in 0...size){
sum+=vector[i]*weight[i];
}
return 1/(1+Math.exp(-sum));
}

public function teach(vector : Array<Int>,d : Int){
var ask=ask(vector);
if(ask!=d){
for(i in 0...size){
weight[i]+=(d-ask)*vector[i];
}
}
}

public function new(s,i){
pos=i;
size=s;
weight=[];
read_weight();
write_weight();
}

}

class Perseptron {
var size=36;
var neurons_count=10;
var neurons : Array<Neuron>;
var samples : Array<Array<Array<Int>>>;

function new(){
create_neurons();
get_samples();
for(i in 0...100){
for(i in 0...neurons_count)
for(j in 0...1)
teach_network(samples[i][j],make_vector(i));
}
for(i in 0...neurons_count)
trace(ask_network(samples[i][0]));
}

function create_neurons(){
neurons=[];
for(i in 0...neurons_count)
neurons[i]=new Neuron(size,i);

}

function teach_network(vector : Array<Int>,d : Array<Int>){
for(i in 0...neurons_count)
neurons[i].teach(vector,d[i]);
}

function ask_network(vector : Array<Int>){
var res : Array<Float>=[];
for(i in 0...neurons_count)
res[i]=neurons[i].ask(vector);
return res;
}

function make_vector(k: Int){
var newvector : Array<Int>=[];
for(i in 0...neurons_count){
newvector[i]=(i==k?1:0);
}
return newvector;
}

function get_samples(){
samples=[];
samples[0]=[[1,1,1,1,1,1,
1,0,0,0,0,1,
1,0,0,0,0,1,
1,0,0,0,0,1,
1,0,0,0,0,1,
1,1,1,1,1,1]];
samples[1]=[[0,0,0,0,0,1,
0,0,0,0,0,1,
0,0,0,0,0,1,
0,0,0,0,0,1,
0,0,0,0,0,1,
0,0,0,0,0,1]];
samples[2]=[[0,0,0,1,1,1,
0,0,0,0,0,1,
0,0,0,1,1,0,
0,0,0,1,0,0,
0,0,0,1,1,1,
0,0,0,0,0,1]];
samples[3]=[[0,0,0,1,1,1,
0,0,0,0,0,1,
0,0,0,1,1,1,
0,0,0,0,0,1,
0,0,0,1,1,1,
0,0,0,0,0,1]];
samples[4]=[[0,0,0,1,0,1,
0,0,0,1,0,1,
0,0,0,1,1,1,
0,0,0,0,0,1,
0,0,0,0,0,1,
0,0,0,0,0,1]];
samples[5]=[[0,0,0,1,1,1,
0,0,0,1,0,0,
0,0,0,1,1,1,
0,0,0,0,0,1,
0,0,0,1,1,1,
0,0,0,0,0,1]];
samples[6]=[[0,0,0,1,1,1,
0,0,0,1,0,0,
0,0,0,1,1,1,
0,0,0,1,0,1,
0,0,0,1,0,1,
0,0,0,1,1,1]];
samples[7]=[[0,0,0,1,1,1,
0,0,0,0,0,1,
0,0,0,0,0,1,
0,0,0,0,0,1,
0,0,0,0,0,1,
0,0,0,0,0,1]];
samples[8]=[[0,0,0,1,1,1,
0,0,0,1,0,1,
0,0,0,1,1,1,
0,0,0,1,0,1,
0,0,0,1,1,1,
0,0,0,0,0,0]];
samples[9]=[[0,0,0,1,1,1,
0,0,0,1,0,1,
0,0,0,1,1,1,
0,0,0,0,0,1,
0,0,0,0,0,1,
0,0,0,1,1,1]];
}

static function main() {
new Perseptron();
}

}

Как вы могли заметить, каждый нейрон отвечает за распознавание соответствующей цифры.
teach_network - обучает сеть
ask_network  — распознает образ

Результаты обучения сохраняются в директорию /tmp/{номер_нейрона}.txt

Полный архив, включающий скомпилированные примеры на PHP,C++,JS, а также исходный код на Haxe тут

Оставить комментарий