我记得好像是我代码有问题,重新用书上的代码就好了
@Livid_Su @saint Hi, 这个问题是因为上边3.5.3演示了loaddata的方法可以同时resize图像为64*64,然后你就接这个数据往下走了。到这里就发生了数据不匹配。你可以尝试执行一下3.6.1前边的代码,重新生成一下原始图像size的test_iter
多谢指教
紫薯紫薯紫薯紫薯紫薯紫薯紫薯紫薯
为什么同样的代码 在同一台机器上,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的时候,有断言也不会报错
请问大家有没有遇到同样的问题?感谢感谢
请问这个问题解决了没?我也是这个问题唉,重新导了好几遍数据还是没有用
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
使用内置optimizer也需要l.mean().backward()
不然会报错grad can be implicitly created only for scalar outputs
原因是教材在第二章说的非标量向量求解梯度,这里是矩阵需要转换成标量形式用sum()或者mean()都行
直接用迅雷把
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/文件夹下,再重新运行代码就可以了
也有可能是你在定义train_epoch_ch3的时候最后一行的缩进出了问题,我之前也出现了同样的问题
这里的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
这里用sum和mean是不是效果相同,都可以用?
文档用的mean, 但是代码中用的sum, 代码该更新了。