我正在尝试使用Encog处理this dataset。为此,我将输出合并为一个值:“ disease1”,(似乎无法弄清楚如何使用多个预期输出,即使我尝试用4个输出神经元手动训练一个NN都失败了) “ 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,both
41.2,no,yes,yes,no,yes,second,second
现在我的问题是:如何查询?我尝试了分类,但据我所知,结果只给了我值{0,1,2},所以有两个我无法区分的类(均为0)。
同样的问题也适用于Wiki中提供的Iris示例。另外,Encog如何从输出神经元值外推到0/1/2结果?
编辑:我发现的解决方案是对疾病1和疾病2使用单独的网络,但是我真的很想知道是否有可能将它们组合成一个网络。
最佳答案
没错,您需要将输出列组合为一个值。 Encog分析师将仅分类到单个输出列。该输出列可以具有许多不同的值。因此,将两个输出列归一化为none,first,second和both都可以。如果直接使用基础神经网络,则实际上可以训练两个输出,每个输出进行独立的分类。但是对于这次讨论,我假设我们正在与分析师打交道。
您是使用工作台还是代码查询网络?默认情况下,Encog分析人员使用等边编码对神经网络进行编码。这导致输出神经元的数量等于n-1,其中n是类别的数量。如果在分析器向导中选择n之一的编码,则BasicNetwork上的常规分类方法将起作用,因为它仅设计用于n的之一。
如果要使用等边式(以代码形式)查询,则可以使用类似于以下方法。我将其添加到Encog的下一版本中。
/**
* Used to classify a neural network that has been encoded using equilateral encoding.
* This is the default for the Encog analyst. Equilateral encoding uses an output count
* equal to the number of classes minus one.
* @param input The input to the neural network.
* @param high The high value of the activation range, usually 1.
* @param low The low end of the normalization range, usually -1 or 0.
* @return The class that the input belongs to.
*/
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());
}
关于machine-learning - Encog查询分类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23844676/