【问题标题】:How to provide strings as inputs and outputs in encog XOR function?如何在 encog XOR 函数中提供字符串作为输入和输出?
【发布时间】:2016-03-03 07:33:01
【问题描述】:

我需要用 XOR 函数在 Java 中制作 encog 程序,该函数必须具有带定义的字符串单词作为输入,但 BasicMLDataSet 只能接收双精度数。这是我正在使用的示例代码:

/**
 * The input necessary for XOR.
 */
public static double XOR_INPUT[][] = { { 0.0, 0.0 }, { 1.0, 0.0 },
        { 0.0, 1.0 }, { 1.0, 1.0 } };

/**
 * The ideal data necessary for XOR.
 */
public static double XOR_IDEAL[][] = { { 0.0 }, { 1.0 }, { 1.0 }, { 0.0 } };

这里是接收 XOR_INPUT 和 XOR_IDEAL 的类:

MLDataSet trainingSet = new BasicMLDataSet(XOR_INPUT, XOR_IDEAL);

代码来自encog xor example

有什么方法可以完成字符串训练或以某种方式解析它们,然后在将它们写入控制台之前将它们返回到字符串?

【问题讨论】:

    标签: java neural-network xor encog


    【解决方案1】:

    我找到了解决此问题的方法。由于我只能提供 0 和 1 之间的双精度值作为输入,并且我在 encog 中没有找到任何可以自然地将字符串标准化为双精度值的函数,因此我创建了自己的函数。我从 word 中的每个字母中获取 ascii 值,然后我只是将 90/asciiValue 相除以获得 0 和 1 之间的值。请记住,这只适用于小写字母。功能可以轻松升级以支持大写字母。这是函数:

        //Converts every letter in string to ascii and normalizes it (90/asciiValue)    
         public static double[] toAscii(String s, int najveci) {
                double[] ascii = new double[najveci];
                try {
                        byte[] bytes = s.getBytes("US-ASCII");
                        for (int i = 0; i < bytes.length; i++) {
                                ascii[i] = 90.0 / bytes[i];
                        }
    
                } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                }
                return ascii;
        }
    

    对于 word 理想输出,我使用了类似的解决方案。我也在对单词中的每个字母进行规范化,然后我对这些值进行平均。稍后,我将对这些值进行非规范化以获取字符串并检查模型训练的优点。

    您可以查看full code here.

    【讨论】:

      【解决方案2】:

      您可以使用 Encog 的 EncogAnalyst 和 AnalystWizard 来规范化您的数据。 @JeffHeaton(Encog 的作者)的 posting 显示了一个使用 .csv 文件的示例

      这些类可以对数字和“名义”数据(例如您要使用的字符串)进行归一化。您可能希望对这些字符串使用“等边”归一化,因为这样可以避免神经网络的一些训练问题。

      您可能还想查看这个tutorial on Encog on PluralSight,它有一个关于规范化的完整部分。

      以下是 Encog 文档中的一个示例,该示例展示了如何使用代码(没有 .csv 文件)规范化字段:

      var fuelStats = new NormalizedField( NormalizationAction.Normalize , ”fuel”, 200, 0, -0.9, 0.9) ;

      28 为 Encog 获取数据 对于上面的示例,范围被标准化为 -0.9 到 0.9。这与 -1 和 1 之间的归一化非常相似,但不那么极端。这有时可以产生更好的结果。众所周知,燃料的可接受范围在 0 到 200 之间。现在已经创建了字段对象,很容易对值进行归一化。这里将值 100 归一化为变量 n。双 n = fuelStats .Normalize(100);要将 n 反规范化回原始燃料值,请使用以下代码:

      double f = fuelStats .Denormalize(n);

      【讨论】:

      • 谢谢,但我没有使用 csv 文件,因此无法使用 EncogAnalyst。我已经看过整个教程...
      • Encog Analyst 不需要 .csv 文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多