Encog 神经网络:归一化

Posted

技术标签:

【中文标题】Encog 神经网络:归一化【英文标题】:Encog Neural Net : Normalization 【发布时间】:2013-11-19 11:26:23 【问题描述】:

在 Encog 3.x 中,您如何规范化数据、使用它进行训练以及去规范化结果?

没有关于这方面的好的文档,一个应用这些文档的简单示例将大大减少 Encog 的学习曲线。我还没有完全弄清楚,但这里有一些资源。

(1) *How does Encog 3.0 Normalize?*

此代码可用于保存新的规范化 csv。虽然这里不清楚如何获取 AnalystNormalizeCSV 并将其转换为 MLDataSet 以实际使用它。

EncogAnalyst analyst = new EncogAnalyst();
AnalystWizard wizard = new AnalystWizard(analyst);
wizard.wizard(sourceFile, true, AnalystFileFormat.DECPNT_COMMA);
final AnalystNormalizeCSV norm = new AnalystNormalizeCSV();
norm.analyze(sourceFile, true, CSVFormat.ENGLISH, analyst);
norm.setOutputFormat(CSVFormat.ENGLISH);
norm.setProduceOutputHeaders(true);
norm.normalize(targetFile)

(2) *How do I normalize a CSV file with Encog (Java)*

此代码同样可以生成标准化的 csv 输出。但目前尚不清楚如何获取标准化数据并实际应用它。有一种将目标设置为 MLData 的方法,但它假定所有列都是输入,并且没有为任何理想留出空间。此外,当文件具有标题和/或未使用的列时,这两个选项都难以使用。

try 
            File rawFile = new File(MYDIR, "iris.csv");

            // download Iris data from UCI
            if (rawFile.exists()) 
                System.out.println("Data already downloaded to: " + rawFile.getPath());
             else 
                System.out.println("Downloading iris data to: " + rawFile.getPath());
                BotUtil.downloadPage(new URL("http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"), rawFile);
            

            // define the format of the iris data

            DataNormalization norm = new DataNormalization();
            InputField inputSepalLength, inputSepalWidth, inputPetalLength, inputPetalWidth;
            InputFieldCSVText inputClass;

            norm.addInputField(inputSepalLength = new InputFieldCSV(true, rawFile, 0));
            norm.addInputField(inputSepalWidth = new InputFieldCSV(true, rawFile, 1));
            norm.addInputField(inputPetalLength = new InputFieldCSV(true, rawFile, 2));
            norm.addInputField(inputPetalWidth = new InputFieldCSV(true, rawFile, 3));
            norm.addInputField(inputClass = new InputFieldCSVText(true, rawFile, 4));
            inputClass.addMapping("Iris-setosa");
            inputClass.addMapping("Iris-versicolor");
            inputClass.addMapping("Iris-virginica");

            // define how we should normalize

            norm.addOutputField(new OutputFieldRangeMapped(inputSepalLength, 0, 1));
            norm.addOutputField(new OutputFieldRangeMapped(inputSepalWidth, 0, 1));
            norm.addOutputField(new OutputFieldRangeMapped(inputPetalLength, 0, 1));
            norm.addOutputField(new OutputFieldRangeMapped(inputPetalWidth, 0, 1));
            norm.addOutputField(new OutputOneOf(inputClass, 1, 0));

            // define where the output should go
            File outputFile = new File(MYDIR, "iris_normalized.csv");
            norm.setCSVFormat(CSVFormat.ENGLISH);
            norm.setTarget(new NormalizationStorageCSV(CSVFormat.ENGLISH, outputFile));

            // process
            norm.setReport(new ConsoleStatusReportable());
            norm.process();
            System.out.println("Output written to: " + rawFile.getPath());

         catch (Exception ex) 
            ex.printStackTrace();
        

(3) *反规范化*

我完全不知道如何接受所​​有这些并根据适当的数据类型的最大值和最小值进行非规范化。

【问题讨论】:

注意:我一直在开发一个单独的类来进行所有的规范化/非规范化,但仍然......没有办法用 encog 来做吗? 【参考方案1】:

这里有一些资源,您可以在其中获得有关使用 ENCOG 框架进行规范化和非规范化的更多详细信息。

这些由 Jeff Heaton 本人撰写的优秀电子书, 1.Programming Neural Networks with Encog3 in C#, 2nd Edition by Heaton, Jeff (Oct 2, 2011) 2.C# 神经网络简介,第二版,Jeff Heaton(2008 年 10 月 2 日) 这些是 ENCOG 用户必备的电子书。

你也可以看看“Introduction to Machine learning with ENCOG”上的复数课程,这也包括一些规范化和非规范化的例子。

现在关于您的查询:“这里尚不清楚如何获取 AnalystNormalizeCSV 并将其转换为 MLDataSet 以实际使用它。”

您可以使用 AnalystNormalizeCSV 来规范化您的训练文件。然后你可以使用 EncogUtility 类的 LoadCSV2Memory 用于加载规范化的训练文件以获取 ML DataSet。这是 C# 中的示例代码,

var trainingSet = EncogUtility.LoadCSV2Memory(Config.NormalizedTrainingFile.ToString(), network.InputCount, network.OutputCount,true, CSVFormat.English,false);

它将标准化的训练文件作为第一个参数,网络输入神经元计数作为第二个,网络输出神经元计数作为第三个,如果你的csv文件中有标题,那么第四个参数是布尔值,那么你可以将格式作为第五个参数,第六个参数是显着性。

因此,一旦您在内存中拥有此数据集,您就可以将其用于训练。在交叉验证和评估步骤中也可以采用类似的方法。

关于非规范化,您可以先将分析文件持久化,然后您也可以使用分析文件对各个列进行非规范化。 例如:

var denormlizedOutput = analyst.Script.Normalize.NormalizedFields[index].DeNormalize(item.Input[index]);

类似的方法也可以用于非规范化字段以获取类标签。例如

var predictedClass = analyst.Script.Normalize.NormalizedFields[index].Classes[predictedClassInt].Name;

【讨论】:

Abhishek,我学习了您的 Pluralsight 课程,并从您那里了解了 Encog 和机器学习。查看下面提到的我的扩展库...您可能会发现它很有用。【参考方案2】:

encog 分析师非常适合标准化数据。它可以获取存储在 CSV 文件中的信息,并自动确定归一化字段及其编码类型(包括 N 中的 1 个等边编码)。

唯一的缺点是逻辑与 ReadCSV 类紧密耦合。

偏爱扩展而不是修改我决定着手创建扩展方法和替代类,以创建一个可以规范化通用 .NET 数据集的分析师。

我还添加了一个新的测试类,向您展示如何使用它(它与标准的 encog 实现非常相似)。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using Encog.ML.Data.Market;
using Encog.ML.Data.Market.Loader;
using Encog.App.Analyst;
using Encog.App.Analyst.Wizard;
using EncogExtensions.Normalization; //<- This is my extension lib
using System.Data;
using System.Linq;     
[TestMethod]
    public void Normalize_Some_In_Memory_Data()
    
        // Download some stock data
        List<LoadedMarketData> MarketData = new List<LoadedMarketData>();
        MarketData.AddRange(DownloadStockData("MSFT",TimeSpan.FromDays(10)));
        MarketData.AddRange(DownloadStockData("AAPL", TimeSpan.FromDays(10)));
        MarketData.AddRange(DownloadStockData("YHOO", TimeSpan.FromDays(10)));

        // Convert stock data to dataset using encog-extensions
        DataSet dataSet = new DataSet().Convert(MarketData, "Market DataSet");

        // use encog-extensions to normalize the dataset 
        var analyst = new EncogAnalyst();
        var wizard = new AnalystWizard(analyst);
        wizard.Wizard(dataSet);

        // DataSet Goes In... 2D Double Array Comes Out... 
        var normalizer = new AnalystNormalizeDataSet(analyst);
        var normalizedData = normalizer.Normalize(dataSet);

        // Assert data is not null and differs from original
        Assert.IsNotNull(normalizedData);
        Assert.AreNotEqual(normalizedData[0, 0], dataSet.Tables[0].Rows[0][0]);

    

    private static List<LoadedMarketData> DownloadStockData(string stockTickerSymbol,TimeSpan timeSpan)
    
        IList<MarketDataType> dataNeeded = new List<MarketDataType>();
        dataNeeded.Add(MarketDataType.AdjustedClose);
        dataNeeded.Add(MarketDataType.Close);
        dataNeeded.Add(MarketDataType.Open);
        dataNeeded.Add(MarketDataType.High);
        dataNeeded.Add(MarketDataType.Low);
        dataNeeded.Add(MarketDataType.Volume);

        List<LoadedMarketData> MarketData =
            new YahooFinanceLoader().Load(
                new TickerSymbol(stockTickerSymbol),
                dataNeeded,
                DateTime.Now.Subtract(timeSpan),
                DateTime.Now).ToList();

        return MarketData;
    

【讨论】:

以上是关于Encog 神经网络:归一化的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中神经网络建模中的归一化和非归一化

Keras深度学习实战——批归一化详解

深度学习:批归一化和层归一化Batch NormalizationLayer Normalization

神经网络中的批量归一化

Hulu机器学习问题与解答系列 | 二十三:神经网络训练中的批量归一化

人工神经网络中的归一化