您好,这个问题与Synaptic.js有关。
我正在尝试使用神经网络从图像中读取手写数字。图片尺寸为120x90,并且仅包含黑白像素。我正在使用html5 canvas将图像转换为矩阵,然后再将其馈入具有10800个输入,30个隐藏层和3个输出的NN。
var myNetwork = new synaptic.Architect.Perceptron(10800,30,3);
var learningRate = .3;
将图像转换为矩阵的代码:
var matrix = [];
for(i = 0; i < img.height; i++) {
for(j = 0; j < img.width; j++) {
var rgba = ctx.getImageData(j, i, 1, 1);
var avg = ((rgba["data"][0] + rgba["data"][1] + rgba["data"][2]) / 3);
var indice;
if(avg < 150) indice = 1;
else indice = 0;
matrix.push(indice);
}
}
上面的代码给出了我期望的结果,基本上它将“白色”像素转换为0,将“黑色”像素转换为1。所附的是包含“ 1”的图像的矩阵示例(我调整了实际Matrix的大小,因为它也是如此大) : matrix illustration
当我向NN输入两个图像时,每个图像都包含'1'或'2'手写数字,它可以将它们正确分类。同样,当我尝试向其再添加五个包含“ 1”或“ 2”手写数字的图像时,NN仍然能够对其进行很好的分类。
我用来训练NN的代码:
myNetwork.propagate(learningRate, [1, 0]); //Train NN to learn '1'
myNetwork.propagate(learningRate, [0, 1]); //Train NN to learn '2'
但是,当我开始将“ 3”馈入网络时,它开始将每个图像输入(包括“ 1”和“ 2”)分类为第三类。基本上,当输出大小大于2时,NN总是会预测相同的输出,这是我训练它学习的最后一个类别。
myNetwork.propagate(learningRate, [0, 0, 1]); //Train NN to learn '3'
我每个数字有75张以上的图像,并且我尝试全部填充,但NN始终将它们归类为“ 3”。我在这里做什么错?感谢您的任何帮助,谢谢!