Tensorflow.delphi (tf.delphi) fournit une liaison standard Delphi (Pascal) pour TensorFlow et Keras. Il vise à implémenter l'API TensorFlow complète à Delphi qui permet aux développeurs Pascal de développer, former et déployer des modèles d'apprentissage automatique avec le Pascal Delphi (portant pour libérer Pascal à l'avenir).
Master Branch est basé sur TensorFlow v2.11. Aucun moteur Python ou installation requis .
L' intention est d'amener les technologies de science des données populaires dans le monde de Delphi et de fournir aux développeurs .Delphi / Pascal avec un puissant ensemble d'outils d'apprentissage automatique sans réinventer la roue. Étant donné que les API sont maintenues aussi similaires que possible, vous pouvez immédiatement adapter tout code TensorFlow existant à Delphi avec une courbe d'apprentissage zéro. Jetez un œil à une image de comparaison et voyez à quel point un script TensorFlow / Python se traduit par un programme Delphi avec Tensorflow.delphi.


Exemples Keras:


La philosophie permet à un grand nombre de code d'apprentissage automatique écrit à Python d'être rapidement migré vers Delphi, permettant aux développeurs Delphi / Pascal d'utiliser des modèles d'apprentissage automatique de pointe et d'accéder à un grand nombre de ressources TensorFlow qui ne seraient pas possibles sans ce projet.
Tensorflow.delphi implémente également l'API de haut niveau de TensorFlow où toute la magie se produit. Cette couche de construction de graphiques de calcul est toujours en cours de développement actif. Une fois qu'il est complètement mis en œuvre, vous pouvez créer de nouveaux modèles d'apprentissage automatique à Delphi-Pascal.
En tant que code de référence que j'ai utilisé
Tesorflow.net
Tensorflow Python
Régression linéaire en mode Graph :
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 ;Compatible avec toutes les versions Delphi qui prennent en charge la variable en ligne (10,3 et plus).
Pour compiler, vous avez besoin de bibliothèques externes:
Vous avez envie de contribuer à l'un des projets les plus chauds du domaine de l'apprentissage automatique? Vous voulez savoir comment TensorFlow crée par magie le graphique de calcul? Nous apprécions chaque contribution aussi petite. Il y a des tâches pour les novices aux experts, si tout le monde ne s'attaque qu'une petite tâche, la somme des contributions sera énorme.
Tu peux:
Suivez-nous sur Twitter