目前深度学习框架的主流还是tensorflow,不过pytorch的热度正在上升,而且对于我这样的同学(懂一点python和机器学习,希望尽快完成应用或试验,部署环境要求不高比如不考虑嵌入式设备),pytorch的吸引力更大一点,所以在这里分享一点在pytorch中填坑的经验,希望为其他的pytorch用户减少一些麻烦。
1) 可以通过编码器自动提取隐含特征,相比人手提取,精度不一定有优势(事实上一般都是没有优势。。。),但是效率上有一定优势(人手提取特征需要对行业有相当深厚的经验积累),提取的特征可以用于分类任务,pytorch中可以调用神经网络模块构建编码器和分类器,这个教程好多我就不多说了,
2) 前面提到编码器接分类器的精度不一定能满足要求,这时候可以尝试集成学习,比如把原始数据分成不同的带重叠的子集,训练出多个弱分类器,把弱分类器的输出重构为新的输入,再接一个最终分类器,这样得到的结果一般比前面那些弱分类器要好,pytorch中没有现成的集成学习,不过可以自己方便的构建一个,
3) 个别资料提到为了改善分类效果可以使用稀疏降噪加上逐层贪心训练来构建编码器,我试验的结果表明在adam中设置下权重衰减(即L2正则化)即可达成不错的效果,强行稀疏降噪的意义尚不明确,而pytorch可以加relu激活函数进行多层网络一体优化,逐层贪心训练也无实际意义,
4) 前述编码器接分类器,可以先训练编码器,再训练分类器,最后接一个全局微调(也可不接),如果要全局微调,需要定义一个包含编码器和分类器的完整模型,不然损失函数无法正常工作(loss要求同一模型,且均为variable否则会报错grad相关),
5) MSELoss(均方误差)要求维度要一致比如都是100×1而不能一个100×1一个100不然会报错提示grad问题,BCELoss(二分类交叉熵)则要求标签为0到n-1的1维数组而不是100×1否则会报错multi target not supported
6) LR(逻辑回归)要求输入和标签都是float否则会报错got ooo but expect xxx,而图像的多分类任务中则要求标签为int64,
7) 使用pytorch的nn模型(神经网络)时要特别注意传递的数据的结构,层与层之间的维数要衔接的上,不然会报错,这个在多数据集调试时特别容易出错,可以用参数化建模来减少此类异常
8) 相比我之前使用的rapidminer,pytorch可选择可自定义的地方更多,同时效果也更不稳定(下限更低,上限更高),值得投入更多的资源进行研究,同时pytorch必然的会受神经网络的过拟合困扰
9) pytorch的逻辑回归不知为何需要更大的学习率和更多的循环数(相比pytorch的全连接神经网络而言),如果有明白为什么的朋友还请在评论里指点我一下,谢谢。