为什么会断言train_loss小于0.5呢
我也出现了这个问题,解决的方式有点莫名其妙,不过如下:
1.插入了这一行,之前运行的时候没有加
2.修改了这里的括号,一定要数清楚这里的括号,象征的意思太多了。
然后我就run出来了,希望有帮助!另外我把b换成了inputs的跑了一遍,额,然后就出来了
是不是数据集因为网络问题没有成功下载,
因为你的train_loss损失大于0.5,所以就停止运行了。根据报错来看,你的train_loss应该是0.786,你把边界值大概改小一点即可
让训练过程在后台线程运行,图形显示在前台主线程中(GUI不能在后台线程),通过后台线程调用API(plt.draw()
)更新前台打开的绘图窗口。以下是修改代码示意:
import threading
class Animator: #@save
def add(self, x, y):
'''...内容省略...'''
if 'display' in globals(): # 非Notebook环境不调用display()
# display:ipython = globals()['display']
display.display(self.fig)
display.clear_output(wait=True)
def train(net, train_iter, test_iter, loss, num_epochs, updater): #@save
# animator = Animator(...)
def train_thread():
for epoch in range(num_epochs):
'''...原有的训练过程代码...'''
if 'display' not in globals():
print('epoch {0}: train loss {1}, train accuracy {2}, test accuracy {3}.'.format(
epoch, train_metrics[0], train_metrics[1], test_acc
)) # 控制台输出
d2l.plt.draw() # 更新绘图
train_loss, train_acc = train_metrics
'''...原有的训练过程代码...'''
if 'display' not in globals():
th = threading.Thread(target=train_thread, name='training')
th.start()
d2l.plt.show(block=True) # 显示绘图
th.join()
感谢!
我也是遇到了这个问题,找不到解决方法,翻了好久评论终于在你这找到了答案!
我也挺好奇为什么其他的同学没有遇到类似的问题
Run with Jupyter notebook or add “d2l.plt.show()”
这里执行第二段代码报
UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at .[./learn_/Dive_into_deep_learning/d2l-zh/pytorch/chapter_linear-networks/torch/csrc/utils/tensor_numpy.cpp:180).)
这个错,不过好像不影响运行其他代码,有什么办法修复吗?
cross_entropy只是计算loss,真更新还是靠updater,相当于前面章节的train方法,updater里面就是一个sgd,最后训练好的模型的参数就是W和b了。
def cross_entropy(y_hat, y):
return - torch.log(y_hat[range(len(y_hat)), y])
cross_entropy(y_hat, y)
这里的交叉熵损失函数定义为什么没有y_hat本身与LOG相乘?就是直接使用LOG函数了。
我发现这里每个epoch只训练了一个batchsize的数据,对吗?这好像我以前对于“每个epoch要遍历全体数据集一遍”的认知,并且下载的fashion-mnist数据都是一些无法打开的文件,它们是怎么被读入的?
每个epoch只训练了一个batchsize的数据
不是的,你看Dataloader部分的定义
fashion-mnist数据都是一些无法打开的文件
从名称看应该都是字节数据,直接读取的byte
已经把dataloader里面的num_workers设置成0了,但是还是报错,如何解决?
这个if的两个选择是选择训练的时候使用内置还是自定义的优化器,都是在训练阶段;只有在验证或测试阶段需要with torch.no_grad()
问题5 不就是 word2vec 训练过程遇到的问题么,word2vec 采用了两种训练优化方法:Hierarchical softmax 和 Negative Sampling
Accumulator这个类的add函数设计不好,非常2容易让人产生歧义,metric.add(1,2);让人以为是1和2相加,而实际上是self.data[0] = self.data[0] +1;self.data[1] = self.data[1] +1
应该是内置的loss_function 求的的是均值loss, 这里虽然optim使用的是内置的,但是求l所用的损失函数是自定义的,函数结果没有除以batch,所以先对l求均值
可能现在回复你已经过时了,不过 按我的理解,sum和mean其实主要影响了“梯度的大小”,反向传播时,依据损失求梯度,如果是sum,则梯度会比mean大n倍,那么在学习率不变的情况下,步子会迈得很长,体现到图形上就是正确率提升不了。所以需要缩小学习率。
如有不对还望指正。
if isinstance(updater, torch.optim.Optimizer):
# 使用PyTorch内置的优化器和损失函数
updater.zero_grad()
l.mean().backward()
updater.step()
else:
# 使用定制的优化器和损失函数
l.sum().backward()
updater(X.shape[0])
请问下为什么使用定制的优化器的时候,就不需要清零梯度呢?