好问题 @SaltyFishing! 梯度是对loss的求导,如果推理一下loss的gradients,里面要除以批量大小
Just run one time, this is demo how it looks like
为什么损失函数里y要调用reshape函数?
def squared_loss(y_hat, y): # @save
“”“均⽅损失。”""
return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2
视频里有讲,正常应该是同样的shape,但以防一个是行向量、一个是列向量。
现在reshape,可以确保shape一样
param -= lr * param.grad / batch_size
RuntimeError: a leaf Variable that requires grad is being used in an in-place operation.
这里报错是什么原因?
检查下是不是没有加上“ with torch.no_grad(): "
这本书的每节课后练习答案在哪可以找到?要不然不知道自己作业做的是对还是错。
一个很重要的问题是,x-=k 与x= x-k 不同,前者会更新变量的值,而后者不会 此时的param为None.
因为现在的任务是掌握深度学习,其余的一切从简。
原因有二。其一是楼上兄弟说的 x -= a 与x = x - a的区别,其二是torch.tensor的特性,缺一不可。torch.tensor或numpy.array会在执行 -= 时改变全局变量而非局部变量,(换做 x = x - a 则会改变局部变量)。而对list等python内置的数据结构, x -= a 与x = x - a在函数中是没有区别的。你可以简单地写一个函数内迭代赋值的函数,分别用1, numpy.array(1)和torch.tensor(1)输入对比一下,看看是否改变了全局变量。总而言之,x -= a 与x = x - a 在调用地址或者调用值上的区别是由具体的数据结构决定的。
基本正解,但第二个原因并不是torch.tensor的特性,其本质还是对象的引用问题.即只要该元素为引用类型,则对他的修改就会改变全局的变量.即可达到同样的效果.
验证代码如下:
def fun_test(a):
for i in a:
i-=1
def fun_test2(a):
for i in a:
i[0]-=1
a=torch.tensor([1,2,3,4,5])
fun_test(a)
print(a)
# tensor([0, 1, 2, 3, 4])
a = [[1], [2], [3], [4],[5]]
fun_test2(a)
print(a)
# [[0], [1], [2], [3], [4]]
a = [1, 2, 3, 4, 5]
fun_test(a)
print(a)
# [1, 2, 3, 4, 5]
可以发现,list中元素也为list时与tensor的效果一致,因为遍历时tensor的元素还是一个tensor即引用类型.因此其本质还是引用问题,而非tensor的特性.
如果把w和b改成全0
w = torch.tensor([0.,0.], requires_grad=True).reshape((2,1))
b = torch.tensor([0.], requires_grad=True)
训练的时候会报错吗?我的会报错
这样写就不会报错
w = torch.zeros((2,1), requires_grad=True)
如果reshape((2,1)),print(w)显示结果如下
tensor([[0.],
[0.]], grad_fn=<ViewBackward>)
定义优化算法这里面为什么要用到: with torch.no_grad():
想问一下,本书的课后习题去哪里能找到答案呀,自己做的时候也不知道是对是错
我也有这个疑问,是因为求解梯度的时候param求解的是一个batch的梯度和吗?所以需要平均一下?
我感觉这个是分子布局或者分子布局的锅,在李沐大神跑的所有梯度中,都是用的是分子布局
def net(X):
return softmax(torch.matmul(X.reshape((-1,w.shape【0】)),W)+b)
这里定义的函数为什么只有一个参数X? 那后面的W和b怎么来?
哪里能找到课后习题的答案啊?很多题都没思路。看着很吃力。