【发布时间】:2016-04-20 10:25:39
【问题描述】:
我的网络:33 * 61 (2013) 输入节点。 1 个隐藏层中有 2000 个节点。 45 (for 45 char) 输出节点。
BasicNetwork basicNetwork = EncogUtility.simpleFeedForward(trainSet.getInputSize(), 2000, 0, trainSet.getIdealSize(), false);
构建训练集代码(在循环中运行):
NormalizedField c = new NormalizedField(NormalizationAction.Normalize,"color", 255,0,1,0);
BufferedImage image = ImageIO.read(file);
BasicMLData data = new BasicMLData(width*height);
for(int i = 0;i<width;i++){
for(int j = 0;j<height;j++){
Color color = new Color(image.getRGB(i,j));
double value = c.normalize(color.getBlue());
data.add(i*height+j,value);
}
}
final MLData ideal = new BasicMLData(charList.length());
for (int i = 0; i < charList.length(); i++) {
if (i == charList.indexOf(e)) {
ideal.setData(i, 1);
} else {
ideal.setData(i, 0);
}
}
training.add(data,ideal);
培训代码:
int i = 0;
final ResilientPropagation rp = new ResilientPropagation(network,trainSet);
do {
rp.iteration();
i++;
System.out.println("Error rate: " + rp.getError());
if(i > 10){
i = 0;
EncogDirectoryPersistence.saveObject(new File("myneural.eg"),network);
}
} while (rp.getError() >= 0.01 ) ;
我已经训练了 45 个字符,每个字符 300 张图片(图像是单色的,所以 r/b/g 值相同),错误率约为 0.02。 但是当训练完成时,它仍然无法计算/分类甚至训练数据。 我的测试代码:
BufferedImage image = ImageIO.read(file);
int width = image.getWidth();
int height = image.getHeight();
System.out.println("Width: " + width + " Height: " + height);
BasicMLData data = new BasicMLData(width*height);
NormalizedField c = new NormalizedField(NormalizationAction.Normalize,"color", 255,0,1,0);
for(int i = 0;i<width;i++){
for(int j = 0;j<height;j++){
Color color = new Color(image.getRGB(i,j));
double value = c.normalize(color.getBlue());
data.add(i*height+j,value);
}
}
MLData compute = basicNetwork.compute(data);
但是当我尝试分类时,正确的字符仍然具有非常低的值。我已经用各种字符(在训练集中)进行了测试,但 Encog 总是分类错误的字符。
【问题讨论】:
标签: java machine-learning neural-network ocr encog