TensorFlow.delphi (tf.delphi) liefert eine Delphi -Standardbindung für Tensorflow und Keras. Ziel ist es, die vollständige Tensorflow -API in Delphi zu implementieren, mit der Pascal -Entwickler maschinelle Lernmodelle mit dem Pascal Delphi (Porting to Free Pascal in der Zukunft) entwickeln, trainieren und bereitstellen können).
Master Branch basiert auf TensorFlow v2.11. Kein Python -Motor oder keine Installation erforderlich .
Die Absicht ist es, beliebte Datenwissenschaftstechnologie in die Delphi -Welt zu bringen und .Delphi/Pascal -Entwickler mit einem leistungsstarken Werkzeugset für maschinelles Lernen zu versorgen, ohne das Rad neu zu erfinden. Da die APIs so ähnlich wie möglich gehalten werden, können Sie den vorhandenen Tensorflow -Code in Delphi sofort mit einer Null -Lernkurve anpassen. Schauen Sie sich ein Vergleichsbild an und sehen Sie, wie bequem ein Tensorflow/Python -Skript in ein Delphi -Programm mit TensorFlow.delphi übersetzt wird.


Keras Beispiele:


Durch die Philosophie kann eine große Anzahl von in Python geschriebenen Code für maschinelles Lernen schnell nach Delphi migriert werden, sodass Delphi/Pascal -Entwickler moderne maschinelle Lernmodelle verwenden und auf eine große Anzahl von Tensorflow -Ressourcen zugreifen können, die ohne dieses Projekt nicht möglich wären.
TensorFlow.delphi implementiert auch die hochstufige API von TensorFlow, bei der die gesamte Magie auftritt. Diese Schicht für die Erstellung von Berechnungsgraphen befindet sich noch unter aktiver Entwicklung. Sobald es vollständig implementiert ist, können Sie neue Modelle für maschinelles Lernen in Delphi-Pascal erstellen.
Als Referenzcode habe ich verwendet
Tesorflow.net
Tensorflow Python
Lineare Regression im Graph -Modus:
function LinearRegression.Run (mmo1: TMemo): Boolean;
begin
tf.compat.v1.disable_eager_execution;
PrepareData;
// tf Graph Input
var X : TTensor := tf.placeholder(tf.float32_t);
var Y : TTensor := tf.placeholder(tf.float32_t);
// Set model weights
// We can set a fixed init value in order to debug
// var rnd1 = rng.randn<float>();
// var rnd2 = rng.randn<float>();
var W := tf.Variable(Single(- 0.06 ), ' weight ' );
var b := tf.Variable(Single(- 0.73 ), ' bias ' );
// Construct a linear model
var pred : TTensor := tf.add(tf.multiply(X, W), b);
// var pred1 := (X * W) + b; OK
// Mean squared error
var cost := TTensor(tf.reduce_sum(tf. pow (pred - Y, 2.0 ))) / ( 2.0 * n_samples) ;
// Gradient descent
// Note, minimize() knows to modify W and b because Variable objects are trainable=True by default
var optimizer := tf.train.GradientDescentOptimizer(learning_rate).minimize(cost);
// Initialize the variables (i.e. assign their default value)
var init := tf.global_variables_initializer;
// Start training
var sess := tf.Session;
// Run the initializer
sess.run(init);
// Fit all training data
var epoch: Integer ;
for epoch := 0 to training_epochs - 1 do
begin
for var zItem in TUtils.zip<Single>(train_X, train_Y) do
begin
var v_x : Single := zItem.Value1 ;
var v_y : Single := zItem.Value2 ;
sess.run(optimizer, [ Tuple<TValue,TValue>.Create(X, v_x), Tuple<TValue,TValue>.Create(Y, v_y) ]);
end ;
// Display logs per epoch step
if ((epoch + 1 ) mod display_step) = 0 then
begin
var fc : Single := NDArray(sess.run(cost, [ Tuple<TValue,TValue>.Create(X, train_X), Tuple<TValue,TValue>.Create(Y, train_Y) ]));
var fW : Single := NDArray(sess.run( TResourceVariable(W) ));
var fb : Single := NDArray(sess.run( TResourceVariable(b) ));
mmo1.Lines.Add( Format( ' Epoch: %d cost=%.9f + "W=%.9f b=%.9f" ' ,[epoch + 1 ,fc, fW,fb]) );
end ;
end ;
mmo1.Lines.Add( ' Optimization Finished! ' );
var training_cost : Single := NDArray(sess.run(cost, [ Tuple<TValue,TValue>.Create(X, train_X), Tuple<TValue,TValue>.Create(Y, train_Y) ]));
var fW : Single := NDArray(sess.run( TResourceVariable(W) ));
var fb : Single := NDArray(sess.run( TResourceVariable(b) ));
mmo1.Lines.Add( ' ' );
mmo1.Lines.Add(Format( ' Training cost=%.9f W=%.9f b=%.9f ' ,[training_cost, fW, fb]));
// Testing example
var test_X : NDArray := np.np_array( TArray<Single>.Create( 6.83 , 4.668 , 8.9 , 7.91 , 5.7 , 8.7 , 3.1 , 2.1 ) );
var test_Y : NDArray := np.np_array( TArray<Single>.Create( 1.84 , 2.273 , 3.2 , 2.831 , 2.92 , 3.24 , 1.35 , 1.03 ) );
mmo1.Lines.Add( ' Testing... (Mean square loss Comparison) ' );
var t_cost := TTensor(tf.reduce_sum(tf. pow (pred - Y, 2.0 ))) / ( 2.0 * test_X.shape[ 0 ]) ;
var testing_cost : Single := NDArray(sess.run(t_cost, [ Tuple<TValue,TValue>.Create(X, test_X), Tuple<TValue,TValue>.Create(Y, test_Y) ]));
mmo1.Lines.Add( ' ' );
mmo1.Lines.Add( Format( ' Testing cost=%.9f ' ,[testing_cost]) );
var diff := Abs( training_cost - testing_cost);
mmo1.Lines.Add( Format( ' Absolute mean square loss difference: %.9f ' ,[diff]) );
mmo1.Lines.Add( ' ' );
Result := diff < 0.01 ;
end ;Kompatibel mit allen Delphi -Versionen, die die Inline -Variable (10,3 und höher) unterstützen.
Zum Kompilieren benötigen Sie einige externe Bibliotheken:
Haben Sie Lust auf eines der heißesten Projekte im Bereich des maschinellen Lernens? Möchten Sie wissen, wie TensorFlow das Rechendiagramm auf magische Weise erstellt? Wir schätzen jeden Beitrag, wie klein sie auch sein mögen. Es gibt Aufgaben für Anfänger für Experten gleichermaßen, wenn jeder nur eine kleine Aufgabe angeht, wird die Summe der Beiträge enorm sein.
Du kannst:
Folgen Sie uns auf Twitter