还是线性回归
基础优化算法的顺序
梯度下降法
0:人造数据集(可以不要)
1:随机小批量
获取比例batch_size:1
1.0 获取样本的数量
1.1 获取一个样本数量的乱序
1.2 for循环:(0, num_examples, batch_size)抽取样本。注意batch_size可能不被num_examples整除,所以最后一个抽取需要注意不要越界
2: 计算模型获得的结果
返回 X*w +b 。
如果X=[X, 1], w=[w, b]可以返回X * w
3: 获取损失函数 (y_hat - y)^2/2
4: loss.sum().backward()
为什么loss要sum
因为多个样本要用均值来求导哇。可以先平均求导然后下降,也可以求导后平均下降
5:梯度下降
w和b的值要减去梯度
由于每次算梯度会叠加,所以要清零
6:循环1~5,自定义num_epochs
pytorch一些函数的用法
class torch.nn.Linear(in_features, out_features, bias=True)
对输入数据做线性变换:y=Ax+by=Ax+b
参数:
- in_features - 每个输入样本的大小
- out_features - 每个输出样本的大小
- bias - 若设置为False,这层不会学习偏置。默认值:True
形状:
- 输入: (N,in_features)
- 输出: (N,out_features)
变量:
- weight -形状为(out_features x in_features)的模块中可学习的权值
- bias -形状为(out_features)的模块中可学习的偏置
例子:
>>> m = nn.Linear(20, 30)
>>> input = autograd.Variable(torch.randn(128, 20))
>>> output = m(input)
>>> print(output.size())
class torch.nn.Sequential(* args)
一个时序容器。Modules
会以他们传入的顺序被添加到容器中。当然,也可以传入一个OrderedDict
。
为了更容易的理解如何使用Sequential
, 下面给出了一个例子:
# Example of using Sequential
model = nn.Sequential(
nn.Conv2d(1,20,5),
nn.ReLU(),
nn.Conv2d(20,64,5),
nn.ReLU()
)
# Example of using Sequential with OrderedDict
model = nn.Sequential(OrderedDict([
('conv1', nn.Conv2d(1,20,5)),
('relu1', nn.ReLU()),
('conv2', nn.Conv2d(20,64,5)),
('relu2', nn.ReLU())
]))
normal_(mean=0, std=1, , gengerator=None*)
将tensor用均值为mean
和标准差为std
的正态分布填充。
class torch.nn.MSELoss(size_average=True)[source]
创建一个衡量输入x
(模型预测输出
)和目标y
之间均方误差标准。
-
x
和y
可以是任意形状,每个包含n
个元素。 - 对
n
个元素对应的差值的绝对值求和,得出来的结果除以n
。 - 如果在创建
MSELoss
实例的时候在构造函数中传入size_average=False
,那么求出来的平方和将不会除以n
class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)[source]
实现随机梯度下降算法(momentum可选)。
Nesterov动量基于On the importance of initialization and momentum in deep learning中的公式.
参数:
-
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
-
lr (
float
) – 学习率 -
momentum (
float
, 可选) – 动量因子(默认:0) -
weight_decay (
float
, 可选) – 权重衰减(L2惩罚)(默认:0) -
dampening (
float
, 可选) – 动量的抑制因子(默认:0) -
nesterov (
bool
, 可选) – 使用Nesterov动量(默认:False)
例子:
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward()
>>> optimizer.step()
step(closure) [source]
进行单次优化 (参数更新).
参数:
- closure (
callable
) – 一个重新评价模型并返回loss的闭包,对于大多数参数来说是可选的。