我从头开始研究C ++中的卷积网络。在计算每个经过处理的图像后的损耗和损耗导数时,我使用了随机梯度下降法。
我这样计算损失(具有交叉熵):
for (int i = 0; i < this->nCategories; i++)
sum += refOutput[i] * log(output[0][0][i]) + ((1- refOutput[i])*log(1 - output[0][0][i]));
它是每个输出神经元的误差之和。
我用损失的导数计算梯度
for (int i = 0; i < this->nCategories; i++)
{
this->CrossEntropyDerivative[0][0][i] += -1 * (refOutput[i] * (1 / output[0][0][i]) + (1 - refOutput[i])*(1 / (1 - output[0][0][i])));
}
我想练习反向传播,我将梯度发送到最后一层向后函数-softmax
void SoftmaxLayer::Backward()
{
double sum = 0;
for (int i = 0; i < this->InputDepth; i++)
{
sum += exp(this->Input[0][0][i]);
}
for (int i = 0; i < this->InputDepth; i++) {
this->GradientOutput[0][0][i] = ((exp(this->Input[0][0][i])*(sum - exp(this->Input[0][0][i]))) / (sum*sum)) * this->GradientInput[0][0][i];
}
}
此后向功能是softmax的派生。我计算梯度输出并将其发送到先前的完全连接层。
问题是,我想将此过程转换为小批量梯度下降。我可以计算实际批次中每个项目(图像)的损耗推导。每次批处理后,我将所有错误相加并除以批处理大小。比我需要从最后一层调用向后函数。作为输入梯度,我使用“损耗的平均导数”。我不明白在反向功能中应该使用什么Input。我应该平均所有实际批次的投入吗?
谢谢