首页 > 解决方案 > 为什么我的神经网络总是预测相同的输出?(突触.js)

问题描述

您好,这个问题与 Synaptic.js 有关。

我正在尝试使用神经网络从图像中读取手写数字。图像尺寸为 120x90,仅包含黑白像素。我正在使用 html5 画布将图像转换为矩阵,然后将其输入具有 10800 个输入、30 个隐藏层和 3 个输出的 NN。

var myNetwork = new synaptic.Architect.Perceptron(10800,30,3);

var learningRate = .3; 

将 Image 转换为 Matrix 的代码:

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”的图像的矩阵示例(我调整了实际矩阵的大小,因为它太大了): 矩阵图

当我向 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”。我在这里做错了什么?任何帮助表示赞赏,谢谢!

标签: neural-networkocrsynaptic.js

解决方案


推荐阅读