I am trying to implement CNN using python NumPy. I searched so much, but all I found was for one filter with one channel for convolution.
Suppose $x$ is an image with the shape: (N_Height, N_Width, N_Channel) = (5,5,3)
.
Let's say I have 16
filters with this shape: (F_Height, F_Width, N_Channel) = (3,3,3)
, stride=1
and padding=0
Forward:
The output shape after convolution 2d will be
(
math.floor((N_Height - F_Height + 2*padding)/stride + 1 )),
math.floor((N_Width- F_Width + 2*padding)/stride + 1 )),
filter_count
)
So, the output of this layer will be an array with this shape: (Height, Width, Channel) = (3, 3, 16)
BackPropagation:
Suppose $dL/dh$ is the input for my layer in back-propagation with this shape: (3, 3, 16)
Now, I must find $dL/dw$ and $dL/dx$: $dL/dw$ to update my filters parameter and $dL/dx$ to pass it as input to the previous layer as the loss respect to the input $x$.
From this answer Error respect to filters weights I found how to calculate $dL/dw$.
The problem I have in the back-propagation is I don't know how to calculate $dL/dx$ having this shape: (5, 5, 3)
and pass it to the previous layer.
I read lots of articles in Medium and other sites, but I don't get how to calculate it: