#均值和标准差对 params=[(0,1),(0,2),(3,1)] d2l.plot(x,[normal(x,mu,sigma)for mu,sigma in params],xlabel='x',ylabel='p(x)',figsize=(4.5,2.5),legend=[f'mean{mu},std{sigma}'for mu,sigma in params])
3.2 线性回归的从零开始实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
%matplotlib inline import random import torch from d2l import torch as d2l
#定义优化算法——小批量随机梯度下降 #lr:学习速率(梯度下降步长);batch_size:批量大小 defsgd(params,lr,batch_size): #@save #小批量随机梯度下降 with torch.no_grad(): for param in params: param-=lr*param.grad/batch_size param.grad.zero_() #训练 #设置超参数 lr=0.03#学习率 num_epochs=3#迭代周期个数 net=linreg loss=squared_loss
for epoch inrange(num_epochs): for X,y in data_iter(batch_size,features,labels): l=loss(net(X,w,b),y)#X和y的小批量损失 #因为l的形状是(batch_size,1),而不是一个标量。l中的所有元素被加到一起,并以此计算关于[w,b]的梯度 l.sum().backward() sgd([w,b],lr,batch_size)#使用参数的梯度以更新参数 with torch.no_grad(): train_l=loss(net(features,w,b),labels) print(f'epoch{epoch+1},loss{float(train_l.mean()):f}')
num_epochs=3#迭代周期个数 for epoch inrange(num_epochs): for X,y in data_iter: l=loss(net(X),y)#X和y的小批量损失 trainer.zero_grad() l.backward() trainer.step()#使用参数的梯度以更新参数 l=loss(net(features),labels) print(f'epoch{epoch+1},loss{l:f}')