如何在不调整神经元数量的情况下修复此点积方法? (Java)
How can I fix this dot product method without adjusting the number of neurons? (Java)
我正在测试我的神经网络以进行 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 部分不是问题,因为它需要一个 double 和
dotProduct 应该输出双精度值。据我所知,问题是 dotProduct 函数采用了一个更大的多维数组,然后尝试将它与一个更小的数组交叉(layer1.getWeights getter 调用权重数组层)。
层的权重定义如下:
layerWeights = new double[numNeurons][inpNum];
点积中使用的图层是:
XORlayer layer1 = new XORlayer(4, 3);
所以 4 个神经元,每个神经元有 3 个输入。这个问题源于这样一个事实,即这一层中没有足够的神经元来满足输入量,据我所知,当没有任何进一步乘以输入值时,它会生成空指针异常.
我们在神经元中有 12 个输入,以及 21 个输入值。
我的主要问题是,有没有办法解决这个问题,使点积运算成功完成,而无需简单地将层包含的神经元数量扩展到 7 个?
This discussion 可能会有帮助。正如此处所建议的那样,由于您使用的是二维数组,因此矩阵乘法(而不是点积)可能更合适。
当然和点积类似,矩阵乘法的dimensions must be aligned
inputSets
是一个 7x3 矩阵,layerWeights
是一个 4x3 矩阵。 layerWeights
的 transpose 是一个 3x4 矩阵。现在尺寸对齐了,矩阵乘法得到一个 7x4 矩阵。
根据发布的代码,我建议如下:
output_from_layer1 = sigmoid(matrixMult.multiply(input, transpose(layer1.getWeights())));
我正在测试我的神经网络以进行 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 部分不是问题,因为它需要一个 double 和 dotProduct 应该输出双精度值。据我所知,问题是 dotProduct 函数采用了一个更大的多维数组,然后尝试将它与一个更小的数组交叉(layer1.getWeights getter 调用权重数组层)。
层的权重定义如下:
layerWeights = new double[numNeurons][inpNum];
点积中使用的图层是:
XORlayer layer1 = new XORlayer(4, 3);
所以 4 个神经元,每个神经元有 3 个输入。这个问题源于这样一个事实,即这一层中没有足够的神经元来满足输入量,据我所知,当没有任何进一步乘以输入值时,它会生成空指针异常.
我们在神经元中有 12 个输入,以及 21 个输入值。
我的主要问题是,有没有办法解决这个问题,使点积运算成功完成,而无需简单地将层包含的神经元数量扩展到 7 个?
This discussion 可能会有帮助。正如此处所建议的那样,由于您使用的是二维数组,因此矩阵乘法(而不是点积)可能更合适。
当然和点积类似,矩阵乘法的dimensions must be aligned
inputSets
是一个 7x3 矩阵,layerWeights
是一个 4x3 矩阵。 layerWeights
的 transpose 是一个 3x4 矩阵。现在尺寸对齐了,矩阵乘法得到一个 7x4 矩阵。
根据发布的代码,我建议如下:
output_from_layer1 = sigmoid(matrixMult.multiply(input, transpose(layer1.getWeights())));