英语 | 中文
重要的
我们很高兴我们在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 尽可能保持相似,您可以立即以零学习曲线调整 C# 或 F# 中的任何现有 TensorFlow 代码。看一下比较图,看看 TensorFlow/Python 脚本如何轻松地通过 TensorFlow.NET 转换为 C# 程序。
SciSharp 的理念允许大量用 Python 编写的机器学习代码快速迁移到 .NET,使 .NET 开发人员能够使用最先进的机器学习模型并访问大量 TensorFlow 资源,如果没有这个项目,这是不可能实现的。
与其他项目相比,例如 TensorFlowSharp 仅提供 TensorFlow 的低级 C++ API,并且只能运行使用 Python 构建的模型,Tensorflow.NET 可以使用纯 C# 和 F# 构建训练和推理管道。此外,Tensorflow.NET 提供了 Tensorflow.Keras 的绑定,使您可以轻松地将代码从 python 传输到 .NET。
ML.NET 还采用 Tensorflow.NET 作为后端之一来训练和推断模型,这提供了与 .NET 更好的集成。
简介及简单示例:Tensorflow.NET文档
详细文档:The Definitive Guide to Tensorflow.NET
示例:TensorFlow.NET示例
运行示例或安装疑难解答:Tensorflow.NET FAQ
您可以在 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 中运行此示例。
Keras
功能 API 中ResNet
的玩具版本 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,CUDA 10.0 | 张量流1.15,CUDA 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 | x | |||||
tf.net 0.7x,tf.keras 0.7 | x | |||||
tf.net 0.4x,tf.keras 0.5 | x | |||||
tf.net 0.3x,tf.keras 0.4 | x | |||||
tf.net 0.2x | x | x | ||||
tf.net 0.15 | x | x | ||||
tf.net 0.14 | x |
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 中单步执行,以查看执行流程在哪里偏离或变量在哪里表现出不同的值。像 PyCharm 这样的优秀 Python IDE 可以让您单步执行 Tensorflow 库代码。
将 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 的一部分