c# 預處理識別硬幣的數(shù)據(jù)集
在文章中,我們將對輸入到機器學習模型中的數(shù)據(jù)集進行預處理。
這里我們將對一個硬幣數(shù)據(jù)集進行預處理,以便以后在監(jiān)督學習模型中進行訓練。在機器學習中預處理數(shù)據(jù)集通常涉及以下任務:
- 清理數(shù)據(jù)——通過對周圍數(shù)據(jù)的平均值或使用其他策略來填補數(shù)據(jù)缺失或損壞造成的漏洞。
- 規(guī)范數(shù)據(jù)——將數(shù)據(jù)縮放值標準化到一個標準范圍,通常是0到1。具有廣泛值范圍的數(shù)據(jù)可能會導致不規(guī)范,因此我們將所有數(shù)據(jù)都放在一個公共范圍內。
- 一種熱編碼標簽——將數(shù)據(jù)集中對象的標簽或類編碼為N維二進制向量,其中N是類的總數(shù)。數(shù)組元素都被設置為0,除了與對象的類相對應的元素,它被設置為1。這意味著在每個數(shù)組中都有一個值為1的元素。
- 將輸入數(shù)據(jù)集分為訓練集和驗證集——訓練集被用于訓練模型,驗證集是用于檢查我們的訓練結果。
這個例子我們將使用Numpy.NET,它基本上是Python中流行的Numpy庫的.NET版本。
Numpy是一個專注于處理矩陣的庫。
為了實現(xiàn)我們的數(shù)據(jù)集處理器,我們在PreProcessing文件夾中創(chuàng)建Utils類和DataSet類。Utils類合并了一個靜態(tài)Normalize 方法,如下所示:
public class Utils
{
public static NDarray Normalize(string path)
{
var colorMode = Settings.Channels == 3 ? "rgb" : "grayscale";
var img = ImageUtil.LoadImg(path, color_mode: colorMode, target_size: (Settings.ImgWidth, Settings.ImgHeight));
return ImageUtil.ImageToArray(img) / 255;
}
}
在這種方法中,我們用給定的顏色模式(RGB或灰度)加載圖像,并將其調整為給定的寬度和高度。然后我們返回包含圖像的矩陣,每個元素除以255。每個元素除以255是使它們標準化,因為圖像中任何像素的值都在0到255之間,所以通過將它們除以255,我們確保了新的范圍是0到1,包括255。
我們還在代碼中使用了一個Settings類。該類包含用于跨應用程序使用的許多常量。另一個類DataSet,表示我們將要用來訓練機器學習模型的數(shù)據(jù)集。這里我們有以下字段:
- _pathToFolder—包含圖像的文件夾的路徑。
- _extList—要考慮的文件擴展名列表。
- _labels—_pathToFolder中圖像的標簽或類。
- _objs -圖像本身,表示為Numpy.NDarray。
- _validationSplit—用于將總圖像數(shù)劃分為驗證集和訓練集的百分比,在本例中,百分比將定義驗證集與總圖像數(shù)之間的大小。
- NumberClasses-數(shù)據(jù)集中唯一類的總數(shù)。
- TrainX -訓練數(shù)據(jù),表示為Numpy.NDarray。
- TrainY -訓練標簽,表示為Numpy.NDarray。
- ValidationX—驗證數(shù)據(jù),表示為Numpy.NDarray。
- ValidationY-驗證標簽,表示為Numpy.NDarray。
這是DataSet類:
public class DataSet
{
private string _pathToFolder;
private string[] _extList;
private List<int> _labels;
private List<NDarray> _objs;
private double _validationSplit;
public int NumberClasses { get; set; }
public NDarray TrainX { get; set; }
public NDarray ValidationX { get; set; }
public NDarray TrainY { get; set; }
public NDarray ValidationY { get; set; }
public DataSet(string pathToFolder, string[] extList, int numberClasses, double validationSplit)
{
_pathToFolder = pathToFolder;
_extList = extList;
NumberClasses = numberClasses;
_labels = new List<int>();
_objs = new List<NDarray>();
_validationSplit = validationSplit;
}
public void LoadDataSet()
{
// Process the list of files found in the directory.
string[] fileEntries = Directory.GetFiles(_pathToFolder);
foreach (string fileName in fileEntries)
if (IsRequiredExtFile(fileName))
ProcessFile(fileName);
MapToClassRange();
GetTrainValidationData();
}
private bool IsRequiredExtFile(string fileName)
{
foreach (var ext in _extList)
{
if (fileName.Contains("." + ext))
{
return true;
}
}
return false;
}
private void MapToClassRange()
{
HashSet<int> uniqueLabels = _labels.ToHashSet();
var uniqueLabelList = uniqueLabels.ToList();
uniqueLabelList.Sort();
_labels = _labels.Select(x => uniqueLabelList.IndexOf(x)).ToList();
}
private NDarray OneHotEncoding(List<int> labels)
{
var npLabels = np.array(labels.ToArray()).reshape(-1);
return Util.ToCategorical(npLabels, num_classes: NumberClasses);
}
private void ProcessFile(string path)
{
_objs.Add(Utils.Normalize(path));
ProcessLabel(Path.GetFileName(path));
}
private void ProcessLabel(string filename)
{
_labels.Add(int.Parse(ExtractClassFromFileName(filename)));
}
private string ExtractClassFromFileName(string filename)
{
return filename.Split('_')[0].Replace("class", "");
}
private void GetTrainValidationData()
{
var listIndices = Enumerable.Range(0, _labels.Count).ToList();
var toValidate = _objs.Count * _validationSplit;
var random = new Random();
var xValResult = new List<NDarray>();
var yValResult = new List<int>();
var xTrainResult = new List<NDarray>();
var yTrainResult = new List<int>();
// Split validation data
for (var i = 0; i < toValidate; i++)
{
var randomIndex = random.Next(0, listIndices.Count);
var indexVal = listIndices[randomIndex];
xValResult.Add(_objs[indexVal]);
yValResult.Add(_labels[indexVal]);
listIndices.RemoveAt(randomIndex);
}
// Split rest (training data)
listIndices.ForEach(indexVal =>
{
xTrainResult.Add(_objs[indexVal]);
yTrainResult.Add(_labels[indexVal]);
});
TrainY = OneHotEncoding(yTrainResult);
ValidationY = OneHotEncoding(yValResult);
TrainX = np.array(xTrainResult);
ValidationX = np.array(xValResult);
}
}
下面是每個方法的說明:
- LoadDataSet()——類的主方法,我們調用它來加載_pathToFolder中的數(shù)據(jù)集。它調用下面列出的其他方法來完成此操作。
- IsRequiredExtFile(filename) - 檢查給定文件是否包含至少一個應該為該數(shù)據(jù)集處理的擴展名(在_extList中列出)。
- MapToClassRange() -獲取數(shù)據(jù)集中唯一標簽的列表。
- ProcessFile(path) -使用Utils.Normalize方法對圖像進行規(guī)格化,并調用ProcessLabel方法。
- ProcessLabel(filename)——將ExtractClassFromFileName方法的結果添加為標簽。
- ExtractClassFromFileName(filename) -從圖像的文件名中提取類。
- GetTrainValidationData()——將數(shù)據(jù)集劃分為訓練子數(shù)據(jù)集和驗證子數(shù)據(jù)集。
在本系列中,我們將使用https://cvl.tuwien.ac.at/research/cvl-databases/coin-image-dataset/上的硬幣圖像數(shù)據(jù)集。
要加載數(shù)據(jù)集,我們可以在控制臺應用程序的主類中包含以下內容:
var numberClasses = 60;
var fileExt = new string[] { ".png" };
var dataSetFilePath = @"C:/Users/arnal/Downloads/coin_dataset";
var dataSet = new PreProcessing.DataSet(dataSetFilePath, fileExt, numberClasses, 0.2);
dataSet.LoadDataSet();
我們的數(shù)據(jù)現(xiàn)在可以輸入到機器學習模型中。下一篇文章將介紹監(jiān)督機器學習的基礎知識,以及訓練和驗證階段包括哪些內容。它是為沒有AI經(jīng)驗的讀者準備的。
以上就是c# 預處理識別硬幣的數(shù)據(jù)集的詳細內容,更多關于c# 識別數(shù)據(jù)集的資料請關注腳本之家其它相關文章!
相關文章
C#中實現(xiàn)輸入漢字獲取其拼音(漢字轉拼音)的2種方法
這篇文章主要介紹了C#中實現(xiàn)輸入漢字獲取其拼音(漢字轉拼音)的2種方法,本文分別給出了使用微軟語言包、手動編碼實現(xiàn)兩種實現(xiàn)方式,需要的朋友可以參考下2015-01-01
C#與C++?dll之間傳遞字符串string?wchar_t*?char*?IntPtr問題
C#與C++?dll之間傳遞字符串string?wchar_t*?char*?IntPtr問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
C#中調用DLL時未能加載文件或程序集錯誤的處理方法(詳解)
下面小編就為大家?guī)硪黄狢#中調用DLL時未能加載文件或程序集錯誤的處理方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02

