线性回归的简洁实现

想问一下 源码中的@torch.no_grad()中的@是什么意思 谢谢

@torch.no_grad() 是装饰器,好像代表以下代码都在torch.no_grad() 运行后执行

哦哦,第一次知道@torch.no_grad() 是这样子, 谢谢谢谢!

请问这句话 trainer.step() 的作用是什么?

老师说因为已经在loss函数里边累加了,所以不再需要累加。

Thanks for pointing it out, this has been fixed in the English version. See commit. We’ll also fix the same for the Chinese version.

我觉得准确的说应该是除以batch_size*特征维度;
结果并不离谱,最后输出的是求和的损失,看收敛速度就行

是这样的,我的理解是学习率变小了,虽然误差会变小,但训练速度变慢,刚开始训练误差较学习率大的要高。

第一道题改学习率的理由是什么?不懂。。 :grin:

为什么要除以batch_size*特征维度呢?

最后求loss的矩阵大小就是batchsize*特征维度,所以sum和mean之间的差是两者的乘积。

不是太理解tensordataset(’‘dataarray) 构建数据的方式,请问’'是干嘛用的,个人理解就可以直接
tensordataset(features, labels)

一个奇怪的问题,我观察代码的时候,似乎并没有看见损失函数

loss = nn.MSELoss()
l = loss(net(X) ,y)

与小批量随机梯度下降算法的代码

trainer = torch.optim.SGD(net.parameters(), lr=0.03)

产生联系,他们之间是怎么传递参数的?

l.backward利用loss的结果将梯度存在了w和b中,进而在SGD的net.parameter中调用

我的理解是,执行前面的那个梯度步骤,通过调用优化器(trainer)来更新模型参数。

我想问一下在 dataset = data.TensorDataset(*data_arrays)中,
*data_arrays前面的 “ * ” 是什么意思呢?有什么作用?

1 Like

f(*x)表示x为元组,所有对x的操作都应将x视为元组类型进行,,即所有传入f(*x)的变量都将作为元组x的元素之一。

for question3, we can use print(net[0].weight.grad) in training process to get gradient:
l = loss(net(X), y)
l.backward()
print(net[0].weight.grad)
trainer.step()

hh,我也觉得需要加入,with torch.no_grad(),我试了一下,加或不加,好像都一样,请问一下您弄清楚了吗

只要放到l.backward()前面就行,梯度是否归零不影响求损失。