我正在尝试训练神经网络来识别图像中的字母。我使用不同的字体生成了超过17000个带有字母的图像。图像大小为15x15像素。
为了训练神经网络,我使用15x15 = 225个字段的输入向量。当像素为白色时每个场具有0,而当像素为黑色时每个场具有1。输出向量具有36个字段,每个字段表示字母或数字,例如0是" a",1是" b",...,36是" 9&#34 ;.如果图像代表字母" a"然后向量是[1,0,0 .... 0]等。
我正在使用MultiLayerPerceptron进行反向传播来训练网络,但无论我让它训练多久,误差都不会小于0.5。我正在使用一个隐藏层。我尝试改变隐藏神经元的数量,但我仍然有这个问题。
public void Train(List<InOut> trainset, String neuralname){
DataSet set = new DataSet(225,36);
Random r = new Random();
int rand;
while (!trainset.isEmpty() && trainset.size() > 1){
rand = r.nextInt(trainset.size()-1);
set.addRow(trainset.get(rand).inputs,trainset.get(rand).outputs);
trainset.remove(rand);
}
// Load Neural Network
MultiLayerPerceptron neuralnet = (MultiLayerPerceptron) MultiLayerPerceptron.load(neuralname+".nnet");
// enable batch if using MomentumBackpropagation
if( neuralnet.getLearningRule() instanceof MomentumBackpropagation )
((MomentumBackpropagation)neuralnet.getLearningRule()).setBatchMode(true);
MomentumBackpropagation learningRule = (MomentumBackpropagation)neuralnet.getLearningRule();// Set learningRule
learningRule.addListener(this);
learningRule.setMaxError(0.4);
neuralnet.learn(set);
neuralnet.save(neuralname+".nnet");
}
public class InOut{
public double inputs[];
public double outputs[];
public InOut(double[] inputs, double[] outputs){
this.inputs = inputs;
this.outputs = outputs;
}
}