protected override void BackPropInternal(Tensor outputGradient) { Tensor.Conv2DInputsGradient(outputGradient, Kernels, Stride, InputsGradient[0]); Tensor.Conv2DKernelsGradient(Inputs[0], outputGradient, Stride, Tensor.PaddingType.Valid, KernelsGradient); if (UseBias) { BiasGradient.Add(outputGradient.SumBatches()); } }
protected override void BackPropInternal(Tensor outputGradient) { // for explanation watch https://www.youtube.com/watch?v=8H2ODPNxEgA&t=898s // each input is responsible for the output error proportionally to weights it is multiplied by Weights.Transposed().Mul(outputGradient, InputsGradient[0]); WeightsGradient.Add(outputGradient.Mul(Inputs[0].Transposed()).SumBatches(), WeightsGradient); if (UseBias) { BiasGradient.Add(outputGradient.SumBatches(), BiasGradient); } }