伯禹公益AI《动手学深度学习PyTorch版》Task 01 学习笔记

伯禹公益AI《动手学深度学习PyTorch版》Task 01 学习笔记

Task 01:线性回归;softmax与分类模型;多层感知机

微信昵称:WarmIce

疫情期间,宅在家里,天天坐着,于是乎,菊部有恙。现在只好站着写学习笔记了,人生啊,真的是太难了。好友劝说多吃汤食,多吃番茄,可是做饭也不是我管,番茄在现今的环境下也不是想买就能买到。实在难受。
不过有收获就是相当美好的一件事情,国难当头,痘痘当头,只有学到点有用的,大概才能让人开心开心吧。

所以,感谢伯禹。

这一阶段主要是学习了基本的回归模型与分类模型,属于较基本的知识点。

我目前的模型都是以回归为主,基本不做分类,因此现在就是个跛足的,对于分类可以说相当不熟悉。这一次切切实实地研究代码写代码之后,终于知道了,pytorch的交叉熵损失函数是自带了softmax操作的,更让我学习了的是,对于交叉熵损失函数本身,也加深了理解,这个损失函数可太有意思了,它只关心应当正确分类的那个值,一点都不关心其他的数据,这也就导致,pytorch的交叉熵损失函数在计算的时候,输进去的参数也贼有意思。一般来说,讲道理,一个网络的输出应该和它的target长得一模一样,事实上也的确就是这样,所以我们写的loss函数传进去的两个参数也应该是同样的shape,对不对?可是这个pytorch的交叉熵损失函数,第一个参数是网络输出没错,但是第二个参数却少了一维,第二个参数只有应当正确分类的类别对应的那个数字。说起来就比较蹊跷了,这是为啥咧?很可惜,如果你是想要通过查看pytorch的代码来找出答案,会相当麻烦,因为pytorch在实现这个函数的时候,是用C写的,你在Python中死命追踪,也最多追踪到torch._C._nn.nll_loss()函数。

import torch

l=torch.nn.CrossEntropyLoss()

a = torch.randn((1, 10))
print(a)

print(l(a, torch.Tensor([0]).long()))
a_softmax = a.exp()/a.exp().sum()
print(-torch.log(a_softmax[0, 0]))

现代软件开发呢,就是不停地查找文档或者自己做实验来检测函数可能含有的性质,毕竟轮子太特么多了。所以上面这个例子应该很详细地说明了这个损失函数的特性。首先,目标必须是一个Long类型的张量,其次,目标只是应当正确分类的那个位置的下标。也就是说我刚才说的贼有意思的地方,也是一个比较稀奇古怪的地方。现在可算弄明白了。

课程中还有一个就是对于全连接的讲解,其实对我而言是复习了,我才发现自己又遗漏(或者说是遗忘)了一些远古知识点,曲不离口、拳不离手真的是有道理。

以上。

你可能感兴趣的:(机器学习)