Softmax回归的简洁实现

不知道有没有人和我遇到一样的问题

简洁实现我直接复制代码然后运行,提示
RuntimeError: grad can be implicitly created only for scalar outputs

查了一下应该是loss维度的问题,但我不确定应该如何改进

3 Likes

问题确定了

我导入的d2l包与教材&ppt里 train_epoch_ch3函数的写法不同

导入的包里是
if isinstance(updater, torch.optim.Optimizer):
# 使用PyTorch内置的优化器和损失函数
updater.zero_grad()
l.backward()
updater.step()
metric.add(float(l), accuracy(y_hat, y), y.numel())

没有加.mean(),所以loss维度出现了问题

7 Likes

我的的d2l包里面的函数也没有加.mean(),我把它改成教材里的一样后也是有错误,请问最后问题解决了吗,是怎么解决的呢?

哦哦,我解决了,我把 metric.add(float(l), accuracy(y_hat, y), y.numel()) 给注释掉就跑通了
image

1 Like

请问在 Softmax回归的简洁实现中:
并没有手动写SOFTMAX()这个函数,net 就是一个简单的nn.Linear(784, 10))。那么pytorch到底是在哪一步给输出加了SOFTMAX()呢?

loss = nn.CrossEntropyLoss(reduction=‘none’)

请问为什么reduction=none对一次取出的256个样本做256个loss值,而不是mean相加做平均呢?

我多次运行的时候就有这个问题,按你说的改就好了,感谢分享

我也遇到这个问题,改了torch.py里的train_epoch_ch3方法发现还是有报错啊。
我比对了一下教程网页上和下载下来的样例代码发现有不一样,教程里的是:
loss = nn.CrossEntropyLoss(reduction=‘none’)
但是样例代码里是:
loss = nn.CrossEntropyLoss()
我改了一下发现就跑成功了

6 Likes

@anirudh
Hi,I run the code on windows 10 and I meet the same error. Part of the error is below:
“”"
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.

    This probably means that you are not using fork to start your
    child processes and you have forgotten to use the proper idiom
    in the main module:

raise RuntimeError(‘DataLoader worker (pid(s) {}) exited unexpectedly’.format(pids_str)) from e
RuntimeError: DataLoader worker (pid(s) 12652, 14404, 13996, 13536) exited unexpectedly
“”"

All the environmets including version of python and torch are the same as those in book

It is said that pytorch may suffer from multi-threading error when reading data on windows.

Setting num_workers=0 solve this error

是的,才发现d2l包里的代码没有和文档代码一起更新,导致了很多bug,现在重写了一遍就都ok了!

感谢兄弟!对pytorch的方法不熟悉,哪里出问题了都不知道,现在总算能跑起来了

js文件无法加载,导致所有公式显示错乱:
https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js

我也是这里报错,请问怎么修改num_workers ?

K6S~R~7R(CQHW~12)S%L
下面有个楼主好像mean()加错位置了,加在这个位置就解决了

我试了一下softmax和交叉熵结合在一起算log(y_hat)那个公式,用excel算的。不知怎么总是不对,只有output最大的那一项能够吻合。我是哪里理解错了吗?先谢过牛人啦!这里我假设有两个output,分别是1和2:

希望这个链接对你有用

1 Like

把reduction=none去掉。。。。。。。。。。

yes, it’s very useful.

老师好!大佬们好!请问除了Softmax回归从零开始实现外,凡是碰到d2l.train_ch3或d2l.train_epoch_ch3的都会报以下错误,应该怎么办?
RuntimeError: grad can be implicitly created only for scalar outputs

爬楼翻到了:loss = nn.CrossEntropyLoss()
已解决