[轉]在C#中像Python一樣編寫TensorFlow機器學習代碼

?

機器學習是一個令人激動人心的領域,一直有新的技術突破。研究人員不斷推動機器智能的提升,教機器如何聽說讀寫——這些曾經是我們人類專屬的技能。機器學習的首選語言是Python,最受歡迎的庫是Google的TensorFlow。幾乎所有的代碼示例都是用Python編寫的,并且依賴于TensorFlow和NumPy庫。對于C#和.NET的開發人員來說,我們在面臨著一個嚴峻的選擇:要么學習Python,要么使用NET機器學習庫,并從頭開始精心編寫我們自己的C#代碼

?

事實上,這就是我在機器學習課程中常用的策略。我研究了許多使用Keras和TensorFlow的Python代碼,然后我從頭開始編寫自己的C#代碼,使用原生的CNTK和ML.NET庫代替。這種方法很有效,但它也有一些缺點:

?

  • 我的學生習慣于.NET,這些編碼技巧不容易轉移到Python。
  • CNTK和ML.NET不支持某些TensorFlow功能,因此我必須使用Python代碼向C#開發人員演示它們。

?

我一直在努力在.NET中編寫機器學習庫,模仿Python的API和編碼風格,如NativeKeras和KerasSharp,但這些項目不再處于積極開發的階段。我一直在尋找一個全面的.NET庫,它完全模仿了如何用Python編寫機器學習代碼,終于我發現了她——SciSharp。SciSharp正在為數據科學,機器學習和人工智能構建一個.NET開源生態系統,其理念是C#機器學習代碼應該像對應的Python代碼一樣盡可能地語法,與編程的感覺。

?

看看下面的例子 - 這是TensorFlow中的簡單線性回歸演示。 Python代碼在左側,相應的C#代碼在右側:
在這里插入圖片描述
右邊的代碼看起來像Python,但它是實際的C#代碼。 它使用一個名為TesorFlow.NET的包裝器在幕后調用真正的TensorFlow庫。請注意,我們已經有了TensorFlow包裝器; 幾年前,Xamarin創始人米格爾大神建造了優秀的TensorFlowSharp。 但是,他的庫只暴露了低級別的TensorFlow API。 相比之下,SciSharp庫神奇地暴露了所有TensorFlow,包括高級圖形構建功能。

?

TensorFlow在很大程度上依賴于NumPy,這是一個高性能的Python數學庫,可以在內存中處理非常大的數據數組。 因此,SciSharp團隊開發了自己的版本NumSharp,這是NumPy到C#的端口。
在這里插入圖片描述
NumSharp遵循與原始NumPy完全相同的編碼風格。 使用左側的Python代碼和右側的相應C#代碼查看此示例:同樣,右邊的代碼遵循與Python相同的語法約定和API樣式,但它實際上是C#代碼。

?

SciSharp團隊在這里取得了一項重大成就。 使用TensorFlow.NET和NumSharp,我們實際上可以使用Python代碼示例,將它們復制并粘貼到C#文件中,然后只需稍作修改即可運行它們——這為.NET開發人員打開了完整的機器學習生態系統。

?

我決定采用SciSharp。查看以下說明,以便在C#中啟動并運行您自己的TensorFlow代碼。我將構建一個簡單的線性回歸演示,它適合一些樣本數據的回歸線。

?

讓我們開始吧。以下是在.NET Core中設置新控制臺項目的方法:

?

$ dotnet new console -o LinearRegression
$ cd LinearRegression

?

?

接下來,我需要安裝我需要的軟件包:

?

$ dotnet add package TensorFlow.NET

?

?

就這樣簡單!這將安裝TensorFlow.NET包,它也將自動拉入NumSharp。該軟件包還安裝了Microsoft.ML.TensorFlow.Redist,它是本機TensorFlow庫的跨平臺安裝程序。這將在Windows,Linux和OS / X上為您設置一切。

?

現在我準備開始編碼了。這是Program.cs的上半部分應該是這樣的:

?

using System;
using NumSharp;
using Tensorflow;
using static Tensorflow.Python;namespace LinearRegression
{/// <summary>/// The main program class/// </summary>public class Program{/// <summary>/// The main program entry point/// </summary>/// <param name="args">The command line arguments</param>public static void Main(string[] args){// load the datavar dataX = 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 dataY = 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 samples = dataX.shape[0];// the rest of the code goes here...}}
}

?

?

這是一個簡單的.NET Core控制臺應用程序。 請注意使用訓練數據設置NumPy數組的np.array方法。 shape [0]調用檢索數組的長度,就像在Python中一樣。現在我將在TensorFlow中設置一個簡單的線性回歸模型:

?

此代碼調用tf.placeholder來設置模型輸入和輸出:X表示輸入數據,Y表示輸出數據。
以下兩個調用tf.Variable設置權重和偏差模型變量。 這些變量組合成一個模型如下:
在這里插入圖片描述

?

讀者會發現這只是線性回歸的等式。 TensorFlow將在訓練期間調整W和b變量以找到完美的回歸線。
最后,代碼在損失變量中設置了一個損失函數。 損失函數是一種表達式,其值在訓練期間需要最小化。 我將使用均方誤差或MSE:
在這里插入圖片描述
這只是模型預測與實際值之差的平方和。接下來,我將訓練這個模型1000次:

?

// use these training parameters
var epochs = 1000;
var learningRate = 0.01f;
var displayEvery = 50;// use a gradient descent optimizer
var optimizer = tf.train.GradientDescentOptimizer(learningRate).minimize(loss);// train the model
var init = tf.global_variables_initializer();
with(tf.Session(), sess => 
{sess.run(init);// run training epochsConsole.WriteLine("Training model...");for (int epoch = 0; epoch < epochs; epoch++){foreach (var (x, y) in zip<float>(dataX, dataY)){sess.run(optimizer, new FeedItem(X, x),new FeedItem(Y, y));}// display intermittent resultsif ((epoch + 1) % displayEvery == 0){var lossValue = sess.run(loss, new FeedItem(X, dataX), new FeedItem(Y, dataY));Console.WriteLine($"  epoch: {epoch + 1}\tMSE = {lossValue}\tW = {sess.run(W)}\tb = {sess.run(b)}");}}// show final training lossvar trainingLoss = sess.run(loss,new FeedItem(X, dataX),new FeedItem(Y, dataY));Console.WriteLine($"  Final MSE = {trainingLoss}");// the rest of the code goes here...
});

?

?

代碼設置GradientDescentOptimizer以最小化損失函數,并使用tf.Session()啟動TensorFlow會話。TensorFlow中的所有內容都需要調用tf.run()來執行。所以我首先設置了一個global_variables_initializer來初始化模型,然后運行它。然后我運行優化器1000個時期來訓練模型,每50個時期我運行損失函數并顯示中間訓練損失。循環完成后,我再次運行損失功能并顯示最終的訓練損失。

?

我現在有一個訓練有素的好模型,是時候在一些新數據上測試這個模型:

?

// load validation data
var testDataX = np.array(6.83f, 4.668f, 8.9f, 7.91f, 5.7f, 8.7f, 3.1f, 2.1f);
var testDataY = np.array(1.84f, 2.273f, 3.2f, 2.831f, 2.92f, 3.24f, 1.35f, 1.03f);
var validationSamples = testDataX.shape[0];// validate the model
Console.WriteLine("Validating model...");
var validationLoss = tf.reduce_sum(tf.pow(model - Y, 2.0f)) / validationSamples;
var lossValue2 = sess.run(validationLoss, new FeedItem(X, testDataX), new FeedItem(Y, testDataY));
Console.WriteLine($"  Validation loss = {lossValue2}");

?

?

代碼調用np.array來設置新的驗證數據,并設置一個新的validationLoss函數來在驗證期間計算MSE。然后它在驗證數據上運行此損失函數,并在控制臺上顯示驗證丟失。就是這樣。這是TensorFlow中的完整線性回歸演示。
此代碼將在所有主要操作系統上運行 - Windows,Linux和OS / X.您可以在控制臺上運行代碼,如下所示:

?

$ dotnet run

?

?

或者通過點擊F5在Visual Studio Code中。這是在最新版本的VS Code中在我的Mac上運行的應用程序:
在這里插入圖片描述
這是在終端的命令行上運行的相同應用程序:

?

在這里插入圖片描述
經過1000個訓練時期后,我最終損失了0.1548。完全訓練的模型在驗證數據上的損失為0.1572。

?

這是一個最初用Python編寫的TensorFlow線性回歸演示,現在移植到C#,只有很少的語法更改。
有數千個類似的代碼示例,現在它們都可供C#開發人員訪問。

?

你意如何?準備好開始用TensorFlow.NET和NumSharp編寫C#機器學習應用了嗎?

?

作者:Mark Farragher
英文版地址:https://medium.com/machinelearningadvantage/run-tensorflow-machine-learning-code-in-c-with-almost-no-changes-77f7b629389


---------------------
作者:SciSharp Stack
來源:CSDN
原文:https://blog.csdn.net/SciSharp/article/details/100223186
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285624.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285624.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【土地評價與土地管理】教案 第一章:土地評價要素的選擇

文章目錄 1.1 土地構成要素與其農業利用1、光能條件2、熱量條件3、降水條件1.1 土地構成要素與其農業利用 1、光能條件 ? 光能是綠色植物進行光合作用和生物運動發展的主要能源 ? 太陽輻射、日照時數 ? 太陽輻射量隨地域和季節變化較大,導致了土地利用的多樣性和土地資源…

Blazor University (33)表單 —— EditContext、FieldIdentifiers

原文鏈接&#xff1a;https://blazor-university.com/forms/editcontext-fieldidentifiers-and-fieldstate/EditContext、FieldIdentifiers 和 FieldState請注意&#xff0c;對于那些希望了解 Blazor 如何“在后臺”工作的人來說&#xff0c;這是一個高級主題。無需了解此信息即…

Flutter之Container的寬度如何設置為手機屏幕寬度

1、問題 Container的寬度如何設置為手機屏幕寬度 2、解決辦法 width: MediaQuery.of(context).size.width,Row(children: [Container(height: 40,width: MediaQuery.of(context).size.width,// width: double.infinity,color: Colors.red,child: Row(children: [Containe…

團隊項目開發篇章8

例會時間&#xff1a;2016.11.3 整理&#xff1a;姬索肇 例會照片 每個人的工作 任務分配 我們今天與王鹿鳴學長和李云濤學長針對團隊開發過程中遇到的問題進行了討論&#xff0c;非常感謝學長們的熱心幫助&#xff0c;同時我們也被他們強大的編程能力所折服~ 在這里為學長們點…

MongoDB常用命令

啟動MongoDB$mongod --fork --logpath/data/log/r3.log--fork 允許mongod后臺運行&#xff0c;但是必須指定日志記錄文件路徑&#xff08;Enables a daemon mode that runs the mongos process in the background.&#xff09;--logpath 指定日志記錄文件路徑 導出Collections$…

【地理信息系統GIS】教案(七章全)第一章:地理信息系統概述

文章目錄 第一節 GIS基本概念第二節 GIS的組成第三節 GIS的功能第四節 GIS的發展第一節 GIS基本概念 1.1 GIS基本概念 1、信息 是用文字、數字、符號、語言、圖象、圖形等介質來表達事件、事物或現象等的內容、數量和特征,從而向人們(或系統)提供關于現實世界新的事實和知…

C# 讀寫ini文件 保存信息

/// <summary> /// 獲取本地信息 /// </summary> /// <returns></returns> private List<MHistoryKewWord> GetLocalHistoryKeyWords(){List<MHistoryKewWord> list new List<MHistoryKewWord>();var fs new FileStream("dat…

表達式的動態解析和計算,Flee用起來真香

前言在很多項目中經常會出現需要動態解析表達式和計算的場景&#xff0c;比如一些自動審核規則&#xff0c;或者是一些變量的值通過維護的公式在運行過程中動態算出&#xff1b;由于場景需求&#xff0c;都需要比較靈活的配置對應的表達式&#xff0c;然后希望在需要的時候能根…

C語言九十五之實現經典的反轉數組(通過指針或數組下標操作)

?作者簡介&#xff1a;大家好我是碼瑪莎拉蒂&#xff0c;CSDN博客專家&#x1f947;&#x1f947;&#x1f947; &#x1f4c3;個人主頁&#xff1a;個人主頁 &#x1f525;系列專欄&#xff1a;C語言試題200例 &#x1f4ac;推薦一款模擬面試、刷題神器&#x1f449; 點擊跳轉…

Linux下使用shell實現上傳linux下某個目錄下所有文件到ftp

首先我們需要搞清楚單個文件怎么上傳&#xff0c;把這個單文件上傳到ftp上的實現命名為一個:upload_to_ftp_command.sh 之后&#xff0c;需要弄清楚怎么實現遍歷一個目錄下的所有文件的&#xff0c;把這個遍歷某個目錄下的文件實現命名為&#xff1a;foeach_directory_and_uplo…

【地理信息系統GIS】教案(七章全)第二章:地理信息系統數據結構及數據獲取

文章目錄 第一節 地理空間及其表達第二節 空間數據采集第三節 屬性數據采集第四節 空間數據格式轉換第五節 空間數據質量第一節 地理空間及其表達 1.1 地理空間 地理空間上至大氣電離層,下至地幔莫霍面,是生命過程活躍的場所,也是宇宙過程對地球影響最大的區域。 地理信息…

[轉]Mysql數據庫開發的36條原則

前言 這些原則都是經歷過實戰總結而成 每一條原則背后都是血淋淋的教訓 這些原則主要是針對數據庫開發人員&#xff0c;在開發過程中務必注意 總是在災難發生后&#xff0c;才想起容災的重要性&#xff1b; 總是在吃過虧以后&#xff0c;才記得曾有人提醒過。 一、核心原則…

Kamp;R練習題6-1統計關鍵詞出現的次數

這道練習題訓練了&#xff1a; 1.結構體數組 2.二分查找 3.指針操作 ---- 都不難。但非常基礎&#xff0c;我認為非常好&#xff0c;做完了記到博客上來&#xff0c;題目見k&R&#xff0c;實現例如以下&#xff1a; /** Practice of struct array. K&R 6-1* author : w…

大話領域驅動設計——表示層及其他

概述表示層又稱用戶界面層&#xff0c;包含應用程序的頁面、組件等UI元素。服務層提供項目的HTTP API接口&#xff0c;包含MVC Controller和相關組件。ABP框架雖然在表示層提供了不少組件&#xff0c;但是這些和DDD本身沒有多少關系。而且隨著前后端分離架構的流行&#xff0c;…

C語言九十六之實現經典的字符串反轉(通過指針或下標操作)

?作者簡介&#xff1a;大家好我是碼莎拉蒂&#xff0c;CSDN博客專家&#x1f947;&#x1f947;&#x1f947; &#x1f4c3;個人主頁&#xff1a;個人主頁 &#x1f525;系列專欄&#xff1a;C語言試題200例 &#x1f4ac;推薦一款模擬面試、刷題神器&#x1f449; 點擊跳轉進…

Windows10家庭中文版沒有本地策略選項完美解決方案

Win+R,在運行中輸入:secpol.msc,查看安全設置是否打開,如下圖所示。 組策略對于優化和維護Windows系統來說十分重要。眾所周知,Windows 10家庭版中并不包含組策略,對于使用家庭版Windows的朋友來說,十分不方便。 通常情況下,如果策略組沒有打開的話,在安裝CAD等軟件時…

JavaScript總結(六)

使用DOM操縱樣式表 ? 操縱元素的Style樣式屬性&#xff08;所有的均對于CSS的內聯式&#xff09; 對于每個CSS樣式&#xff0c;Style對象都包含了一個相對應的屬性&#xff0c;只需要用到style屬性即可&#xff1b; Div.style.color "red"; //給div元素設置字體顏色…

[轉]淺談CMD和win powershell的區別

1、前言&#xff1a;本文給大家簡單描述了一下POWERSHELL和CMD的區別&#xff0c;簡單的說&#xff0c;Powershell是cmd的超集&#xff0c;換句話說&#xff0c;cmd能做的事情&#xff0c;Powershell都能做&#xff0c;但是Powershell還能額外做許多cmd不能做的活。 2、cmd是和…

【ArcGIS風暴】柵格計算器(Raster Calculator)運算出現錯誤問題及解決方案匯總

柵格計算器(Raster Calculator) 是一種空間分析函數工具,可以輸入地圖代數表達式,使用運算符和函數來做數學計算,建立選擇查詢,或鍵入地圖代數語法。只有熟練的運用并記憶一些常用的公式,才能很好的運用柵格計算器。在使用的過程中,容易出現這樣那樣的問題,本文就把柵…

「博客之星」評選,互投5星,留鏈必投

?? ? ?? 歡迎誠信互投? ? ? ?? ????? 謝謝各位大佬門&#xff0c;互投5星????? 投票地址&#xff1a; https://bbs.csdn.net/topics/603958492 投票地址&#xff1a; https://bbs.csdn.net/topics/603958492 投票地址&#xff1a; https://bbs.csdn.net…