AI-Nerl
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
t/nerl_network.t view on Meta::CPAN
use Test::More tests=>714;
use Modern::Perl;
use PDL;
use PDL::NiceSlice;
use_ok('AI::Nerl');
use_ok('AI::Nerl::Network');
{
my $nn = AI::Nerl::Network->new(l1=>2,l2=>2);
isa_ok($nn,'AI::Nerl::Network');
}
#simplest 3layer: 1 in, i hidden, 1 out
#1->1,0->0
{
my $x = pdl(0,1);
my $y = pdl(1,0);
my $nn = AI::Nerl::Network->new(
l1=>1,l2=>1,l3=>1,
alpha=> .7,
lambda => .01,
);
my $prev_cost = 1000;
for(1..700){
$nn->train($x,$y,passes=>1);
my ($cost,$nc) = $nn->cost($x,$y);
ok($cost < $prev_cost, "round $_: cost < prev cost");
}
my $output = $nn->run(pdl(0,.25,.75,1));
# [0.88530935 0.79459088 0.32803629 0.02482565]
ok($output(0) > .85, "nn(0) > .85");
ok($output(1) < .85, "nn(1) < .85");
ok($output(2) > .15, "nn(2) > .15");
ok($output(3) < .1, "nn(3) < .1");
}
#build a few really simple nets.
#in: x1,x2
#out: x1 AND|OR|XOR x2
{
my $id2 = identity(2);
my $x = pdl([0,0,1,1],[0,1,0,1]);
my $AND = $id2->range(pdl(0,0,0,1)->transpose);
my $OR = $id2->range(pdl(0,1,1,1)->transpose);
my $XOR = $id2->range(pdl(0,1,1,0)->transpose);
my ($AND_nn,$OR_nn,$XOR_nn) = map {
AI::Nerl::Network->new(
l1=>2,
l2=>4,
l3=>2,
alpha=>.5,
lambda=>0,
);
} 1..3;
isa_ok($XOR_nn, 'AI::Nerl::Network');
is($XOR_nn->theta1->dim(0), 2, 'theta1 dim1 == 2');
is($XOR_nn->theta1->dim(1), 4, 'theta1 dim2 == 4');
is($XOR_nn->theta2->dim(0), 4, 'theta2 dim1 == 4');
is($XOR_nn->theta2->dim(1), 2, 'theta2 dim2 == 2');
$XOR_nn->train($x,$XOR, passes=>259);
$OR_nn->train($x,$OR, passes=>259);
$AND_nn->train($x,$AND, passes=>259);
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.813 second using v1.00-cache-2.02-grep-82fe00e-cpan-f5108d614456 )