我正在尝试使用Encog处理这个数据集。为此,我将输出合并为一个(我似乎无法弄清楚如何使用多个预期输出,尽管我尝试过手动训练一个具有4个输出神经元的NN,但没有成功),使用的值为:“disease1”、“disease2”、“none”和“both”。
从那里开始,我在CSV中使用了分析师向导,自动过程训练了一个具有预期输出的NN。文件中的一个片段如下:
"field:1","field:2","field:3","field:4","field:5","field:6","field:7","Output:field:7"40.5,yes,yes,yes,yes,no,both,both41.2,no,yes,yes,no,yes,second,second
现在我的问题是:我该如何查询它?我尝试使用分类,但据我所知,结果只给我{0,1,2}的值,所以有两个类别我无法区分(两者都是0)。
这个问题同样适用于wiki中介绍的Iris示例。此外,Encog是如何从输出神经元值推断出0/1/2结果的?
编辑:我找到的解决方案是为disease 1和disease 2使用单独的网络,但我真的很想知道是否可以将它们合并为一个。
回答:
你说的对,你需要将输出列合并为一个值。Encog分析师只能对单个输出列进行分类。该输出列可以有许多不同的值。因此,将两个输出列标准化为none、first、second、both是可行的。如果你直接使用底层神经网络,你实际上可以训练两个输出,每个输出进行独立分类。但在本讨论中,我假设我们处理的是分析师。
你是使用工作台还是在代码中查询网络?默认情况下,Encog分析师使用等边编码对神经网络进行编码。这会导致输出神经元的数量等于n-1,其中n是类别的数量。如果你在分析师向导中选择了one-of-n编码,那么BasicNetwork上的常规分类方法将有效,因为它仅适用于one-of-n。
如果你想使用等边编码进行查询(在代码中),你可以使用类似于下面的方法。我将在Encog的下一个版本中添加这个功能。
/** * 用于对使用等边编码的神经网络进行分类。 * 这是Encog分析师的默认设置。等边编码使用输出数量等于类别数量减一。 * @param input 神经网络的输入。 * @param high 激活范围的高值,通常为1。 * @param low 归一化范围的低端,通常为-1或0。 * @return 输入所属的类别。 */public int classifyEquilateral(final MLData input,double high, double low) { MLData result = this.compute(input); Equilateral eq = new Equilateral(getOutputCount()+1,high,low); return eq.decode(result.getData());}