Entw.: Tensorflow mit Delphi (4)

In diesem Artikel wird eine höhere Delphi-API nach Tensorflow vorgestellt. Diese API basiert auf die im vorherigen Artikel vorgestellte Low-Level-API und wird wiederum mit DUnitX getestet. Dies ermöglicht einen automatisierten Schnelltest bei Tensorflow-Versionswechsel. Am Ende dieser Seite finden Sie das komplette Delphi-Projekt des Testprogramms und die Delphi-API für die Tensorflow-Version 1.3.

Test der höhere Delphi-API mit DUnitX

Der folgende Delphi-Source zeigt einen Ausschnitt des Testprogramms. Man erkennt wieviel einfacher die Anwendung dieser höheren Delphi-API gegenüber der Low-Level-API ist.

procedure TDApiTest.Test_SumWithAddN;
var
 i: Integer;
 array_int1, array_int2, array_int3: TArray<Integer>;
 values: TArray<Integer>;
 ten_array1, ten_array2, ten_array3: TFTensor;
 s:     TFSession;
 g:     TFGraph;
 a, b, c:  TFOutput;
 res:   TFTensor;
 val:   TValue;
 ten_a, ten_b: TFTensor;
 addN:  TFOutput;
 inputs: TArray<TFOutput>;
 dim1, dim2: TF_int64_t;
begin
 WriteLog(TLogLevel.Information,'Execute TDApiTest.Test_SumWithAddN');
 //
 TFMMEnv.StartMM;
 //
 s := TFSession.Create();   // <- The session implicitly creates the graph, get it.
 with s do begin
   g := s.Graph;
   //
   a := g.OpConst(_T(44));
   b := g.OpConst(_T(21));
   c := g.OpConst(_T(33));
   SetLength(inputs,3);
   inputs[0] := a;
   inputs[1] := b;
   inputs[2] := c;
   addN  := g.OpAddN(inputs);
   //
   res := s.GetRunner().Run(addN);
   //
   val := res.Value;
   Assert.AreEqual(98, val.AsInteger, 'Assertion failed: sum(44,21,33)<>98');
 end;
 s.Free;
 //
 s := TFSession.Create();   // <- The session implicitly creates the graph, get it.
 with s do begin
   g := s.Graph;
   //
   array_int1 := [1,2,3];
   ten_array1:= _T(array_int1);
   array_int2 := [6,7,8];
   ten_array2:= _T(array_int2);

   a := g.OpConst(ten_array1);
   b := g.OpConst(ten_array2);
   SetLength(inputs,2);
   inputs[0] := a;
   inputs[1] := b;
   addN  := g.OpAddN(inputs);
   //
   res := s.GetRunner().Run(addN);
   //
   if res.IsArray(dim1,dim2) then begin
     res.GetArray(values);
     Assert.AreEqual( 7, values[0], 'Assertion failed: sum([1,2,3],[6,7,8])<>[7,9,11]');
     Assert.AreEqual( 9, values[1], 'Assertion failed: sum([1,2,3],[6,7,8])<>[7,9,11]');
     Assert.AreEqual(11, values[2], 'Assertion failed: sum([1,2,3],[6,7,8])<>[7,9,11]');
   end
   else
     Assert.IsTrue(False, 'Assertion failed: Is not an Array!');
 end;
 s.Free;
 //
 s := TFSession.Create();   // <- The session implicitly creates the graph, get it.
 with s do begin
   g := s.Graph;
   //
   array_int1 := [1,10,100];
   ten_array1:= _T(array_int1);
   array_int2 := [2,11,101];
   ten_array2:= _T(array_int2);
   array_int3 := [3,12,102];
   ten_array3:= _T(array_int3);

   a := g.OpConst(ten_array1);
   b := g.OpConst(ten_array2);
   c := g.OpConst(ten_array3);
   SetLength(inputs,3);
   inputs[0] := a;
   inputs[1] := b;
   inputs[2] := c;
   addN  := g.OpAddN(inputs);
   //
   res := s.GetRunner().Run(addN);
   //
   if res.IsArray(dim1,dim2) then begin
     res.GetArray(values);
     Assert.AreEqual(  6, values[0], 'Assertion failed: sum([1,10,100],[2,11,101],[3,12,102])<>[6,33,303]');
     Assert.AreEqual( 33, values[1], 'Assertion failed: sum([1,10,100],[2,11,101],[3,12,102])<>[6,33,303]');
     Assert.AreEqual(303, values[2], 'Assertion failed: sum([1,10,100],[2,11,101],[3,12,102])<>[6,33,303]');
   end
   else
     Assert.IsTrue(False, 'Assertion failed: Is not an Array!');
 end;
 s.Free;
 //
 TFMMEnv.EndMM;
 //
 // MemoryLeaks
 Assert.Pass;
end;

Die komplette Testumgebung mit der höheren Delphi-API finden Sie in meiner Github-Repository .