英語 | 中文
重要的
我們很高興我們在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 的一部分