/// <summary> /// Computes the error gradient w.r.t the inputs. /// </summary> /// <param name="colTop">top output Blob vector (Length 1), providing the error gradient /// with respect to computed outputs.</param> /// <param name="rgbPropagateDown">propagate down see Layer::Backward</param> /// <param name="colBottom">bottom input Blob vector (Length 1) /// </param> protected override void backward(BlobCollection <T> colTop, List <bool> rgbPropagateDown, BlobCollection <T> colBottom) { if (!rgbPropagateDown[0]) { return; } if (m_nPyramidHeight == 1) { m_rgPoolingLayers[0].Backward(colTop, rgbPropagateDown, colBottom); return; } List <bool> rgbConcatPropagateDown = Utility.Create <bool>(m_nPyramidHeight, true); m_concat_layer.Backward(colTop, rgbConcatPropagateDown, m_colBlobConcatBottomVec); for (int i = 0; i < m_nPyramidHeight; i++) { m_rgFlattenLayers[i].Backward(m_rgFlattenLayerTopVecs[i], rgbPropagateDown, m_rgPoolingTopVecs[i]); m_rgPoolingLayers[i].Backward(m_rgPoolingTopVecs[i], rgbPropagateDown, m_rgPoolingBottomVec[i]); } m_split_layer.Backward(m_colBlobSplitTopVec, rgbPropagateDown, colBottom); }
private void WithinChannelBackward(BlobCollection <T> colTop, List <bool> rgbPropagateDown, BlobCollection <T> colBottom) { if (rgbPropagateDown[0]) { List <bool> rgbProductPropagateDown = Utility.Create <bool>(2, true); m_productLayer.Backward(colTop, rgbProductPropagateDown, m_colProductBottomVec); m_powerLayer.Backward(m_colPowerTopVec, rgbPropagateDown, m_colPoolTopVec); m_poolLayer.Backward(m_colPoolTopVec, rgbPropagateDown, m_colSquareTopVec); m_squareLayer.Backward(m_colSquareTopVec, rgbPropagateDown, m_colSquareBottomVec); m_splitLayer.Backward(m_colSplitTopVec, rgbPropagateDown, colBottom); } }