pytorch全连接模型实现离散点回归拟合

神经网络可作为一个函数,例如x为训练样本矩阵,f为神经网络,则f(x)会得到一个输出,输出表示啥取决于训练目的和训练过程。
本文章讲解以拟合为设计目的的全连接神经网络模型,神经网络即可进行线性回归,也可进行非线性回归,并且是还是分段拟合,线性与非线性取决于激活函数!

先来简单的一元二次函数:
看代码:
x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
y = x.pow(2)+0.2*torch.rand(x.size())
plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()
其图像为:
在这里插入图片描述
采用线性激活函数版本:
import torch
import torch.nn.functional as F#激活函数都在这里
import matplotlib.pyplot as plt

#假数据:y = a*x^2+b,增加一些噪点,显得更加真实

x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)

y = x.pow(2)+0.2*torch.rand(x.size())

#画图

plt.scatter(x.data.numpy(),y.data.numpy())

plt.show()

class Net(torch.nn.Module):
def init(self,n_featuer,n_hidden1,n_hidden2,n_output):
super(Net,self).init()
#定义每层的样式
self.hidden1 = torch.nn.Linear(n_featuer,n_hidden1)#隐藏层的线性输出
self.hidden2 = torch.nn.Linear(n_hidden1, n_hidden2) # 隐藏层的线性输出
self.predict = torch.nn.Linear(n_hidden2,n_output)#输出层的线性输出
def forward(self, x):
x = F.relu(self.hidden1(x))
x = F.relu(self.hidden2(x))
x = (self.predict(x))
return x

net = Net(1,10,10,1)

opt = torch.optim.SGD(net.parameters(),lr=0.2)
loss_func = torch.nn.MSELoss()

plt.ion()

for t in range(500):
out = net(x)
loss = loss_func(out,y)
opt.zero_grad()
loss.backward()
opt.step()

if t%5 == 0:
    print(t)
    plt.cla()
    plt.scatter(x.data.numpy(),y.data.numpy())
    plt.plot(x.data.numpy(),out.data.numpy(),'r-',lw=5)
    plt.text(0.5,0,"Loss=%.4f"%loss.data.numpy(),fontdict={"size":20,"color":"red"})
    plt.pause(0.1)

plt.ioff()
plt.show()
效果:

在这里插入图片描述
注意:因为采用的线性激活函数,拟合的回归函数也是线性的,且是分段拟合

再看激活函数采用非线性的效果:
代码:
import torch
import torch.nn.functional as F#激活函数都在这里
import matplotlib.pyplot as plt

#假数据:y = a*x^2+b,增加一些噪点,显得更加真实

x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)

y = x.pow(2)+0.2*torch.rand(x.size())

#画图

plt.scatter(x.data.numpy(),y.data.numpy())

plt.show()

class Net(torch.nn.Module):
def init(self,n_featuer,n_hidden1,n_hidden2,n_output):
super(Net,self).init()
#定义每层的样式
self.hidden1 = torch.nn.Linear(n_featuer,n_hidden1)#隐藏层的线性输出
self.hidden2 = torch.nn.Linear(n_hidden1, n_hidden2) # 隐藏层的线性输出
self.predict = torch.nn.Linear(n_hidden2,n_output)#输出层的线性输出
def forward(self, x):
x = F.tanh(self.hidden1(x))
x = F.tanh(self.hidden2(x))
x = (self.predict(x))
return x

net = Net(1,10,10,1)

opt = torch.optim.SGD(net.parameters(),lr=0.2)
loss_func = torch.nn.MSELoss()

plt.ion()

for t in range(500):
out = net(x)
loss = loss_func(out,y)
opt.zero_grad()
loss.backward()
opt.step()

if t%5 == 0:
    print(t)
    plt.cla()
    plt.scatter(x.data.numpy(),y.data.numpy())
    plt.plot(x.data.numpy(),out.data.numpy(),'r-',lw=5)
    plt.text(0.5,0,"Loss=%.4f"%loss.data.numpy(),fontdict={"size":20,"color":"red"})
    plt.pause(0.1)

plt.ioff()
plt.show()
效果:

在这里插入图片描述
可见,采用线性激活函数和非线性激活函数的区别很大,得看具体应用场景,激活函数关系到训练效果,激活函数不恰当会导致模型训练不到理想的效果

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个基于Python的科学计算库,可以用于实现深度学习模型全连接前馈神经网络是一种最简单的人工神经元模型,可以用于解决回归或分类问题。 首先,我们需要导入PyTorch库和相关模块: ```python import torch import torch.nn as nn import torch.optim as optim ``` 然后,我们需要定义一个继承自`nn.Module`的神经网络类,并在构造函数中定义网络的结构。以回归问题为例,我们可以定义一个具有两个隐藏层和一个输出层的神经网络: ```python class RegressionNet(nn.Module): def __init__(self): super(RegressionNet, self).__init__() self.fc1 = nn.Linear(输入特征数, 隐藏层1神经元数) self.fc2 = nn.Linear(隐藏层1神经元数, 隐藏层2神经元数) self.fc3 = nn.Linear(隐藏层2神经元数, 输出神经元数) def forward(self, x): x = torch.relu(self.fc1(x)) x = torch.relu(self.fc2(x)) x = self.fc3(x) return x ``` 接下来,我们需要实例化网络类,并定义损失函数和优化器: ```python model = RegressionNet() criterion = nn.MSELoss() # 均方误差损失函数 optimizer = optim.SGD(model.parameters(), lr=学习率) ``` 然后,我们需要准备训练数据和标签,并将其转换为`torch.Tensor`类型: ```python train_data = ... train_labels = ... train_data = torch.Tensor(train_data) train_labels = torch.Tensor(train_labels) ``` 接下来,我们可以开始训练模型。循环训练模型,每次迭代中进行前向传播、计算损失、更新参数: ```python for epoch in range(迭代次数): optimizer.zero_grad() # 清空梯度 output = model(train_data) # 前向传播 loss = criterion(output, train_labels) # 计算损失 loss.backward() # 反向传播计算梯度 optimizer.step() # 更新参数 ``` 最后,我们可以使用训练好的模型进行预测。首先将测试数据转换为`torch.Tensor`类型,然后使用已训练的模型进行预测: ```python test_data = ... test_data = torch.Tensor(test_data) predictions = model(test_data) # 预测 ``` 以上就是使用PyTorch实现全连接前馈神经网络进行回归或分类问题的基本步骤。我们可以根据具体的问题调整网络架构、损失函数和优化器等,以提高模型的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值