您的位置:首页 > 其它

动手学深度学习:1.深度学习基础--线性回归

2020-03-05 16:46 253 查看

1. 线性回归

1.1. 线性回归的基本要素:
1.模型 2.数据集 3.损失函数 4.优化函数-随机梯度下降

1.模型:
为了简单起见,这里我们假设价格只取决于房屋状况的两个因素,即面积(平方米)和房龄(年)。接下来我们希望探索价格与这两个因素的具体关系。线性回归假设输出与各个输入之间是线性关系.
 y=w1∗x1+w2∗x2+b\ y = w_1*x_1 + w_2*x_2 + b y=w1​∗x1​+w2​∗x2​+b
其中 yyy表示价格 ,x1x_1x1​表示面积 ,x2x_2x2​房龄

2.数据集:

我们通常收集一系列的真实数据,例如多栋房屋的真实售出价格和它们对应的面积和房龄。我们希望在这个数据上面寻找模型参数来使模型的预测价格与真实价格的误差最小。在机器学习术语里,该数据集被称为训练数据集(training data set)或训练集(training set),一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。特征用来表征样本的特点。

3.损失函数

在模型训练中,我们需要衡量价格预测值与真实值之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。 它在评估索引为 iii 的样本误差的表达式为

 l(i)(w,b)=12(y^(i)−y(i))2\ l^{(i)}(w,b) = \frac{1}{2}(\hat y^{(i)} - y^{(i)} )^2  l(i)(w,b)=21​(y^​(i)−y(i))2

 L(i)(w,b)=1n∑i=1nl(i)(w,b)=1n∑i=1n12(wTx(i)−y(i))2\ L^{(i)}(w,b) = \frac{1}{n} \sum_{i=1}^{n} l^{(i)}(w,b) =\frac{1}{n}\sum_{i=1}^{n} \frac{1}{2}(w^Tx^{(i)} - y^{(i)} )^2  L(i)(w,b)=n1​i=1∑n​l(i)(w,b)=n1​i=1∑n​21​(wTx(i)−y(i))2

4.优化函数 - 随机梯度下降

当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。

在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch) β\betaβ ,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。


pytorch数据处理的标准化处理过程

继承Dataset类-> 增强数据变换->继承Dataloader

import torch.utils.data as Data
import torch
from torch import nn
import numpy as np

#生成数据
num_inputs = 2
num_examples = 1000

true_w = [2, -3.4]
true_b = 4.2
features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()), dtype=torch.float)

#读取数据

batch_size = 10
# combine featues and labels of dataset
dataset = Data.TensorDataset(features, labels)

# put dataset into DataLoader
data_iter = Data.DataLoader(
dataset=dataset,            # torch TensorDataset format
batch_size=batch_size,      # mini batch size
shuffle=True,               # whether shuffle the data or not
num_workers=2,              # read data in multithreading
)
#定义模型
class LinearNet(nn.Module):
def __init__(self, n_feature):
super(LinearNet, self).__init__()      # call father function to init
self.linear = nn.Linear(n_feature, 1)  # function prototype: `torch.nn.Linear(in_features, out_features, bias=True)`

def forward(self, x):
y = self.linear(x)
return y

net = LinearNet(num_inputs)
#print(net)
#初始化模型参数
from torch.nn import init
init.normal_(net[0].weight, mean=0.0, std=0.01)
init.constant_(net[0].bias, val=0.0)

#定义损失函数
loss = nn.MSELoss()
#定义优化函数
import torch.optim as optim
optimizer = optim.SGD(net.parameters(), lr=0.03)

#训练
num_epochs = 3
for epoch in range(1, num_epochs + 1):
for X, y in data_iter:
output = net(X)
l = loss(output, y.view(-1, 1))
optimizer.zero_grad() # reset gradient, equal to net.zero_grad()
l.backward()
optimizer.step()
print('epoch %d, loss: %f' % (epoch, l.item())

参考资料:

播禹学习平台

  • 点赞
  • 收藏
  • 分享
  • 文章举报
keeplearninglearning 发布了1 篇原创文章 · 获赞 0 · 访问量 30 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: