Tensorflow.delphi (tf.delphi) proporciona una unión estándar de Delphi (PASCAL) para TensorFlow y Keras. Su objetivo es implementar la API completa de TensorFlow en Delphi, que permite a los desarrolladores de Pascal desarrollar, entrenar e implementar modelos de aprendizaje automático con el Pascal Delphi (que se transfiere a Pascal libre en el futuro).
Master Branch se basa en TensorFlow v2.11. No se requiere motor o instalación de Python .
La intención es llevar la tecnología popular de ciencia de datos al mundo de Delphi y proporcionar a los desarrolladores .delphi/Pascal un poderoso conjunto de herramientas de aprendizaje automático sin reinventar la rueda. Dado que las API se mantienen lo más similar posible, puede adaptar inmediatamente cualquier código de flujo tensor existente en Delphi con una curva de aprendizaje cero. Eche un vistazo a una imagen de comparación y vea cuán cómodamente un script TensorFlow/Python se traduce en un programa Delphi con TensorFlow.delphi.


Ejemplos de Keras:


La filosofía permite que una gran cantidad de código de aprendizaje automático escrito en Python se migren rápidamente a Delphi, lo que permite a los desarrolladores de Delphi/Pascal utilizar modelos de aprendizaje automático de vanguardia y acceder a una gran cantidad de recursos de flujo de tensor que no serían posibles sin este proyecto.
Tensorflow.delphi también implementa la API de alto nivel de Tensorflow donde sucede toda la magia. Esta capa de construcción de gráficos de cálculo todavía está en desarrollo activo. Una vez que se implementa por completo, puede construir nuevos modelos de aprendizaje automático en Delphi-Pascal.
Como código de referencia que utilicé
Tesorflow.net
Tensorflow python
Regresión lineal en modo 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 con todas las versiones de Delphi que admiten la variable en línea (10.3 y superior).
Para compilar, necesita algunas bibliotecas externas:
¿Tienes ganas de contribuir a uno de los proyectos más populares en el campo de aprendizaje automático? ¿Quieres saber cómo TensorFlow crea mágicamente el gráfico computacional? Apreciamos cada contribución por pequeña. Hay tareas para novatos a expertos, si todos abordan solo una pequeña tarea, la suma de las contribuciones será enorme.
Puede:
Síguenos en Twitter