一些相关网站
代码搜寻网站:
The latest in Machine Learning | Papers With Code
代码局部展示:
入门旅程
血泪教训:
先刷土堆的视频,土堆,永远的神,然后再去看深度学习的书籍效果会更好,比如Pytorch,《动手学深度学习》等
——先入门,再琢磨
深度学习概述:
深度学习属于机器学习的分支,里面包含卷积神经网络(CNN),循环神经网络(RNN),全连接神经网络,实现这几种网络需要框架(也可以理解为库),拿卷积神经网络来看,里面存在卷积运算,卷积核(滤波器)的参数刚开始是随机的,但随着不断的反馈,loss的不断降低,卷积核的参数不断优化,这些参数就是识得的经验,也即通过这个参数来进行一个函数的拟合,从而实现建模。
Attention:搭建的网络是有输入和输出尺寸的要求的,因此会有一些前置步骤
迁移学习:
现在已经存在很多预训练好的流行的深度学习网络,我们可以针对自己的需求,对预训练好的网络进行微调或者特征提取,从而快速完成自己的任务。要注意,即使是不同的模型,也可以使用迁移学习,比如语义分割与分类模型的主干部分,就可以使用同一个预训练好的参数。
对于特征提取中经常用到的冻结训练可以如下理解:预训练模型参数冻结后,怎么更新,不需要更新,因为这就是已经比较好适应特征的参数了,现在你的模型处于初始阶段,不能让它影响到了好的参数,因此需要冻结
有两张图对于微调和特征提取的表示十分清楚明晰。
本质:
你的模型经过不断地调整以适应当前数据集,所以其最优表现大概率是在你的数据集上,这样来看,神经网络的泛化性能并不好,而举办那么那么多的比赛,其目的还是追求在已知的条件下,哪种模型对未知的东西预判性能更好。
所谓玄学:
神经网络经过不断地尝试调参之后,得到了一个不错的结果,给这个结果赋予一个好的故事,一切就都结束,但是这些都是发展过程中必不可少的阶段,正是因为有了实验上积累起来的量变,才会有将来的质变,你我皆是耕耘人。
数据集划分
在机器学习和深度学习中,数据集的划分通常涉及训练集、验证集和测试集三个部分。常见的划分方式为:
训练集(Training Set):
训练集用于训练模型的参数,模型通过与训练集中的样本进行学习来调整权重和偏置。通常,训练集占据整个数据集的大部分比例,例如 70% 或 80%。
验证集(Validation Set):
验证集用于模型的超参数调优和模型性能的监控。在训练过程中,通过在验证集上评估模型的性能,可以选择最佳的超参数配置,并进行早停(early stopping)等策略。验证集通常占据数据集的一小部分,例如 10% 或 20%。
测试集(Test Set):
测试集用于评估最终模型在未见过的数据上的性能(因此除了损失函数外的其余评估指标应用于测试集)。测试集应该是一个独立的数据集,模型在训练和验证过程中没有接触过这些样本。测试集的目的是提供一个真实的评估,以验证模型的泛化能力。测试集通常占据剩余数据集的一部分,例如 10% 或 20%。
划分数据集时,应该保持数据集的随机性和代表性。确保各个数据集中的样本是随机选择的,并且能够代表整个数据集的特征和分布。此外,还需要确保训练集、验证集和测试集之间的样本是互斥的,以防止数据重复使用。
训练
训练时要注意在训练集开始设置mode.train(),这样BN和Dropout等层会被执行,在验证集和测试集开始设置model.eval(),这样BN和Dropout等层不会被执行,这样就避免了某种程度上的梯度变化。
调参
损失函数(调参的目标之一):
如果损失函数具有评估意义的话,需要看数值和收敛性。如果没有评估意义的损失函数,只需要看其收敛性即可。仅仅有损失函数一个指标并不可信,在这个过程中,你还需要有其他的评估指标对模型性能进行评价,因此,在保证损失函数符合要求的情况下,让其他评估指标尽可能小。
调参(炼丹大法):
超参数调优第一弹:batch_size(模型的输入一般仅和你的图片大小,即长宽,以及图片深度有关,和网络模型的输入数量可以不一致,主要适合你的计算机性能就好,当然它也会影响你得模型效果)
超参数调优第二弹,然后调整学习率(可以使用自适应算法,使学习率随着批次不断调整)
超参数调优第三弹,调整优化器,优化器里面有一些参数可以调(其中就包括学习率)
调优终弹,调整模型,可以选择一些优秀论文中经常采取的模型架构,比如最近几年出的UNET
听说这个挺不错,但我还没来得及看:google-research/tuning_playbook: A playbook for systematically maximizing the performance of deep learning models. (github.com)