Questions
Hi,麻烦您解释一下在base_conv.py里面卷积的反向传播代码:flip_weights = np.flipud(np.fliplr(self.weights)) 这里为什么需要左右上下翻转完了再进行reshape,谢谢啦
您好、要理解卷积的反向传播和deconv的关系、需要配合图文理解. 手机码字解释不方便,推荐参考我在知乎写的文章 https://zhuanlan.zhihu.com/p/33802329?utm_medium=social&utm_source=wechat_timeline&from=timeline&isappinstalled=0
base conv的代码还少一个 swapaxes 推荐参考新版本的代码,tensor文件里面重新封装的conv 操作符
卷积核翻转的可以理解了,但是你的代码里为什么需要加swapaxes,可以详细解释一下吗? 谢谢了!
这个问题不是很好解释、因为翻转卷积核的原理是我们在二维卷积操作的基础上直观理解的.涉及到channels那个维度应该如何操作想象起来有些困难:说两点 1.通过grad check检验一下、不swapaxes算出来的是错的.关于conv的grad check可以去专栏找一下有一篇详细的解释. 2. 关于带有channels的卷积的反传、为了帮助你理解swapaxes、想象一个图像w=1,h=1,c=m 然后卷积核是1x1xmxn,这种情况就把卷积退化成了mlp、mlp的反传需要转置、对应过来就是swapaxes.不知道这个解释想象起来是否直观.(这个出现在评论区、最近没空改上去)
你好首先感谢的解释关于为什么在卷积层的反向传播里面需要翻转卷积核,感觉代码里面的卷积核翻转和输入的维度排列也有关系,这里的卷积核翻转适合[batch,w,h,channel]的tensor,如果是[batch,channel,w,h]的tensor,可能就不太适合,不知道对不对,希望指正,其次有一个问题就是卷积反向传播里面代码里面默认的stride都是1,如果stride>1,反向传播 是不是应该先补零,然后在按stride=1来进行处理??谢谢!
关于第一个问题,我不是很理解你的意思,我想转置和翻转两个操作都需要做,无论你如何调整顺序。wh两个维度上就是要做翻转的,channel维度上要做转置。因为网络的卷积和传统的不一样,CNN中的卷积本质而言是二维图像的卷积+将channels二维图像作为列向量的mlp.那么在图像的那个二维上就是需要去做核的翻转,在channels那个维度上就是要做转置,这是运算性质决定的。 第二个问题,关于stride,确实是需要补0.本来我思考过这个问题,后来我意识到,带stride的conv是可以分解乘一个conv+pooling,只不过pooling是固定位置的pooling,这样结合pooling的反传应该很容易得到结论就是补0. 不知道我的回答怎么样~我也是不断自学ing,欢迎可以复现我的代码和结果,并多多讨论。