本次作业:Andrew Ng的CNN的搭建卷积神经网络模型以及应用(1&2)作业目录参考这位博主的整理:https://blog.csdn.net/u013733326/article/details/79827273
今天要实现的是识别手势姿势表达的数字
我的Git传送门:https://github.com/VVV-LHY/deeplearning.ai/tree/master/CNN/RecognizeGestureNum
本来是接着day17用了numpy编了一个卷积层和池化层的前向传播,然后后向传播更麻烦了,Andrew Ng的课上也开始用tensorflow和kears了。所以我开始用pytorch完成CNN的编程作业,但是因为Andrew的例子和里面加载数据全用的tensorflow,我决定发挥主观能动性,自己转化pytorch框架。(史前巨坑,因为没用过pytorch,昨天到今天遇见好多天坑)
1.pytorch的默认图片处理顺序
NxCxHxW 意思是通道C在前面,我们以前的做法是numpy和其他默认读法channel在最后面,所以需要下面的方法:
np的array数组有一个transpose方法,比如:
原来的通道是a = (N,H,W,C)
转化 a = a.transpose(0, 3, 1, 2)意思是N不变,C从第三个换到第二个,W和C分别后移一位
新的 a = (N, C, H, W)
2.torchvision包里面的dataset和dataloader
前者是把数据和标签合为dataset并且可以返回长度、还可以在方法里面转换Tensor,还可以压缩(0,255)为(0,1)用torchvision.transfroms,可以看官方文档有很多方法
dataloader可以加载dataset并且做mini batch的处理 shuffle洗牌等等
但是dataset需要自己重构类里面的方法,具体可以自行搜索。
3.损失函数报错的问题
multi-target not supported at /opt/conda/conda-bld/pytorch_1556653114079/wor
原因是你loss_func的标签label的维度不对,需要的是tensor的行向量
yourlabel.squeeze(1)
注意一定要是1,0就变成列向量了。
plus:差不多新手错误全是在数据结构上面,因为神经网络的架构只要一层一层算好(n+2p-kernel_size / s) + 1是绝对不会出错的,再难再大的网络画张图写好参数也不可能错
但是对于没有用过张量的直接从numpy转来的新手可能会因为一些方法的不同在数据结构上屡屡出错,所以从载入数据开始就要清楚每一次操作对于数据本身的shape或者size有什么影响。