利用pytorch的自动求导机制实现线性回归其实非常简单,但是在实现过程中犯了一个错误调试了很久,需要注意的是在更新梯度时候的写法,如下代码所示:
#1 正确写法则
w.data.sub_(w.grad*lr)
b.data.sub_(b.grad*lr)
# 2错误写法
w = w - w.grad*lr
b = b - grad*lr
其中错误写法导致了梯度发生了变化,错误写法导致了梯度变成了lr,然后在计算图中传递下去,如下是完成的正确实现代码:
另外还需要注意的是在算法实现部分的代码需要对梯度进行清0,否则梯度会累加
1. 生成数据
def gb(batch):
x = t.rand(batch,1)
y = 2*x + 3 + t.rand(batch,1)
return x,y
2. 算法实现
w = t.rand(1,1,requires_grad=True)
b = t.zeros(1,1,requires_grad=True)
lr = 0.01 # 学习率
for i in range(5000):
# 梯度清0
if (w.grad is not None) and (b.grad is not None):
w.grad.data.zero_()
b.grad.data.zero_()
x,y = gb(5)
y_ = x*w + b.expand_as(y)
loss = (y-y_)**2/2
# print(loss)
loss = loss.mean()
loss.backward()
# print(w,w.grad, b,b.grad)
w.data.sub_(w.grad*lr)
b.data.sub_(b.grad*lr)
if i%1000 == 0:
print(loss)
print(w,b)
网友评论