1、optimizer.zero_grad()
和loss.backward()
先后问题
刚开始学习深度学习,就是不明白,为什么第一次运行的时候就要optimizer.zero_grad()
(梯度清零),看了好多资料,都是说梯度会累加,后一起在前一次的基础上运算,不是后一起取代前次的结果,比如:这是有optimizer.zero_grad()
无optimizer.zero_grad()
就是可以看到,当不加optimizer.zero_grad()
的时候,梯度无限下降。
这个我弄明白了,就是累计计算梯度。但是我还是不明白为啥第一次就要梯度清零,第一次不是还没有进行计算梯度?(原谅我钻牛角尖了,一个小白的牛角)。
除了第一次后面都要清零,难道要写一个判断语句来规避第一次?显然是小小白的做法。
全部代码
# -*- coding: utf-8 -*-
import torch
import numpy as np
from torch import nn
from torch.autograd import Variable
import matplotlib.pyplot as plt
# 数据拼接
def make_features(x):
# Builds features i.e. a matrix with columns [x, x^2, x^3].
x = x.unsqueeze(1)
return torch.cat([x ** i for i in range(1, 4)], 1)
if __name__ == '__main__':
count = 0
# unsqueeze: https://blog.csdn.net/flysky_jay/article/details/81607289
w_target = torch.FloatTensor([0.5, 3, 2.4]).unsqueeze(1)
b_target = torch.FloatTensor([0.9])
# 每次输入一个x,就得到一个真实y
def f(x):
return x.mm(w_target) + b_target[0] # x.mm做矩阵乘法
# 每次取batch_size这么多数据点,然后转换成矩阵