AI-MXNet
view release on metacpan or search on metacpan
t/test_module.t view on Meta::CPAN
$mod->update();
$mod->save_checkpoint('test', 0, 1);
$mod2 = mx->mod->Module->load('test', 0, 1, data_names=>['data']);
$mod2->bind(data_shapes=>[['data', [10, 10]]]);
$mod2->init_optimizer(optimizer_params=>{learning_rate => 0.1, momentum => 0.9});
is($mod->_symbol->tojson(), $mod2->_symbol->tojson());
$dict_equ->(($mod->get_params())[0], ($mod2->get_params())[0]);
$dict_equ->($mod->_kvstore->_updater->states, $mod2->_updater->states);
unlink('test-0000.params');
unlink('test-0000.states');
unlink('test-symbol.json');
}
sub test_module_reshape
{
my $data = mx->sym->Variable('data');
my $sym = mx->sym->FullyConnected($data, num_hidden=>20, name=>'fc');
my $dshape = [7, 20];
my $mod = mx->mod->Module($sym, data_names=>['data'], context=>[mx->cpu(0), mx->cpu(1)]);
$mod->bind(data_shapes=>[['data', $dshape]]);
$mod->init_params();
$mod->init_optimizer(optimizer_params=>{learning_rate => 1});
$mod->forward(
mx->io->DataBatch(
data=>[mx->nd->ones($dshape)]
),
is_train => 1
);
$mod->backward([mx->nd->ones($dshape)]);
$mod->update();
is_deeply($mod->get_outputs()->[0]->shape, $dshape);
ok((($mod->get_params())[0]{fc_bias}->aspdl == -1)->all);
$dshape = [14, 20];
$mod->reshape(data_shapes=>[['data', $dshape]]);
$mod->forward(
mx->io->DataBatch(
data=>[mx->nd->ones($dshape)]
),
is_train => 1
);
$mod->backward([mx->nd->ones($dshape)]);
$mod->update();
is_deeply($mod->get_outputs()->[0]->shape, $dshape);
ok((($mod->get_params())[0]{fc_bias}->aspdl == -3)->all);
}
sub test_module_states
{
my $stack = mx->rnn->SequentialRNNCell();
for my $i (0..1)
{
$stack->add(mx->rnn->LSTMCell(num_hidden=>20, prefix=>"lstm_l${i}_"));
}
my $begin_state = $stack->begin_state(func=>mx->sym->can('Variable'));
my (undef, $states) = $stack->unroll(10, begin_state=>$begin_state, inputs=>mx->sym->Variable('data'));
my $state_names = [map { $_->name } @$begin_state];
my $mod = mx->mod->Module(
mx->sym->Group($states), context=>[mx->cpu(0), mx->cpu(1)],
state_names=>$state_names
);
$mod->bind(data_shapes=>[['data', [5, 10]]], for_training=>0);
$mod->init_params();
my $batch = mx->io->DataBatch(data=>[mx->nd->zeros([5, 10])], label=>[]);
$mod->set_states(value=>1);
$mod->forward($batch);
my $out = $mod->get_outputs(0);
my $out1 = $mod->get_outputs(1);
$mod->set_states(states=>$out);
$mod->forward($batch);
my $out2 = $mod->get_outputs(1);
zip(sub {
my ($x1, $x2) = @_;
ok(not almost_equal($x1->aspdl, $x2->aspdl, 1e-3));
}, $out1, $out2);
}
sub test_module_switch_bucket
{
my $vocab_dim = 5000;
my $num_hidden = 100;
my $num_embedding = 100;
my $num_layer = 2;
my $default_key = 10;
my $test_key = 5;
my $batch_size = 32;
my $contexts = [mx->cpu(0)];
my $initializer = mx->init->Xavier(factor_type=>"in", magnitude=>2.34);
#generate symbols for an LSTM network
my $gen_sym = sub {
my $seq_len = shift;
my $data = mx->sym->Variable('data');
my $label = mx->sym->Variable('softmax_label');
my $embed = mx->sym->Embedding(data=>$data, input_dim=>$vocab_dim,
output_dim=>$num_embedding, name=>'embed');
my $stack = mx->rnn->SequentialRNNCell();
for my $i (0..$num_layer-1)
{
$stack->add(mx->rnn->LSTMCell(num_hidden=>$num_hidden, prefix=>"lstm_l${i}_"));
}
my ($outputs, $states) = $stack->unroll($seq_len, inputs=>$embed, merge_outputs=>1);
my $pred = mx->sym->Reshape($outputs, shape=>[-1, $num_hidden]);
$pred = mx->sym->FullyConnected(data=>$pred, num_hidden=>$vocab_dim, name=>'pred');
$label = mx->sym->Reshape($label, shape=>[-1]);
$pred = mx->sym->SoftmaxOutput(data=>$pred, label=>$label, name=>'softmax');
return ($pred, ['data'], ['softmax_label']);
};
my $create_bucketing_module = sub { my $key = shift;
( run in 1.457 second using v1.01-cache-2.11-cpan-d80b1682f3f )