private void ComputeBiasGradient(double[,,] gradients) { for (int i = 0; i < gradients.GetLength(0); i++) { _biasOptimizers[i].SetGradient(gradients.GetChannel(i).Cast <double>().Sum()); } }
private void ComputeFilterGradients(double[,,] gradients) { _weightOptimizers .AsParallel() .Select((q, i) => new { Kernel = q, Index = i }) .ForAll(q => { var dEdO = gradients.GetChannel(q.Index); for (int j = 0; j < _cache.GetLength(0); j++) { var dedf = MatrixHelper.Convolution(_cache.GetChannel(j), dEdO); q.Kernel .GetChannel(j) .ForEach((w, ii, jj) => w.SetGradient(dedf[ii, jj])); } }); }