[Perl] NeuralPerl - Modulo Perl per la gestione di reti neurali

Stato
Discussione chiusa ad ulteriori risposte.

imported_BlackLight

Utente Silver
16 Agosto 2007
211
8
1
98
Dopo un bel po' di giorni di lavoro, annuncio il release della prima versione (0.1) di NeuralPerl, un modulo Perl per la gestione delle reti neurali, completamente compatibile con la mia libreria Neural++ in C++, con cui ho cercato di mantenere gli stessi nomi dei metodi, lo stesso approccio (assolutamente intuitivo e semplice per il programmatore) e la stessa sintassi per i file XML di input e di output (training set e informazioni della rete una volta salvata).

Un esempio di uso (crea una rete in grado di "imparare" a fare la somma di due numeri, dicendogli semplicemente che 2+3=5, 3+4=7, 5+4=9, e salva le informazioni di questa rete su un file XML):

Codice:
#!/usr/bin/perl 

use strict;
use warnings;
use NeuralNet;

my $net = new NeuralNet(
	input_size => 2,
	hidden_size => 2,
	output_size => 1,
	learning_rate => 0.002,
	epochs => 1000
) or die "Error: $!\n";

print "I'm training the network now, this may take a while\n";

my $xml = $net->setToXML(
	'2,3;5',
	'3,4;7',
	'5,4;9'
);

$net->train(
	xml => $xml
);

$net->save('netadd.xml');

print "Network saved to netadd.xml\n";

quindi, per usare le informazioni appena salvate della rete per creare uno script che sfrutti la rete stessa per sommare due numeri:

Codice:
#!/usr/bin/perl 

use strict;
use warnings;
use NeuralNet;

my $net = new NeuralNet(
	file => 'netadd.xml'
);

print "Insert a number: ";
my $a = <STDIN>;

print "Insert another number, sir: ";
my $b = <STDIN>;

$net->setInput($a,$b);
$net->propagate;

print "Ok, more or less the result is ".$net->output."\n";

Per maggiore documentazione, c'è la directory examples/ nel pacchetto con tutti gli esempi ben commentati, o dopo l'installazione si può dare un `man NeuralPerl` per esaminare la pagina di manuale.

Per l'installazione:

$ perl Makefile.PL
$ make
% make install

Link:
http://0x00.ath.cx/prog/neuralperl/

Link per il clone dal repository GIT (consigliato):
git clone git://github.com/BlackLight/NeuralPerl.git
 
Quand'è che ti deciderai a spiegare a me come funzionano le reti neurali?
Scherzi a parte, kudos, come al solito.
 
BlackLight ha detto:
Rigorosamente riscritta tutta in Perl puro.

Bello sbattimento, gran bel lavoro, anche se non è mio campo di interesse ora come ora. Certo, creando dei bindings della libreria principale lo sviluppo sarebbe stato più comodo (e probabilmente la versione perl più veloce), almeno credo, ci avevi pensato?
 
orakool ha detto:
BlackLight ha detto:
Rigorosamente riscritta tutta in Perl puro.

Bello sbattimento, gran bel lavoro, anche se non è mio campo di interesse ora come ora. Certo, creando dei bindings della libreria principale lo sviluppo sarebbe stato più comodo (e probabilmente la versione perl più veloce), almeno credo, ci avevi pensato?

Assolutamente no, i cambi di context da perl a call nella shared lib avrebbero rallentato il tutto, il Perl e' gia' fottutamente veloce di per se, sufficientemente fottutamente veloce.
 
Come dice meh non avrei avuto nessun incremento delle prestazioni, anzi. Ogni volta che devo richiamare un oggetto dalla shared lib devo fare una call ad un codice contenuto in un file esterno, il che vuol dire pescare il codice eseguibile dall'hard disk se non è già presente in memoria, freezare lo stato, fare il contest switching, e poi ad elaborazione terminata ripristinare tutto. Sarebbe stato più comodo lo sviluppo per me di sicuro, ma le prestazioni si sarebbero degradate, e in più avrei introdotto una dipendenza vitale del modulo Perl dalla libreria C++. Anche se effettivamente la riscrittura in Perl dell'intera libreria è stata un lavoraccio, e inoltre ora ogni modifica andrà fatta parallelamente a entrambi i progetti, ma è meglio così, preferisco sacrificarmi io che far perdere qualità del lavoro al programmatore finale.
 
BlackLight ha detto:
e inoltre ora ogni modifica andrà fatta parallelamente a entrambi i progetti

Era a questo che mi riferivo, sapevo che il perl è fottutamente veloce ma non credevo che si sacrificasse così tanto in termini di prestazioni (ho usato diverse librerie bindate per il perl e non era così male, ma mai fatto io stesso una cosa del genere).
 
Stato
Discussione chiusa ad ulteriori risposte.