Softmax回归的从零实现

我记得好像是我代码有问题,重新用书上的代码就好了

@Livid_Su @saint Hi, 这个问题是因为上边3.5.3演示了loaddata的方法可以同时resize图像为64*64,然后你就接这个数据往下走了。到这里就发生了数据不匹配。你可以尝试执行一下3.6.1前边的代码,重新生成一下原始图像size的test_iter

多谢指教
紫薯紫薯紫薯紫薯紫薯紫薯紫薯紫薯

1 Like

为什么同样的代码 在同一台机器上,jupyter notebook里跑和在IDE里跑 损失值、精度差别这么大呢?

Awesome!
y_hat[0] return the first tensor[0.1,0.3,0.6], and the y_hat[1] returns the second. We want the possibility of the true label of each tensor 0.1 and 0.5 returned, which is 0, 2. So y_hat[[0,1], [0,2]] returns the first posibility of the first tensor and the third posibility of the second tensor

在我自己写代码的时候,如果加上对训练损失的断言,就会报图中的错误,提示train_loss > 0.5。注释掉断言之后可以正常执行

而且在b站的课程视频中并没有看到有断言

但是我在运行书中的jupyter notebook的时候,有断言也不会报错

请问大家有没有遇到同样的问题?感谢感谢 :pray:t2:

请问这个问题解决了没?我也是这个问题唉,重新导了好几遍数据还是没有用

    if isinstance(updater, torch.optim.Optimizer):
        # 使用PyTorch内置的优化器和损失函数
        updater.zero_grad()
        l.mean().backward()
        updater.step()
    else:
        # 使用定制的优化器和损失函数
        l.sum().backward()
        updater(X.shape[0])

内置的optimizer是不是应该为l.backward() , 因为如果是内置的optimizer一般返回的误差的均值。

对“我们只需⼀⾏代码就可以实现交叉熵损失函数。”的理解,一开始有点糊涂,搞明白了记录一下。
通过
def cross_entropy(y_hat, y):
return - torch.log(y_hat[range(len(y_hat)), y])

求交叉熵损失,关键在前文中提到的“使⽤y作为y_hat中概率的索引”:
y = torch.tensor([0, 2])
y_hat[[0, 1], y]
其实就是y_hat[[0, 1], [0, 2]],如果改一改数值会发现,这其实是有对应的,0-0,1-2,从dim=0到dim=1依次取出作为位置索引。

按公式,交叉熵损失=-∑ylog(y_hat),y是one-hot encoding,一堆0和1个1,1指向的就是位置,意思是只取这个log(y_hat)。

y_hat[range(len(y_hat)), y] 中的y是在dim=0中的每一个(一共有len(y_hat)个),取其对应one-hot encoding中为1的那个位置值,然后直接取-log就是交叉熵损失。

想明白了很简单,Mark down

3 Likes

使用内置optimizer也需要l.mean().backward()
不然会报错grad can be implicitly created only for scalar outputs
原因是教材在第二章说的非标量向量求解梯度,这里是矩阵需要转换成标量形式用sum()或者mean()都行

1 Like

直接用迅雷把
http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz
http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz
以及
t10k-images-idx3-ubyte.gz
t10k-labels-idx1-ubyte.gz
(前缀一样,只能发两个链接)
下载下来,放进本书对应的文件夹下的pytorch/data/文件夹下,再重新运行代码就可以了

1 Like

也有可能是你在定义train_epoch_ch3的时候最后一行的缩进出了问题,我之前也出现了同样的问题

1 Like

这里的Y意思是有两个样本,第一个样本的正确Y值是0,也就是说第一个样本是‘t-shirt’。 第二个样本的正确Y值是2,也就是‘‘pullover’。

请教一下大家,如何保存教程里的动态图到电脑上!

你好,在实现Accumulator时的add方法时显示报错
TypeError: float() argument must be a string or a number, not ‘builtin_function_or_method’
这种情况该如何处理呢?

我也觉得,是得把调用pytorch的crossentropy里的reduction参数一直设为none才行,不设置的话loss确实是一个标量,就不用sum或者mean了

@Ye_Zhang 可是我看到的官方的交叉熵函数默认是会进行除以batch size的呀。
https://pytorch.org/docs/stable/generated/torch.nn.functional.cross_entropy.html#torch.nn.functional.cross_entropy

试一下这个?https://blog.csdn.net/wrt1213/article/details/124112847

这里用sum和mean是不是效果相同,都可以用?

文档用的mean, 但是代码中用的sum, 代码该更新了。

image

1 Like