английский | 中文
Важный
Мы рады, что наша работа на tensorflow.net привлекла много пользователей. Однако в настоящее время ни один из основных разработчиков этого репозитория не доступен для новых функций и исправления ошибок. Мы не откажемся от PR и поможем их просмотреть.
Если вы хотите стать участником или сопровождающим tensorflow.net, мы хотели бы помочь вам начать работу.
Мы сожалеем об этом и возобновим поддержку этого проекта, как только у кого-то из нас появится для этого пропускная способность.
master и v0.100.x соответствует tensorflow v2.10, v0.6x — из tensorflow v2.6, v0.15-tensorflow1.15 — из tensorflow1.15. Пожалуйста, добавьте https://www.myget.org/F/scisharp/api/v3/index.json
в исходный код nuget, чтобы использовать ночной выпуск.
Миссия SciSharp STACK
— внедрить популярные технологии обработки данных в мир .NET и предоставить разработчикам .NET мощный набор инструментов машинного обучения, не изобретая велосипед заново. Поскольку API-интерфейсы максимально схожи, вы можете немедленно адаптировать любой существующий код TensorFlow на C# или F# с нулевой кривой обучения. Взгляните на сравнительное изображение и посмотрите, насколько удобно сценарий TensorFlow/Python преобразуется в программу C# с помощью TensorFlow.NET.
Философия SciSharp позволяет быстро перенести большое количество кода машинного обучения, написанного на Python, на .NET, что позволяет разработчикам .NET использовать передовые модели машинного обучения и получать доступ к огромному количеству ресурсов TensorFlow, что было бы невозможно без этого проекта.
По сравнению с другими проектами, такими как, например, TensorFlowSharp, которые предоставляют только низкоуровневый C++ API TensorFlow и могут запускать только модели, созданные с использованием Python, Tensorflow.NET позволяет построить конвейер обучения и вывода с использованием чистого C# и F#. Кроме того, Tensorflow.NET обеспечивает привязку Tensorflow.Keras, чтобы упростить перенос вашего кода с Python на .NET.
ML.NET также использует Tensorflow.NET в качестве одного из серверов для обучения и вывода вашей модели, что обеспечивает лучшую интеграцию с .NET.
Введение и простые примеры: Документы Tensorflow.NET
Подробная документация: Полное руководство по Tensorflow.NET.
Примеры: Примеры TensorFlow.NET
Устранение неполадок при запуске примера или установки: Часто задаваемые вопросы по Tensorflow.NET
Вы можете выполнить поиск по имени пакета в NuGet Manager или использовать приведенные ниже команды в консоли диспетчера пакетов.
Установка состоит из двух частей, первая – основной корпус:
# ## Install Tensorflow.NET
PM > Install-Package TensorFlow.NET
# ## Install Tensorflow.Keras
PM > Install-Package TensorFlow.Keras
Вторая часть — это часть вычислительной поддержки. В зависимости от вашего устройства и системы необходим только один из следующих пакетов.
### CPU version for Windows and Linux
PM> Install-Package SciSharp.TensorFlow.Redist
### CPU version for MacOS
PM> Install-Package SciSharp.TensorFlow.Redist-OSX
### GPU version for Windows (CUDA and cuDNN are required)
PM> Install-Package SciSharp.TensorFlow.Redist-Windows-GPU
### GPU version for Linux (CUDA and cuDNN are required)
PM> Install-Package SciSharp.TensorFlow.Redist-Linux-GPU
Здесь приведены два простых примера, чтобы познакомить вас с основами использования Tensorflow.NET. Как видите, такой же код C# на Python легко написать.
Eager
using static Tensorflow . Binding ;
using static Tensorflow . KerasApi ;
using Tensorflow ;
using Tensorflow . NumPy ;
// Parameters
var training_steps = 1000 ;
var learning_rate = 0.01f ;
var display_step = 100 ;
// Sample data
var X = np . array ( 3.3f , 4.4f , 5.5f , 6.71f , 6.93f , 4.168f , 9.779f , 6.182f , 7.59f , 2.167f ,
7.042f , 10.791f , 5.313f , 7.997f , 5.654f , 9.27f , 3.1f ) ;
var Y = np . array ( 1.7f , 2.76f , 2.09f , 3.19f , 1.694f , 1.573f , 3.366f , 2.596f , 2.53f , 1.221f ,
2.827f , 3.465f , 1.65f , 2.904f , 2.42f , 2.94f , 1.3f ) ;
var n_samples = X . shape [ 0 ] ;
// We can set a fixed init value in order to demo
var W = tf . Variable ( - 0.06f , name : " weight " ) ;
var b = tf . Variable ( - 0.73f , name : " bias " ) ;
var optimizer = keras . optimizers . SGD ( learning_rate ) ;
// Run training for the given number of steps.
foreach ( var step in range ( 1 , training_steps + 1 ) )
{
// Run the optimization to update W and b values.
// Wrap computation inside a GradientTape for automatic differentiation.
using var g = tf . GradientTape ( ) ;
// Linear regression (Wx + b).
var pred = W * X + b ;
// Mean square error.
var loss = tf . reduce_sum ( tf . pow ( pred - Y , 2 ) ) / ( 2 * n_samples ) ;
// should stop recording
// Compute gradients.
var gradients = g . gradient ( loss , ( W , b ) ) ;
// Update W and b following gradients.
optimizer . apply_gradients ( zip ( gradients , ( W , b ) ) ) ;
if ( step % display_step == 0 )
{
pred = W * X + b ;
loss = tf . reduce_sum ( tf . pow ( pred - Y , 2 ) ) / ( 2 * n_samples ) ;
print ( $" step: { step } , loss: { loss . numpy ( ) } , W: { W . numpy ( ) } , b: { b . numpy ( ) } " ) ;
}
}
Запустите этот пример в Jupyter Notebook.
ResNet
в функциональном API Keras
. using static Tensorflow . Binding ;
using static Tensorflow . KerasApi ;
using Tensorflow ;
using Tensorflow . NumPy ;
var layers = keras . layers ;
// input layer
var inputs = keras . Input ( shape : ( 32 , 32 , 3 ) , name : " img " ) ;
// convolutional layer
var x = layers . Conv2D ( 32 , 3 , activation : " relu " ) . Apply ( inputs ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " ) . Apply ( x ) ;
var block_1_output = layers . MaxPooling2D ( 3 ) . Apply ( x ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " , padding : " same " ) . Apply ( block_1_output ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " , padding : " same " ) . Apply ( x ) ;
var block_2_output = layers . Add ( ) . Apply ( new Tensors ( x , block_1_output ) ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " , padding : " same " ) . Apply ( block_2_output ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " , padding : " same " ) . Apply ( x ) ;
var block_3_output = layers . Add ( ) . Apply ( new Tensors ( x , block_2_output ) ) ;
x = layers . Conv2D ( 64 , 3 , activation : " relu " ) . Apply ( block_3_output ) ;
x = layers . GlobalAveragePooling2D ( ) . Apply ( x ) ;
x = layers . Dense ( 256 , activation : " relu " ) . Apply ( x ) ;
x = layers . Dropout ( 0.5f ) . Apply ( x ) ;
// output layer
var outputs = layers . Dense ( 10 ) . Apply ( x ) ;
// build keras model
var model = keras . Model ( inputs , outputs , name : " toy_resnet " ) ;
model . summary ( ) ;
// compile keras model in tensorflow static graph
model . compile ( optimizer : keras . optimizers . RMSprop ( 1e-3f ) ,
loss : keras . losses . SparseCategoricalCrossentropy ( from_logits : true ) ,
metrics : new [ ] { " acc " } ) ;
// prepare dataset
var ( ( x_train , y_train ) , ( x_test , y_test ) ) = keras . datasets . cifar10 . load_data ( ) ;
// normalize the input
x_train = x_train / 255.0f ;
// training
model . fit ( x_train [ new Slice ( 0 , 2000 ) ] , y_train [ new Slice ( 0 , 2000 ) ] ,
batch_size : 64 ,
epochs : 10 ,
validation_split : 0.2f ) ;
// save the model
model . save ( " ./toy_resnet_model " ) ;
Пример F# для линейной регрессии доступен здесь.
Более расширенные примеры можно найти в разделе «Примеры TensorFlow.NET».
Версии TensorFlow.NET | тензорный поток 1.14, куда 10.0 | тензорный поток 1.15, куда 10.0 | тензорный поток 2.3, cuda 10.1 | тензорный поток 2.4, cuda 11 | тензорный поток 2.7, cuda 11 | тензорный поток 2.10, cuda 11 |
---|---|---|---|---|---|---|
tf.net 0.10x, tf.keras 0.10 | х | |||||
tf.net 0.7x, tf.keras 0.7 | х | |||||
tf.net 0.4x, tf.keras 0.5 | х | |||||
tf.net 0.3x, tf.keras 0.4 | х | |||||
tf.net 0.2x | х | х | ||||
tf.net 0.15 | х | х | ||||
tf.net 0.14 | х |
tf.net 0.4x -> tf native 2.4
tf.net 0.6x -> tf native 2.6
tf.net 0.7x -> tf native 2.7
tf.net 0.10x -> tf native 2.10
...
Хотите внести свой вклад в один из самых популярных проектов в области машинного обучения? Хотите знать, как Tensorflow волшебным образом создает вычислительный граф?
Мы ценим каждый вклад, каким бы маленьким он ни был! Есть задания как для новичков, так и для экспертов: если каждый возьмется за небольшую задачу, сумма вклада будет огромной.
Ты можешь:
Лучший способ выяснить, почему модульный тест терпит неудачу, — это одновременно выполнить его на C# или F# и соответствующем ему Python, чтобы увидеть, где поток выполнения отклоняется или где переменные имеют разные значения. Хорошие IDE Python, такие как PyCharm, позволяют вам за один шаг войти в код библиотеки тензорного потока.
Добавьте SciSharp/TensorFlow.NET в качестве исходного кода в ваш локальный репозиторий...
git remote add upstream [email protected]:SciSharp/TensorFlow.NET.git
Пожалуйста, следите за тем, чтобы ваша вилка была актуальной, регулярно вытягивая ее из восходящего потока.
git pull upstream master
Купите нашу книгу, чтобы сделать проект с открытым исходным кодом устойчивым TensorFlow.NET实战
Присоединяйтесь к нашему чату в Discord или Gitter.
Следуйте за нами в Twitter, Facebook, Medium, LinkedIn.
TensorFlow.NET является частью SciSharp STACK.