为什么我的神经网络总是预测相同的输出? (synaptic.js)

时间:2018-07-18 01:48:21

标签: neural-network ocr synaptic.js

您好,这个问题与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”。我在这里做什么错?感谢您的任何帮助,谢谢!

0 个答案:

没有答案