日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

ML.NET 示例:图像分类模型训练-首选API(基于原生TensorFlow迁移学习)

發(fā)布時(shí)間:2023/12/4 asp.net 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ML.NET 示例:图像分类模型训练-首选API(基于原生TensorFlow迁移学习) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ML.NET 版本API 類型狀態(tài)應(yīng)用程序類型數(shù)據(jù)類型場(chǎng)景機(jī)器學(xué)習(xí)任務(wù)算法
Microsoft.ML 1.5.0動(dòng)態(tài)API最新控制臺(tái)應(yīng)用程序和Web應(yīng)用程序圖片文件圖像分類基于遷移學(xué)習(xí)的TensorFlow模型再訓(xùn)練進(jìn)行圖像分類DNN架構(gòu):ResNet、InceptionV3、MobileNet等

問(wèn)題

圖像分類是深度學(xué)習(xí)學(xué)科中的一個(gè)常見問(wèn)題。此示例演示如何通過(guò)基于遷移學(xué)習(xí)方法訓(xùn)練模型來(lái)創(chuàng)建您自己的自定義圖像分類器,該方法基本上是重新訓(xùn)練預(yù)先訓(xùn)練的模型(如InceptionV3或ResNet架構(gòu)),這樣您就可以在自己的圖像上訓(xùn)練自定義模型。

在這個(gè)示例應(yīng)用程序中,您可以創(chuàng)建自己的自定義圖像分類器模型,方法是使用自己的圖像從ML.NET API本機(jī)訓(xùn)練TensorFlow模型。

圖像分類器場(chǎng)景–使用ML.NET訓(xùn)練您自己的定制深度學(xué)習(xí)模型

數(shù)據(jù)集(圖像集)

圖像集許可證

此示例的數(shù)據(jù)集基于Tensorflow提供的“flower_photosimageset”,下載地址。此存檔中的所有圖像均獲得Creative Commons By Attribution許可證的許可,網(wǎng)址為:https://creativecommons.org/licenses/by/2.0/

完整的許可證信息在license.txt文件中提供,該文件包含在作為.zip文件下載的同一圖像集中。

默認(rèn)情況下,示例下載的imageset有200個(gè)圖像,平均分布在5個(gè)flower類中:

Images --> flower_photos_small_set -->|daisy|dandelion|roses|sunflowers|tulips

每個(gè)子文件夾的名稱很重要,因?yàn)樗鼘⑹悄P陀糜诜诸悎D像的每個(gè)類/標(biāo)簽的名稱。

機(jī)器學(xué)習(xí)任務(wù)-圖像分類

為了解決這個(gè)問(wèn)題,我們首先要建立一個(gè)ML模型。然后我們將在現(xiàn)有數(shù)據(jù)上訓(xùn)練模型,評(píng)估它有多好,最后我們將使用模型對(duì)新圖像進(jìn)行分類。


1. 將項(xiàng)目配置為使用GPU或CPU

默認(rèn)情況下,此解決方案使用CPU進(jìn)行訓(xùn)練和評(píng)分。但是,如果您的機(jī)器有一個(gè)兼容的GPU可用(基本上大多數(shù)NVIDIA GPU顯卡),您可以配置該項(xiàng)目使用GPU。

:警告:請(qǐng)確保使用下面列出的NuGet包的正確版本。其他版本可能與Nvidia CUDA v10.0不兼容

使用CPU進(jìn)行訓(xùn)練或推斷/評(píng)分

當(dāng)使用CPU時(shí),您的項(xiàng)目必須引用以下redist庫(kù):

  • SciSharp.TensorFlow.Redist (1.15.0)?(CPU training)

使用CPU的訓(xùn)練項(xiàng)目中的示例參考屏幕截圖:


使用GPU進(jìn)行訓(xùn)練或推斷/評(píng)分

使用GPU時(shí),項(xiàng)目必須引用以下redist庫(kù)(并刪除CPU版本引用):

  • SciSharp.TensorFlow.Redist-Windows-GPU (1.14.0)?(GPU training on Windows)

  • SciSharp.TensorFlow.Redist-Linux-GPU (1.14.0)?(GPU training on Linux)

使用GPU的訓(xùn)練項(xiàng)目中的示例參考屏幕截圖:


2. 構(gòu)建模型

構(gòu)建模型包括以下步驟:

  • 將圖像文件(本例中為文件路徑)加載到IDataView中

  • 使用ImageClassification評(píng)估器進(jìn)行圖像分類(高級(jí)API)

定義數(shù)據(jù)架構(gòu),并在從files文件夾加載圖像時(shí)引用該類型。

public?class?ImageData {public?ImageData(string?imagePath,?string?label){ImagePath?=?imagePath;Label?=?label;}public?readonly?string?ImagePath;public?readonly?string?Label; }

由于API使用內(nèi)存圖像,因此稍后您可以使用內(nèi)存圖像對(duì)模型進(jìn)行評(píng)分,因此需要定義一個(gè)包含“byte[]image”類型中圖像位的類,如下所示:

public?class?InMemoryImageData {public?InMemoryImageData(byte[]?image,?string?label,?string?imageFileName){Image?=?image;Label?=?label;ImageFileName?=?imageFileName;}public?readonly?byte[]?Image;public?readonly?string?Label;public?readonly?string?ImageFileName; }

使用LoadImagesFromDirectory()和LoadFromEnumerable()下載imageset并加載其信息。

//?1.?Download?the?image?set?and?unzip string?finalImagesFolderName?=?DownloadImageSet(imagesDownloadFolderPath); string?fullImagesetFolderPath?=?Path.Combine(imagesDownloadFolderPath,?finalImagesFolderName);var?mlContext?=?new?MLContext(seed:?1);//?2.?Load?the?initial?full?image-set?into?an?IDataView?and?shuffle?so?it'll?be?better?balanced IEnumerable<ImageData>?images?=?LoadImagesFromDirectory(folder:?fullImagesetFolderPath,?useFolderNameAsLabel:?true); IDataView?fullImagesDataset?=?mlContext.Data.LoadFromEnumerable(images); IDataView?shuffledFullImageFilePathsDataset?=?mlContext.Data.ShuffleRows(fullImagesDataset);

將數(shù)據(jù)加載到IDataView后,將對(duì)這些行進(jìn)行混洗,以便在拆分為訓(xùn)練/測(cè)試數(shù)據(jù)集之前更好地平衡數(shù)據(jù)集。。

下一步非常重要。因?yàn)槲覀兿M鸐L模型能夠處理內(nèi)存中的圖像,所以我們需要將圖像加載到數(shù)據(jù)集中,并通過(guò)調(diào)用fit()和ttransform()來(lái)實(shí)現(xiàn)。需要在初始且分離的管道中執(zhí)行此步驟,以便在訓(xùn)練時(shí),管道和模型不會(huì)使用文件路徑來(lái)創(chuàng)建。

//?3.?Load?Images?with?in-memory?type?within?the?IDataView?and?Transform?Labels?to?Keys?(Categorical) IDataView?shuffledFullImagesDataset?=?mlContext.Transforms.Conversion.MapValueToKey(outputColumnName:?"LabelAsKey",?inputColumnName:?"Label",?keyOrdinality:?KeyOrdinality.ByValue).Append(mlContext.Transforms.LoadRawImageBytes(outputColumnName:?"Image",imageFolder:?fullImagesetFolderPath,inputColumnName:?"ImagePath")).Fit(shuffledFullImageFilePathsDataset).Transform(shuffledFullImageFilePathsDataset);

此外,在分割數(shù)據(jù)集之前,我們還將標(biāo)簽轉(zhuǎn)換為鍵(分類)。如果您不想在第二個(gè)管道(訓(xùn)練管道)中轉(zhuǎn)換標(biāo)簽時(shí)處理/匹配KeyOrdinality,那么在拆分之前執(zhí)行此操作也很重要。

現(xiàn)在,讓我們將數(shù)據(jù)集分成兩個(gè)數(shù)據(jù)集,一個(gè)用于訓(xùn)練,另一個(gè)用于測(cè)試/驗(yàn)證模型的質(zhì)量。

//?4.?Split?the?data?80:20?into?train?and?test?sets,?train?and?evaluate. var?trainTestData?=?mlContext.Data.TrainTestSplit(shuffledFullImagesDataset,?testFraction:?0.2); IDataView?trainDataView?=?trainTestData.TrainSet; IDataView?testDataView?=?trainTestData.TestSet;

作為最重要的步驟,您可以定義模型的訓(xùn)練管道,在這里您可以看到如何輕松地訓(xùn)練一個(gè)新的TensorFlow模型,該模型基于默認(rèn)體系結(jié)構(gòu)(預(yù)先訓(xùn)練的模型)的遷移學(xué)習(xí),例如Resnet V2 500。

//?5.?Define?the?model's?training?pipeline?using?DNN?default?values // var?pipeline?=?mlContext.MulticlassClassification.Trainers.ImageClassification(featureColumnName:?"Image",labelColumnName:?"LabelAsKey",validationSet:?testDataView).Append(mlContext.Transforms.Conversion.MapKeyToValue(outputColumnName:?"PredictedLabel",inputColumnName:?"PredictedLabel"));

上面代碼中的重要一行是使用mlContext.MulticlassClassification.Trainers.ImageClassification分類訓(xùn)練器的行,正如您所看到的,這是一個(gè)高級(jí)API,您只需要提供哪個(gè)列包含圖像,帶有標(biāo)簽的列(要預(yù)測(cè)的列)和用于在訓(xùn)練時(shí)計(jì)算質(zhì)量度量的驗(yàn)證數(shù)據(jù)集,以便模型在訓(xùn)練時(shí)可以自我調(diào)整(更改內(nèi)部超參數(shù))。

在本質(zhì)上,此模型訓(xùn)練基于從默認(rèn)體系結(jié)構(gòu)(預(yù)先訓(xùn)練的模型)學(xué)習(xí)的本地TensorFlow DNN遷移,例如Resnet V2 50。還可以通過(guò)配置可選的超參數(shù)來(lái)選擇要從中派生的超參數(shù)。

就這么簡(jiǎn)單,您甚至不需要進(jìn)行圖像變換(調(diào)整大小、規(guī)格化等)。根據(jù)所使用的DNN架構(gòu),該框架在幕后進(jìn)行所需的圖像轉(zhuǎn)換,因此您只需使用單個(gè)API即可。

可選使用高級(jí)超參數(shù)

高級(jí)用戶還有另一種重載方法,您還可以指定可選的超參數(shù),例如epoch,batchSize,learningRate,特定的DNN架構(gòu),例如Inception v3或者Resnet v2101和其他典型的DNN參數(shù),但大多數(shù)用戶都可以從簡(jiǎn)化的API開始。

以下是如何使用高級(jí)DNN參數(shù):

//?5.1?(OPTIONAL)?Define?the?model's?training?pipeline?by?using?explicit?hyper-parametersvar?options?=?new?ImageClassificationTrainer.Options() {FeatureColumnName?=?"Image",LabelColumnName?=?"LabelAsKey",//?Just?by?changing/selecting?InceptionV3/MobilenetV2/ResnetV250//?you?can?try?a?different?DNN?architecture?(TensorFlow?pre-trained?model).Arch?=?ImageClassificationTrainer.Architecture.MobilenetV2,Epoch?=?50,???????//100BatchSize?=?10,LearningRate?=?0.01f,MetricsCallback?=?(metrics)?=>?Console.WriteLine(metrics),ValidationSet?=?testDataView };var?pipeline?=?mlContext.MulticlassClassification.Trainers.ImageClassification(options).Append(mlContext.Transforms.Conversion.MapKeyToValue(outputColumnName:?"PredictedLabel",inputColumnName:?"PredictedLabel"));

3. 訓(xùn)練模型

為了開始訓(xùn)練過(guò)程,您需要在構(gòu)建的管道上運(yùn)行Fit:

//?4.?Train/create?the?ML?model ITransformer?trainedModel?=?pipeline.Fit(trainDataView);

4. 評(píng)估模型

訓(xùn)練完成后,利用測(cè)試數(shù)據(jù)集對(duì)模型進(jìn)行質(zhì)量評(píng)價(jià)。

Evaluate函數(shù)需要一個(gè)IDataView,其中包含通過(guò)調(diào)用Transform()從測(cè)試數(shù)據(jù)集生成的預(yù)測(cè)。

//?5.?Get?the?quality?metrics?(accuracy,?etc.) IDataView?predictionsDataView?=?trainedModel.Transform(testDataset);var?metrics?=?mlContext.MulticlassClassification.Evaluate(predictionsDataView,?labelColumnName:"LabelAsKey",?predictedLabelColumnName:?"PredictedLabel"); ConsoleHelper.PrintMultiClassClassificationMetrics("TensorFlow?DNN?Transfer?Learning",?metrics);

最后,保存模型:

//?Save?the?model?to?assets/outputs?(You?get?ML.NET?.zip?model?file?and?TensorFlow?.pb?model?file) mlContext.Model.Save(trainedModel,?trainDataView.Schema,?outputMlNetModelFilePath);

運(yùn)行項(xiàng)目來(lái)訓(xùn)練模型

您應(yīng)該按照以下步驟來(lái)訓(xùn)練您的模型:

  • 在Visual Studio中將ImageClassification.Train設(shè)置為啟動(dòng)項(xiàng)目

  • 在Visual Studio中按F5。幾秒鐘后,該過(guò)程將完成并保存一個(gè)新的ML.NET模型到文件assets/outputs/imageClassifier.zip

  • 5. “終端用戶”應(yīng)用中的使用模型

    GPU與CPU對(duì)模型的使用/評(píng)分對(duì)比

    在使用/評(píng)分模型時(shí),您也可以在CPU/GPU之間進(jìn)行選擇,但是,如果使用GPU,您還需要確保運(yùn)行模型的計(jì)算機(jī)/服務(wù)器支持GPU。

    設(shè)置評(píng)分/使用項(xiàng)目以使用GPU的方法與本readme.md開頭所述的方法相同,只需使用一個(gè)或另一個(gè)redist庫(kù)。

    用于評(píng)分的示例控制臺(tái)應(yīng)用程序

    在示例的解決方案中,還有第二個(gè)項(xiàng)目名為ImageClassifcation.Predict。這個(gè)控制臺(tái)應(yīng)用程序只需加載您定制的ML.NET模型,并以假設(shè)的最終用戶應(yīng)用程序的方式執(zhí)行一些樣本預(yù)測(cè)。

    首先要做的是將生成的assets/outputs/imageClassifier.zip文件復(fù)制/粘貼到使用項(xiàng)目的inputs/MLNETModel文件夾中。

    關(guān)于代碼,您首先需要加載在模型訓(xùn)練應(yīng)用執(zhí)行期間創(chuàng)建的模型。

    MLContext?mlContext?=?new?MLContext(seed:?1); ITransformer?loadedModel?=?mlContext.Model.Load(imageClassifierModelZipFilePath,?out?var?modelInputSchema);

    然后,您可以創(chuàng)建一個(gè)預(yù)測(cè)器引擎對(duì)象,并最終使用文件夾assets/inputs/images-for-predictions的第一個(gè)圖像進(jìn)行一些樣本預(yù)測(cè),其中只有一些圖像在訓(xùn)練模型時(shí)沒(méi)有使用。

    請(qǐng)注意,在評(píng)分時(shí),只需要具有內(nèi)存圖像的InMemoryImageData類型。

    該圖像也可以通過(guò)任何其他通道傳輸,而不是從文件中加載。例如,這個(gè)解決方案中的ImageClassification.WebApp通過(guò)HTTP獲取將要用于預(yù)測(cè)的圖像。

    var?predictionEngine?=?mlContext.Model.CreatePredictionEngine<InMemoryImageData,?ImagePrediction>(loadedModel);//Predict?the?first?image?in?the?folder IEnumerable<InMemoryImageData>?imagesToPredict?=?LoadInMemoryImagesFromDirectory(imagesFolderPathForPredictions,?false);InMemoryImageData?imageToPredict?=?new?InMemoryImageData {Image?=?imagesToPredict.First().Image,ImageFileName?=?imagesToPredict.First().ImageFileName };var?prediction?=?predictionEngine.Predict(imageToPredict);//?Get?the?highest?score?and?its?index float?maxScore?=?prediction.Score.Max();Console.WriteLine($"Image?Filename?:?[{imageToPredict.ImageFileName}],?"?+$"Predicted?Label?:?[{prediction.PredictedLabel}],?"?+$"Probability?:?[{maxScore}]?");

    預(yù)測(cè)引擎接收InMemoryImageData類型的對(duì)象作為參數(shù)(包含2個(gè)屬性:Image和ImageFileName)。該模型不使用ImageFileName。您只需將它放在這里,以便在顯示預(yù)測(cè)時(shí)可以將文件名打印出來(lái)。預(yù)測(cè)僅使用byte[] Image字段中的圖像位。

    然后,模型返回類型為ImagePrediction的對(duì)象,該對(duì)象包含所有圖像類/類型的PredictedLabel和所有Scores。

    由于PredictedLabel已經(jīng)是一個(gè)字符串,因此它將顯示在控制臺(tái)中。關(guān)于預(yù)測(cè)標(biāo)簽的分?jǐn)?shù),我們只需要取最高的分?jǐn)?shù),即預(yù)測(cè)標(biāo)簽的概率。

    運(yùn)行“最終用戶應(yīng)用程序”項(xiàng)目以嘗試預(yù)測(cè)

    您應(yīng)該按照以下步驟來(lái)使用您的模型:

  • 在Visual Studio中將“ImageClassification.Predict”設(shè)置為啟動(dòng)項(xiàng)目

  • 在Visual Studio中按F5。幾秒鐘后,該過(guò)程將通過(guò)加載并使用自定義的imageClassifier.zip?模型來(lái)顯示預(yù)測(cè)。

  • 用于評(píng)分/推斷的ASP.NET Core web應(yīng)用示例

    在示例的解決方案中,還有另一個(gè)名為ImageClassification.WebApp的項(xiàng)目,它是一個(gè)ASP.NET Core web應(yīng)用程序,允許用戶通過(guò)HTTP提交圖像,并使用內(nèi)存中的圖像進(jìn)行評(píng)分/預(yù)測(cè)。

    此示例還使用了PredictionEnginePool,建議用于多線程和可擴(kuò)展的應(yīng)用程序。

    您可以在下面看到該應(yīng)用的屏幕截圖:


    TensorFlow DNN遷移學(xué)習(xí)背景信息

    這個(gè)示例應(yīng)用程序正在重新訓(xùn)練用于圖像分類的TensorFlow模型。您可能認(rèn)為它與另一個(gè)示例非常相似 Image classifier using the TensorFlow Estimator featurizer。不過(guò),內(nèi)部的實(shí)現(xiàn)方式卻有很大的不同。在上述示例中,它使用的是“模型合成方法”,其中初始TensorFlow模型(即InceptionV3或ResNet)僅用于對(duì)圖像進(jìn)行特征化,并生成每個(gè)圖像的二進(jìn)制信息,以供添加在頂部的另一個(gè)ML.NET分類器訓(xùn)練器使用(例如LbfgsMaximumEntropy)。因此,即使該示例使用的是TensorFlow模型,您也只能使用ML.NET trainer進(jìn)行訓(xùn)練,您不會(huì)重新訓(xùn)練新的TensorFlow模型,而是訓(xùn)練ML.NET模型。這就是為什么該示例的輸出只是一個(gè)ML.NET模型(.zip文件)。

    與此相反,本例在本地基于遷移學(xué)習(xí)方法對(duì)新的TensorFlow模型進(jìn)行重新訓(xùn)練,再?gòu)闹付ǖ念A(yù)訓(xùn)練模型(Inception V3或ResNet)派生的新TensorFlow模型進(jìn)行了訓(xùn)練。

    重要的區(qū)別在于,這種方法使用TensorFlowAPI進(jìn)行內(nèi)部再訓(xùn)練,并創(chuàng)建一個(gè)新的TensorFlow模型(.pb)。然后,您使用的ML.NET.zip文件模型就像是新的重新訓(xùn)練的TensorFlow模型的包裝器。這就是為什么您還可以看到訓(xùn)練后生成的新.pb文件的原因:


    在下面的屏幕截圖中,您可以看到如何在Netron中看到重新訓(xùn)練的TensorFlow模型(custom_retrained_model_based_on_InceptionV3.meta.pb),因?yàn)樗潜緳C(jī)TensorFlow模型:

    好處:

    • 使用GPU進(jìn)行訓(xùn)練和推斷:當(dāng)使用基于TensorFlow的本機(jī)DNN方法時(shí),您可以使用CPU或GPU(如果可用)來(lái)獲得更好的性能(減少訓(xùn)練和評(píng)分所需的時(shí)間)。

    • 跨多個(gè)框架和平臺(tái)重用:由于您本機(jī)訓(xùn)練了Tensorflow模型,除了能夠使用ML.NET 'wrapper'模型(.zip文件)運(yùn)行/使用該模型之外,您還可以使用.pb Tensorflow凍結(jié)模型并在任何其他框架(如Python/Keras/Tensorflow)上運(yùn)行它,或者Java/Android應(yīng)用程序或任何支持TensorFlow的框架。

    • 靈活性和性能:由于ML.NET是在Tensorflow層上進(jìn)行內(nèi)部再訓(xùn)練的,因此ML.NET團(tuán)隊(duì)將能夠進(jìn)一步優(yōu)化并采取多種方法,如在最后一層上進(jìn)行訓(xùn)練或跨Tensorflow模型在多個(gè)層上進(jìn)行訓(xùn)練,并獲得更好的質(zhì)量水平。

    總結(jié)

    以上是生活随笔為你收集整理的ML.NET 示例:图像分类模型训练-首选API(基于原生TensorFlow迁移学习)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。