目录
本方法同样适用遇到以下报错(d2l-0.17.0)):RuntimeError: grad can be implicitly created only for scalar outputs
0. 我的环境:
Python版本:
只装了以下三个包:
都是本地pip install装上的
关于调环境
- 其他版本的d2l也会遇到报错,推荐删除其他版本的d2l包,pip安装对应版本(d2l-0.17.0),亲测有效
可参考:《动手学深度学习》笔记1——Pytorch虚拟环境搭建-CSDN博客
tips:删除包可以使用pip uninstall package-name,不一定非得用
conda remove package-name
1. 顺藤摸瓜
这和咱的代码不一样:
少了个mean求均值,下面也有错,咱直接改源码,整块复制粘贴过去:
for X, y in train_iter: # 扫一遍数据
# 计算梯度并更新参数
y_hat = net(X)
l = loss(y_hat, y)
if isinstance(updater, torch.optim.Optimizer): # 检查变量updater是否是torch.optim.Optimizer的实例
# 使用PyTorch内置的优化器和损失函数
updater.zero_grad() # 先把梯度设成零
l.mean().backward() # 计算梯度
updater.step() # 更新参数
else:
# 使用定制的优化器和损失函数(也就是咱这里从头开始实现的情况)
l.sum().backward()
updater(X.shape[0]) # X.shape[0] 给出当前批次的样本数量
metric.add(float(l.sum()), accuracy(y_hat, y), y.numel()) # (训练损失总和、训练准确度总和、样本数)
2. 改源码
拿上面的替换下面(源码里)的:(默认路径如下)
anaconda3 >envs > d2l-1 > Lib > site-packages >d21> torch.py
- (这里的 “d2l-1” 是环境名称,应该换成咱想要调的环境)
运行看看,成功啦!看看输出↓
3. 输出
4. 原因分析
- 咱看的视频课程还是2021年版本的,jupyter代码是新下载的(是正确的),而d2l包的源代码还是21年老版本的,有很多问题还没改过来
- 当然还有一种可能,这个train_epoch_ch3()函数在后面用不到,后面会从新定义更泛用的train_epoch()函数