Tensorflow.delphi (tf.delphi) обеспечивает стандартное связывание Delphi (Pascal) для Tensorflow и Keras. Он направлен на реализацию полного API Tensorflow в Delphi, который позволяет разработчикам Pascal разрабатывать, тренировать и развернуть модели машинного обучения с Pascal Delphi (переносив в Free Pascal в будущем).
Мастерская ветвь основана на Tensorflow v2.11. Не требуется двигатель Python или установка .
Цель состоит в том, чтобы ввести популярную технологию Data Science в мир Delphi и предоставить разработчикам Delphi/Pascal мощный набор инструментов машинного обучения без переосмысления колеса. Поскольку API сохраняются как можно более похожими, вы можете немедленно адаптировать любой существующий код Tensorflow в Delphi с нулевой кривой обучения. Взгляните на сравнение и посмотрите, насколько комфортно сценарий Tensorflow/Python переводится в программу Delphi с TensorFlow.delphi.


Примеры Керас:


Философия позволяет быстро мигрировать большое количество кода машинного обучения, написанного на Python, что позволяет разработчикам Delphi/Pascal использовать передовые модели машинного обучения и доступ к огромному количеству ресурсов Tensorflow, которые не были бы возможны без этого проекта.
Tensorflow.delphi также реализует API высокого уровня Tensorflow, где происходит вся магия. Этот слой здания вычислительного графа все еще находится в активной разработке. Как только он полностью реализован, вы можете создать новые модели машинного обучения в Delphi-Pascal.
В качестве справочного кода я использовал
Tesorflow.net
Tensorflow Python
Линейная регрессия в режиме 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 ;Совместим со всеми версиями Delphi, которые поддерживают встроенные переменные (10,3 и выше).
Для компиляции вам нужны внешние библиотеки:
Чувствуете, как внести свой вклад в один из самых горячих проектов в области машинного обучения? Хотите знать, как TensorFlow волшебным образом создает вычислительный график? Мы ценим каждый вклад, каким бы маленьким. Есть задачи для новичков для экспертов, если все выполняют лишь небольшую задачу, сумма вкладов будет огромной.
Ты можешь:
Следите за нами в Твиттере