想问一下 源码中的@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*特征维度;
结果并不离谱,最后输出的是求和的损失,看收敛速度就行
是这样的,我的理解是学习率变小了,虽然误差会变小,但训练速度变慢,刚开始训练误差较学习率大的要高。
第一道题改学习率的理由是什么?不懂。。
为什么要除以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前面的 “ * ” 是什么意思呢?有什么作用?
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()前面就行,梯度是否归零不影响求损失。