在学习李沐的动手学深度学习,从零开始实现softmax回归中,我跟着敲完代码,发现无法运行,报错入如下:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[72], line 3
1 num_epochs = 10
2 print("000000000000000000000")
----> 3 train_ch3(net,train_iter,test_iter,cross_entropy,num_epochs,updater)
Cell In[71], line 6, in train_ch3(net, train_iter, test_iter, loss, num_epochs, updater)
3 animator = Animator(xlabel = 'epoch',xlim=[1,num_epochs],ylim=[0.3,0.9],
4 legend=['train loss','train acc','test acc'])
5 for epoch in range(num_epochs):
----> 6 train_metrics = train_epoch_ch3(net,train_iter,loss,updater)
7 test_acc = evaluate_accuracy(net,test_iter)
8 animator.add(epoch + 1,train_metrics + (test_acc,))
Cell In[69], line 21, in train_epoch_ch3(net, train_iter, loss, updater)
19 print(X.shape[0])
20 print("W.grad:",W.grad)
---> 21 updater(X.shape[0])
22 metric.add(float(l.sum()),accuracy(y_hat,y),y.numel())
23 #返回训练损失和训练精度
Cell In[67], line 3, in updater(batch_size)
2 def updater(batch_size):
----> 3 return d2l.sgd([W,b],lr,batch_size)
...
153 print("param.gram数据类型:")
--> 154 param.data.sub_(lr*param.grad/batch_size)
155 param.grad.data.zero_()
TypeError: unsupported operand type(s) for *: 'float' and 'NoneType'
经过debug发现是param.grad(即W.grad)为None,即求梯度失败,反复看了代码,发现是在一开始W的定义中没有设置为求梯度,如下所示
W = torch.normal(0,0.01,size = (num_inputs, num_outputs))
加入计算梯度的参数后为:
W = torch.normal(0,0.01,size = (num_inputs, num_outputs),require_grad = True)
最终问题得到解决,以后写代码一定认真点,因为这一个错误,debug了好久。