# 【学习笔记】深度学习 demo1 线性回归

$f(x) = 3 x + 10 + rand$

## 基于Parameter手动构建

$g(x) = a x + b$

import matplotlib.pyplot as plt
import torch
from torch import nn

class SquareRegression(nn.Module):
def __init__(self):
nn.Module.__init__(self)
self.a = nn.Parameter(torch.randn(1, 1), requires_grad=True)  # 1 x 1
self.b = nn.Parameter(torch.randn(1, 1), requires_grad=True)  # 1 x 1

def forward(self, x_):
_t = x_.mm(self.a)                # n x 1
return _t + self.b.expand_as(_t)  # n x 1

if __name__ == "__main__":
n = 100
x = torch.linspace(-2, 12, n).resize_((n, 1))   # n x 1 tensor
y = 3 * x + 10 + torch.randn(x.size())          # n x 1 tensor

model = SquareRegression()

criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)

num_epochs = 20000
for epoch in range(num_epochs):
inputs, targets = Variable(x), Variable(y)

out = model(inputs)
loss = criterion(out, targets)

loss.backward()
optimizer.step()

if (epoch + 1) % 100 == 0:
print('Epoch[{}/{}], loss:{:.6f}'.format(epoch + 1, num_epochs, loss.item()))

for name, param in model.named_parameters():
print(name, param.data)

predict = model(x)

plt.plot(x.numpy(), y.numpy(), 'ro', label='Original Data')
plt.plot(x.numpy(), predict.data.numpy(), label='Fitting Line')
plt.show()

Epoch[100/20000], loss:23.441666
Epoch[200/20000], loss:20.163355
Epoch[300/20000], loss:17.363503
Epoch[400/20000], loss:14.972251
Epoch[500/20000], loss:12.929962
Epoch[600/20000], loss:11.185717
Epoch[700/20000], loss:9.696020
Epoch[800/20000], loss:8.423729
Epoch[900/20000], loss:7.337113
Epoch[1000/20000], loss:6.409071
Epoch[1100/20000], loss:5.616467
Epoch[1200/20000], loss:4.939533
Epoch[1300/20000], loss:4.361391
Epoch[1400/20000], loss:3.867616
Epoch[1500/20000], loss:3.445905

... ... ... ...

Epoch[19000/20000], loss:0.977931
Epoch[19100/20000], loss:0.977931
Epoch[19200/20000], loss:0.977931
Epoch[19300/20000], loss:0.977931
Epoch[19400/20000], loss:0.977931
Epoch[19500/20000], loss:0.977931
Epoch[19600/20000], loss:0.977931
Epoch[19700/20000], loss:0.977931
Epoch[19800/20000], loss:0.977931
Epoch[19900/20000], loss:0.977931
Epoch[20000/20000], loss:0.977931
a tensor([[2.9913]])
b tensor([[10.1255]])

$\begin{cases} a &= 2.9913 \\ b &= 10.1255 \end{cases}$

\begin{aligned} g(x) &= a x + b \\ &= 2.9913 x + 10.1255 \end{aligned}

## 基于Linear构建

$h(x) = w x + b$

import matplotlib.pyplot as plt
import torch
from torch import nn

class SquareRegression(nn.Module):
def __init__(self):
nn.Module.__init__(self)
self.linear = nn.Linear(1, 1)  # 1 x 1

def forward(self, x_):
return self.linear(x_)  # n x 1

if __name__ == "__main__":
n = 100
x = torch.linspace(-2, 12, n).resize_((n, 1))  # n x 1 tensor
y = 3 * x + 10 + torch.randn(x.size())         # n x 1 tensor

model = SquareRegression()

criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)

num_epochs = 20000
for epoch in range(num_epochs):
inputs, targets = Variable(x), Variable(y)

out = model(inputs)
loss = criterion(out, targets)

loss.backward()
optimizer.step()

if (epoch + 1) % 100 == 0:
print('Epoch[{}/{}], loss:{:.6f}'.format(epoch + 1, num_epochs, loss.item()))

for name, param in model.named_parameters():
print(name, param.data)

predict = model(x)

plt.plot(x.numpy(), y.numpy(), 'ro', label='Original Data')
plt.plot(x.numpy(), predict.data.numpy(), label='Fitting Line')
plt.show()

Epoch[100/20000], loss:40.807762
Epoch[200/20000], loss:34.994335
Epoch[300/20000], loss:30.029305
Epoch[400/20000], loss:25.788853
Epoch[500/20000], loss:22.167242
Epoch[600/20000], loss:19.074156
Epoch[700/20000], loss:16.432467
Epoch[800/20000], loss:14.176275
Epoch[900/20000], loss:12.249363
Epoch[1000/20000], loss:10.603661
Epoch[1100/20000], loss:9.198134
Epoch[1200/20000], loss:7.997722
Epoch[1300/20000], loss:6.972489
Epoch[1400/20000], loss:6.096869
Epoch[1500/20000], loss:5.349041

... ... ... ...

Epoch[19000/20000], loss:0.972535
Epoch[19100/20000], loss:0.972535
Epoch[19200/20000], loss:0.972535
Epoch[19300/20000], loss:0.972535
Epoch[19400/20000], loss:0.972535
Epoch[19500/20000], loss:0.972535
Epoch[19600/20000], loss:0.972535
Epoch[19700/20000], loss:0.972535
Epoch[19800/20000], loss:0.972535
Epoch[19900/20000], loss:0.972535
Epoch[20000/20000], loss:0.972535
linear.weight tensor([[2.9816]])
linear.bias tensor([10.3128])

$\begin{cases} w &= 2.9816 \\ b &= 10.3128 \end{cases}$

\begin{aligned} h(x) &= w x + b \\ & = 2.9816 x + 10.3128 \end{aligned}

## 其他

### 对机器学习的一些基本理解

• 机器学习的本质是函数拟合。
• 机器学习的最基本思路，就是通过一个预定义的损失函数（loss function，用于量化描述拟合结果与实际期望结果的差异），和预定义的计算模型（线性函数、二次函数、CNN等），利用反向传播求导机制，通过梯度下降法对当前的拟合结果进行不断地优化（准确的说，是对损失函数进行不断地优化使之尽可能小）。
• 简单来说，有两个最核心的基本要素：
• 损失函数的定义
• 计算模型的定义
• 通过机器学习，我们可以获得一个函数意义上的局部最优解，而无法保证所获拟合结果为复杂函数环境下的全局最优。

0 条评论

• ### 【学习笔记】深度学习 demo2 二次函数回归

\[\begin{aligned} f(x) &= \left(x - 4 \right) \left(x - 8\right) + rand \\ &= x ...

• ### 1820: [JSOI2010]Express Service 快递服务

1820: [JSOI2010]Express Service 快递服务 Time Limit: 10 Sec  Memory Limit: 64 MB Sub...

• ### 3399: [Usaco2009 Mar]Sand Castle城堡

3399: [Usaco2009 Mar]Sand Castle城堡 Time Limit: 3 Sec  Memory Limit: 128 MB Subm...

• ### 【学习笔记】深度学习 demo2 二次函数回归

\[\begin{aligned} f(x) &= \left(x - 4 \right) \left(x - 8\right) + rand \\ &= x ...

• ### 持证上岗！腾讯安全专家服务获CCRC三项资质认证

近日，经中国网络安全审查技术与认证中心（CCRC）测评，腾讯荣获三项信息安全服务资质证书，包括“信息安全风险评估服务资质证书（三级）”、“信息安全应急处理服务资...

• ### 2018年安全从业者需要掌握的8种技能

随着CIO等职位招聘需求逐渐增多，明年需要的关键IT安全技能包括云安全架构技能、客户服务技能。 ? 安全分析与调查 Korn Ferry负责信息技术和网络安全的...

• ### 女朋友生气是随机事件？？？

爱因斯坦曾说：上帝不玩掷骰子。但是物理界薛定谔的猫和生物界女朋友的脾气就是不可测量，不可揣摩的两大难题。经常听各种段子，女朋友莫名的又生气了。我们试着从概率上解...

• ### 等保2.0与工控安全

网络安全等级保护是国家网络安全保障的基本制度基本策略和基本方法。2019年5月13日等保2.0正式发布，这是继2008年发布等保1.0十余年来继网络安全法实施后...

• ### Eclipse插件之Hidden Heap Status EclipseBBSUIthread工作

本文介绍如何利用Eclipse 插件Hidden Heap Status 在Eclipse 中的使用。 　　Eclipse 是目前非常流行的开发平台，开放扩...

• ### 变分自编码器如何淘汰经典的推荐系统

随着信息过载的增加，我们不可能通过观看海量的内容来获取我们想要的项目。推荐系统可以来拯救我们。推荐系统是一种模型，通过向用户展示他们可能感兴趣的内容，帮助他们探...