李沐动手学深度学习pytorch实践笔记
2、标量对向量求导;
4、如何直观理解梯度下降;
梯度,是个向量,有方向和长度就是向量,向量里的各个元素是偏导、是标量对向量求导的那个偏导、是多元函数全微分里z对x、y求的那个偏导。
全微分dz所在的z轴是向上的,而梯度下降需要向下,所以要找负梯度方向,也就是移动了Δx和Δy之后,这个Δz的增量最大,他降低的最多,他最陡。这个向量怎么找,用方向导数,方向导数需要什么,需要偏导和角度,角度永远是0,因为cos0=1最大,所以只要有偏导就行。
所以,李沐课程第8节第3课,线性回归从零实践里,梯度下降循环了300次以更新系数w和b,这些系数就是梯度、是要找的向量。
每次更新之后,就以新的向量点的坐标为起点,继续计算方向导数,找到下一个Δz增量最大的向量。
5、课程第九节softmax回归有2个问题:
1 load_data_fashion_mnist函数里FashionMNIST是下载不了图片集的,可以把torch里的load_data_fashion_mnist改成MNIST
def load_data_fashion_mnist(batch_size, resize=None): """Download the Fashion-MNIST dataset and then load it into memory. Defined in :numref:`sec_utils`""" trans = [transforms.ToTensor()] if resize: trans.insert(0, transforms.Resize(resize)) trans = transforms.Compose(trans) mnist_train = torchvision.datasets.MNIST( root=".\\data", train=True, transform=trans, download=True) mnist_test = torchvision.datasets.MNIST( root=".\\data", train=False, transform=trans, download=True) return (torch.utils.data.DataLoader(mnist_train, batch_size, shuffle=True, num_workers=get_dataloader_workers()), torch.utils.data.DataLoader(mnist_test, batch_size, shuffle=False, num_workers=get_dataloader_workers()))
标签也改成0~9,MNIST是识别手写数字的
def get_fashion_mnist_labels(labels): """Return text labels for the Fashion-MNIST dataset. Defined in :numref:`sec_utils`""" text_labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] return [text_labels[int(i)] for i in labels]
这样以后就可以正常用 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size) 加载图片数据集了
2 pycharm中这一节的动画和图片不显示
show_images函数后面 d2l.plt.show() 就可以显示图片
在d2l的torch文件中,在 class Animator add函数最后两行中间加入两行代码
display.display(self.fig) d2l.plt.draw() d2l.plt.pause(0.001) display.clear_output(wait=True)
然后 调用 train_ch3 时,记得里面的Animator 类 要实例化 d2l的,如果改自己的Animator 就对应改它的add函数,最后调完train_ch3 函数在下面加上d2l.plt.show()就能显示动画
6、权重衰减
以softmax为例,求出的向量元素都是概率,这个向量作为损失函数的入参。所以一组大的或一组小的w和b,得到的都是概率组成的向量,最后损失函数的最小值是一样的,但是大的w和b会使特征放大,也使噪音放大了,那还不如选个小的w和b
正则化参数是限制w的Θ的倒数。所以λ=0,Θ无穷大;Θ无穷大,Θ=0
激活函数relu tanh 在原点附近接近f(x)=x,再配合合理的权重初始值,可以提升数值稳定性,防止梯度爆炸或消失
新加的层训练的是上一层的输出x和正确值之间的残差,最终训练的结果输出,就是新加层的残差输出Fx加上之前层的输出x
7、微调
现在都用基于预训练的模型和参数,然后进行微调,最后一层之前的,就基于预训练的参数和正常的学习率训练,因为这些参数变动不大,而最后的输出层变动很大,因此用10倍的学习率训练。很少有人会对所有参数重新训练,除非是大公司。
学术界和竞赛界是固定数据调模型,调试太多,验证集也变成训练集了,会过拟合。而工业界不需要调太多,需要提升数据质量,因为工业界不断有新数据,所以应该优化训练集的数据,找更多数据。
目标检测直接用别人写好的包,细节太多别自己写,Python 效率低,一般用c++或cuda 写