我正在测试我的神经网络的XOR比较,并且遇到了一个错误,我想在不更改第一个隐藏层中的神经元数量的情况下进行修复。导致错误的代码是:

public double dotProduct(int[][] a, double[][] ds)
{
    int i;
    double sum = 0;
    for(i = 0; i < a.length; i++)
    {
        int j;
        for(j = 0; j < a[i].length; j++)
        {
            sum += a[i][j] * ds[i][j];
        }
    }
    return sum;
}


给我一个空指针异常。点积计算本身用于从神经网络已经提供的输入集中生成点积。

输入集是这样的:

int inputSets[][] =
        {
                {0, 0, 1},
                {0, 1, 1},
                {1, 0, 1},
                {0, 1, 0},
                {1, 0, 0},
                {1, 1, 1},
                {0, 0, 0}
        };


这是一个包含7个数组的多维数组。然后将其用于此:

public double think(int[][] input)
{
    output_from_layer1 = sigmoid(dotProd.dotProduct(input, layer1.getWeights()));

    return output_from_layer1;
}


函数的S形部分不是问题,因为它需要一个double和
dotProduct应该输出一个double。据我所知,问题是dotProduct函数采用一个较大的多维数组,然后尝试将其与较小的多维数组交叉(layer1.getWeights getter调用该层的weights数组)。

层的权重定义如下:

layerWeights = new double[numNeurons][inpNum];


点产品中使用的图层是:

XORlayer layer1 = new XORlayer(4, 3);


因此4个神经元各有3个输入。据我所知,该问题源于这一层,因为据我所知,该层中没有足够的神经元来容纳输入量,当没有任何进一步的乘积可与输入值相乘时,它将生成空指针异常。

我们在神经元中有12个输入,还有21个输入值。

我的主要问题是,有没有一种方法可以解决此问题,从而使点积运算成功完成,而无需简单地将图层包含的神经元数量扩展到7个?

最佳答案

This discussion可能会有所帮助。如此处所建议的,由于您使用的是2D数组,所以矩阵乘法(而不是点积)可能更合适。

当然,类似于点积,dimensions must be aligned用于矩阵乘法。

inputSets是7x3矩阵,layerWeights是4x3矩阵。 layerWeightstranspose是3x4矩阵。现在,尺寸已对齐,并且矩阵乘法生成7x4矩阵。

根据发布的代码,我建议如下所示:

output_from_layer1 = sigmoid(matrixMult.multiply(input, transpose(layer1.getWeights())));

关于java - 如何在不调整神经元数量的情况下解决这种点积方法? (Java),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48208348/

10-12 23:28