AI-TensorFlow-Libtensorflow
view release on metacpan or search on metacpan
t/lib/TF_Utils.pm view on Meta::CPAN
}
package # hide from PAUSE
TF_Utils::CSession {
use Class::Tiny qw(
session
graph use_XLA
_inputs _input_values
_outputs _output_values
_targets
), {
use_XLA => sub { 0 },
};
sub BUILD {
my ($self, $args) = @_;
my $s = delete $args->{status};
my $opts = AI::TensorFlow::Libtensorflow::SessionOptions->New;
$opts->EnableXLACompilation( $self->use_XLA );
if( ! exists $args->{session} ) {
$self->session( AI::TensorFlow::Libtensorflow::Session->New( $self->graph, $opts, $s ) );
}
}
sub SetInputs {
my ($self, @data) = @_;
my (@inputs, @input_values);
for my $pair (@data) {
my ($oper, $t) = @$pair;
push @inputs, AI::TensorFlow::Libtensorflow::Output->New({ oper => $oper, index => 0 });
push @input_values, $t;
}
$self->_inputs( \@inputs );
$self->_input_values( \@input_values );
}
sub SetOutputs {
my ($self, @data) = @_;
my @outputs;
my @output_values;
for my $oper (@data) {
push @outputs, AI::TensorFlow::Libtensorflow::Output->New({ oper => $oper, index => 0 });
}
$self->_outputs( \@outputs );
$self->_output_values( \@output_values );
}
sub SetTargets {
my ($self, @data) = @_;
$self->_targets( \@data );
}
sub Run {
my ($self, $s) = @_;
if( @{ $self->_inputs } != @{ $self->_input_values } ) {
die "Call SetInputs() before Run()";
}
$self->session->Run(
undef,
$self->_inputs, $self->_input_values,
$self->_outputs, $self->_output_values,
$self->_targets,
undef,
$s
);
}
sub output_tensor { my ($self, $i) = @_; $self->_output_values->[$i] }
}
sub BinaryOpHelper {
my ($op_name, $l, $r,
$graph, $s, $name,
$device, $check) = @_;
$check ||= 1;
my $desc = AI::TensorFlow::Libtensorflow::OperationDescription
->New( $graph, $op_name, $name );
$desc->SetDevice($device) if $device;
$desc->AddInput( $TFOutput->coerce([ $l => 0 ]) );
$desc->AddInput( $TFOutput->coerce([ $r => 0 ]) );
my $op = $desc->FinishOperation($s);
if( $check ) {
TF_Utils::AssertStatusOK($s);
}
return $op;
}
sub MinWithDevice {
my ($l, $r, $graph, $device, $s, $name) = @_;
$name ||= 'min';
return TF_Utils::BinaryOpHelper(
'Min', $l, $r, $graph, $s, $name, $device, 1
)
}
sub RunMinTest {
my (%args) = @_;
my $device = delete $args{device} || "";
my $use_XLA = delete $args{use_XLA} || 0;
my $ctx = Test2::API::context();
my $s = AI::TensorFlow::Libtensorflow::Status->New;
my $graph = AI::TensorFlow::Libtensorflow::Graph->New;
$ctx->note('Make a placeholder operation.');
my $feed = TF_Utils::Placeholder($graph, $s);
TF_Utils::AssertStatusOK($s);
$ctx->note('Make a constant operation with the scalar "0", for axis.');
my $one = TF_Utils::ScalarConst($graph, $s, 'scalar', INT32, 0);
TF_Utils::AssertStatusOK($s);
$ctx->note('Create a session for this graph.');
my $csession = TF_Utils::CSession->new( graph => $graph, status => $s, use_XLA => $use_XLA );
TF_Utils::AssertStatusOK($s);
( run in 1.058 second using v1.01-cache-2.11-cpan-d80b1682f3f )