Javascript 前馈神经网络的输出逼近0

Javascript 前馈神经网络的输出逼近0,javascript,neural-network,Javascript,Neural Network,我正试图用JavaScript创建一个简单的前馈神经网络,使用一个找到的教程。我相信我正确地遵循了教程,就像我用[[0,0,1],[0,1,1],[1,0,1],[1,1]]的输入矩阵和[[0],[1],[1],[0]的解矩阵训练它一样,网络按预期运行。然而,当我尝试使用和传递更大的矩阵来训练网络时,输出数组中的所有元素都接近零。我怀疑这与输入数组的点积和返回一个充满大量数字的数组的权重有关,但我试图缩小这些数字,导致输出接近1。有人能找出哪里出了问题吗?我的神经网络只有一个包含300个神经元的

我正试图用JavaScript创建一个简单的前馈神经网络,使用一个找到的教程。我相信我正确地遵循了教程,就像我用
[[0,0,1],[0,1,1],[1,0,1],[1,1]]
的输入矩阵和
[[0],[1],[1],[0]
的解矩阵训练它一样,网络按预期运行。然而,当我尝试使用和传递更大的矩阵来训练网络时,输出数组中的所有元素都接近零。我怀疑这与输入数组的点积和返回一个充满大量数字的数组的权重有关,但我试图缩小这些数字,导致输出接近1。有人能找出哪里出了问题吗?我的神经网络只有一个包含300个神经元的隐藏层。下面的代码片段显示了我的神经网络的方法,因为我相信这就是我出错的地方,但是如果你想看到我的整个凌乱的、未记录的程序,可以找到它。我不熟悉我正在使用的数学库,这意味着我用自己的一些方法来配合数学方法

  • 多元矩阵(a,b)返回矩阵a和b的乘积
  • 乘法(a,b)返回两个矩阵的点积
  • 数学。加(a,b)和数学。减(a,b)执行矩阵加法和减法,以及
  • 转置矩阵(a)返回矩阵a的转置
  • setAll(a,b)对矩阵a的每个元素执行一个操作,在“sigmoid”的情况下,将元素插入到sigmoid函数(1/(1+a^-e)),或在“sigmoidDrivitive”的情况下插入到sigmoid导数函数(a*(1-a)),或者在“randomlow”的情况下,将其设置为0到0.05之间的随机值
我发现将权重设置为0到1之间的值会使损失保持在0.9,因此我现在使用“randomlow”设置它们


函数神经网络(x,y){
//初始化神经网络
这个输入=x;
这个。y=y;
this.size=[this.input._size[1],300,this.y._size[1];
this.layers=this.size.length-1;
this.lyrs=[this.input];
此参数为:权重=[];
this.dwweights=[];
对于(var i=0;i=0;--i){
this.input.unshift(this.lyrs[i]);
this.weightInput=(i==this.weights.length-1?0:this.weights[i+1]);
this.dwweights[i]=this.antis[i](this.input,this,this.weightInput);
}
对于(var i=0;i

和往常一样,我感谢花在解决我的问题上的任何时间。如果我的代码无法理解,就不用费心了。JavaScript可能不是实现这一目的的最佳语言,但我不想使用相同的语言学习教程

编辑:这是的潜在副本,已回答。如果有人面临这个问题,他们应该看看那边的答案是否有帮助。到目前为止,我还没有用我的程序测试它

function NeuralNetwork(x, y){
    //Initializing the neural network
    this.input = x;
    this.y = y;
    this.sizes = [this.input._size[1], 300, this.y._size[1]];
    this.layers = this.sizes.length - 1;
    this.lyrs = [this.input];
    this.weights = [];
    this.dweights = [];
    for(var i = 0; i < this.layers; i ++){
        this.weights.push(new math.matrix());
        this.weights[i].resize([this.sizes[i], this.sizes[i + 1]]);
        this.weights[i] = setAll(this.weights[i], "randomlow");
    }
    this.output = new math.matrix();
    this.output.resize(this.y._size);
};

NeuralNetwork.prototype.set = function(x, y){
    //I train the network by looping through values from the database and passing them into this function
    this.input = x;
    this.lyrs = [this.input];
    this.y = y;
};

NeuralNetwork.prototype.feedforward = function(){
    //Looping through the layers and multiplying them by their respective weights
    for(var i = 0; i < this.weights.length; i ++){
        this.lyrs[i + 1] = math.multiply(this.lyrs[i], this.weights[i]);
        this.lyrs[i + 1] = setAll(this.lyrs[i + 1], "sigmoid");
    }
    this.output = this.lyrs[this.lyrs.length - 1];
};

NeuralNetwork.prototype.backpropogate = function(){
//Backpropogating the network. I don't fully understand this part
this.antis = [
function(a, b, c){
    return(
    math.multiply(transposeMatrix(a[0]), multMatrices(math.multiply(multMatrices(math.multiply(math.subtract(b.y, b.output), 2), setAll(b.output, "sigmoidDerivitive")), transposeMatrix(c)), setAll(a[1], "sigmoidDerivitive")))
    );
},
function(a, b, c){
    return(
    math.multiply(transposeMatrix(a[0]), multMatrices(math.multiply(math.subtract(b.y, b.output), 2), setAll(b.output, "sigmoidDerivitive")))
    );
}];
this.input = [];
this.weightInput = 0;
for(var i = this.weights.length - 1; i >= 0; --i){
    this.input.unshift(this.lyrs[i]);
    this.weightInput = (i === this.weights.length - 1 ? 0 : this.weights[i + 1]);
    this.dweights[i] = this.antis[i](this.input, this, this.weightInput);
}
for(var i = 0; i < this.dweights.length; i ++){
this.weights[i] = math.add(this.weights[i], this.dweights[i]);
}
};