如何在不调整神经元数量的情况下修复此点积方法? (JAVA)

时间:2018-01-11 13:34:19

标签: java multidimensional-array neural-network dot-product

我正在测试我的神经网络进行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;
}

函数的sigmoid部分不是问题,因为它需要一个双倍和 dotProduct应该输出一个double。据我所知,问题是dotProduct函数正在采用一个更大的多维数组,然后尝试用更小的数组交叉它(layer1.getWeights getter调用该层的权重数组)。

图层的权重定义如下:

layerWeights = new double[numNeurons][inpNum];

并且点积中使用的图层是:

XORlayer layer1 = new XORlayer(4, 3);

所以4个神经元各有3个输入。这个问题源于这样一个事实,就我所知,在这一层中没有足够的神经元用于输入量,当没有任何进一步与输入值相乘时产生空指针异常

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

我的主要问题是,有没有办法解决这个问题,所以点积运算成功完成,而不是简单地将图层包含的神经元数量扩展到7?

1 个答案:

答案 0 :(得分:1)

This discussion可能有所帮助。正如那里所建议的那样,由于您使用的是二维数组,因此矩阵乘法(而不是点积)可能更合适。

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

inputSets是7x3矩阵,layerWeights是4x3矩阵。 layerWeights的{​​{3}}是3x4矩阵。现在尺寸对齐,矩阵乘法产生7x4矩阵。

根据发布的代码,我会建议这样的事情:

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