大量输入神经元导致大加权和
Big number of input neurons causes large weighed sum
我正在尝试为我的大学项目创建一个神经网络,但 运行 遇到了问题。该网络将用于识别 320 x 200 像素图像的图像识别。这意味着,我的网络中的输入神经元数量为 64.000 (320 * 200)。
问题是,在计算隐藏层中每个神经元的加权和时,我得到了非常大的数字。因此在计算加权和时,我得到了 16000 这样的结果。这是我计算加权和的代码,希望它能澄清我所做的事情。
for(int i = 0; i < sizes[layer - 1]; i++){
double sum = 0;
for(int j = 0; j < a.size(); j++){
sum += a[j] * weights[layer - 2][i][j];
sum += biases[layer - 2][i];
}
out[i] = Sigmoid(sum);
}
我不会详细介绍代码,但它的概念是将每个权重与相应的输入值相乘。自然地,当我得到例如 16.000 或 -16.000 的输出激活时,然后 运行Sigmoid 函数将始终 return 0 或 1。
我的问题是:有什么方法可以解决这个问题,"normalize" 加权总和,以便 Sigmoid 函数 return 不是 0 或 1,或者它只是一个问题隐藏层中有大量神经元,还是按比例缩小图像?
我看到至少三个解决你问题的方法:
Xavier Initialization:这使你的神经元不仅避免了苛刻的值作为第一层 sigmoids 的输入,而且避免了同样的问题随之而来的层。
使用 relu
单位:您输入的主要问题是一种称为 梯度消失 的现象.使用不同的激活函数可以解决这个问题。
应用被认为是最先进的图像识别架构的convolutional neural layer可以解决您的问题,因为内核较小。
我正在尝试为我的大学项目创建一个神经网络,但 运行 遇到了问题。该网络将用于识别 320 x 200 像素图像的图像识别。这意味着,我的网络中的输入神经元数量为 64.000 (320 * 200)。
问题是,在计算隐藏层中每个神经元的加权和时,我得到了非常大的数字。因此在计算加权和时,我得到了 16000 这样的结果。这是我计算加权和的代码,希望它能澄清我所做的事情。
for(int i = 0; i < sizes[layer - 1]; i++){
double sum = 0;
for(int j = 0; j < a.size(); j++){
sum += a[j] * weights[layer - 2][i][j];
sum += biases[layer - 2][i];
}
out[i] = Sigmoid(sum);
}
我不会详细介绍代码,但它的概念是将每个权重与相应的输入值相乘。自然地,当我得到例如 16.000 或 -16.000 的输出激活时,然后 运行Sigmoid 函数将始终 return 0 或 1。
我的问题是:有什么方法可以解决这个问题,"normalize" 加权总和,以便 Sigmoid 函数 return 不是 0 或 1,或者它只是一个问题隐藏层中有大量神经元,还是按比例缩小图像?
我看到至少三个解决你问题的方法:
Xavier Initialization:这使你的神经元不仅避免了苛刻的值作为第一层 sigmoids 的输入,而且避免了同样的问题随之而来的层。
使用
relu
单位:您输入的主要问题是一种称为 梯度消失 的现象.使用不同的激活函数可以解决这个问题。应用被认为是最先进的图像识别架构的convolutional neural layer可以解决您的问题,因为内核较小。