提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
看了李沐老师的动手深度学习其代码来自第二版,3.1
https://zh-v2.d2l.ai/chapter_linear-networks/linear-regression.html
,最近有一点想法记录一下。手撸SGD,等方式的区别。
一、固定随机数
这步骤用来复现结果
#结果可复现 设置随机数种子
def setup_seed(seed):
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
# 设置随机数种子
setup_seed(20)
二、生成数据集
#生成数据
def synthetic_data(w, b, num_examples): #@save
"""生成 y = Xw + b + 噪声。"""
X = torch.normal(0, 1, (num_examples, len(w)))
y = torch.matmul(X, w) + b
y += torch.normal(0, 0.01, y.shape)
return X, y.reshape((-1, 1))
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)
plt.scatter(features[:,1],labels)
plt.show()
应该得到形如如下的数据:
三、初始化参数
w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)#tensor([[0.0033],[0.0007]], requires_grad=True)
b = torch.zeros(1, requires_grad=True)#tensor([0.], requires_grad=True)
定义函数
def linreg(X, w, b): #@save
"""线性回归模型。"""
return torch.matmul(X, w) + b
定义损失
def squared_loss(y_hat, y): #@save
"""均方损失。"""
return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2
四、sgd