多层全连接神经网络(二)

 线性回归的原理,如果有需要,可以单独拿出来讲。

一维线性回归的代码实现

        首先我们随便给出一些点:

x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],[9.779], [6.182], [7.59], [2.167], [7.042],[10.791], [5.313], [7.997], [3.1]], dtype=np.float32)y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],[3.366], [2.596], [2.53], [1.221], [2.827],[3.465], [1.65], [2.904], [1.3]], dtype=np.float32)

        通过matplotlib画出来就是这个样子,如图3.4所示。

        我们想要做的事情就是找一条直线去逼近这些点,也就是希望这条直线离这些点的距离之和最小,先将 numpy.array 转换成 Tensor,因为 PyTorch 里面的处理单元是 Tensor,按之前讲的方法,这就特别简单了:

x_train = torch.from_numpy(x_train).cuda()
y_train = torch.from_numpy(y_train).cuda()

        接着需要建立模型,根据上一节 PyTorch 的基础知识,这样来定义一个简单的模型:

class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear = nn.Linear(1, 1)  # input and output is 1 dimensiondef forward(self, x):out = self.linear(x)return outif torch.cuda.is_available():model = LinearRegression().cuda()
else:model = LinearRegression()

        这里我们就定义了一个超级简单的模型 y=wx+b,输入参数是一维,输出参数也是一维,这就是一条直线,当然这里可以根据你想要的输入输出维度进行更改,我们希望去优化参数 w 和 b 能够使得这条直线尽可能接近这些点,如果支持 GPU 加速,可以通过 model.cuda() 将模型放到 GPU上。
        然后定义损失函数和优化函数,这里使用均方误差作为优化函数,使用梯度下降进行优化:

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

        接着就可以开始训练我们的模型了:

num_epochs = 1000
for epoch in range(num_epochs):if torch.cuda.is_available():inputs = Variable(x_train).cuda()target = Variable(y_train).cuda()else:inputs = Variable(x_train)target = Variable(y_train)# forwardout = model(inputs)loss = criterion(out, target)# backwardoptimizer.zero_grad()loss.backward()optimizer.step()if (epoch + 1) % 20 == 0:print('Epoch[{}/{}], loss: {:.6}'.format(epoch + 1, num_epochs, loss.item()))

        定义好我们要跑的 epoch 个数,然后将数据变成 Variable 放入计算图,然后通过 out = model(inputs) 得到网络前向传播得到的结果,通过 loss = criterion(out,target) 得到损失函数,然后归零梯度,做反向传播和更新参数,特别要注意的是,每次做反向传播之前都要归零梯度,optimizer.zero_grad()。不然梯度会累加在一起,造成结果不收敛。在训练的过程中隔一段时间就将损失函数的值打印出来看看,确保我们的模型误差越来越小。注意 loss.data[0],首先 loss 是一个 Variable,所以通过 loss.data 可以取出一个 Tensor,再通过 loss.data[0] 得到一个 int 或者 float 类型的数据,这样我们才能够打印出相应的数据。
        做完训练之后可以预测一下结果。

model.eval()
predict = model(Variable(x_train))
predict = predict.data.cpu().numpy()
plt.plot(x_train.cpu().numpy(), y_train.cpu().numpy(), 'ro', label='Original data')
plt.plot(x_train.cpu().numpy(), predict, label='Fitting Line')
plt.show()

        首先需要通过 model.eval() 将模型变成测试模式,这是因为有一些层操作,比如 Dropout 和 BatchNommalization 在训练和测试的时候是不一样的,所以我们需要通过这样一个操作来转换这些不一样的层操作。然后将测试数据放入网络做前向传播得到结果,最后画出的结果如图 3.5所示。

        这样我们就通过 PyTorch 解决了一个简单的一元回归问题,得到了一条直线去尽可能逼近这些离散的点。

多项式回归

        对于一般的线性回归,由于该函数拟合出来的是一条直线,所以精度欠佳,我们可以考虑多项式回归,也就是提高每个属性的次数,而不再是只使用一次去回归目标函数。
        原理和之前的线性回归是一样的,只不过这里用的是高次多项式而不是简单的一次线性多项式。
        首先给出我们想要拟合的方程:

然后可以设置参数方程:

我们希望每一个参数都能够学习到和真实参数很接近的结果。

        下面来看看如何用PyTorch 实现这个简单的任务。

        首先需要预处理数据,也就是需要将数据变成一个矩阵的形式:

在 PyTorch 里面使用 torch.cat() 函数来实现 Tensor 的拼接:

def make_features(x):"""Builds features i.e.a matrix with colums [x,x^2,x^3]."""x = x.unsqueeze(1)return torch.cat([x ** i for i in range(1, 4)], 1)

        对于输入的几个数据,我们将其扩展成上面矩阵所示的样子。

        然后定义好真实的函数:

W_target = torch.FloatTensor([0.5, 3, 2.4]).unsqueeze(1)
b_target = torch.FloatTensor([0.9])def f(x):"""Approximated function."""return x.mm(W_target) + b_target[0]

        这里的权重已经定义好了,unsqueeze(1) 是将原来的 tensor 大小由3变成(3,1),x.mm(W_target) 表示做矩阵乘法,f(x) 就是每次输入一个 x 得到一个 y 的真实函数。

        在进行训练的时候我们需要采样一些点,可以随机生成一些数来得到每次的训练集:

def get_batch(batch_size=32):"""Builds a batch i.e.(x,f(x))pair."""random = torch.randn(batch_size)x = make_features(random)y = f(x)if torch.cuda.is_available():return Variable(x).cuda(), Variable(y).cuda()else:return Variable(x), Variable(y)

        通过上面这个雨数我们每次取 batch_size 这么多个数据点,然后将其转换成矩阵的形式,再把这个值通过函数之后的结果也返回作为真实的目标。
        然后可以定义多项式模型:

# Define model
class poly_model(nn.Module):def __init__(self):super(poly_model, self).__init__()self.poly = nn.Linear(3, 1)def forward(self, x):out = self.poly(x)return outif torch.cuda.is_available():model = poly_model().cuda()
else:model = poly_model()

        这里的模型输入是3维,输出是1维,跟之前定义的线性模型只有很小的差别

        然后我们定义损失函数和优化器:

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

        同样使用均方误差来衡量模型的好坏,使用随机梯度下降来优化模型,然后开始训练模型:

epoch = 0
while True:# Get databatch_x, batch_y = get_batch()# forward passoutput = model(batch_x)loss = criterion(output, batch_y)print_loss = loss.data[0]# Reset gradientsoptimizer.zero_grad()# Backward passloss.backward()# update parametersoptimizer.step()epoch += 1if print_loss < 1e-3:break

        这里我们希望模型能够不断地优化,直到实现我们设立的条件,取出的32个点的均方误差能够小于 0.001。
        运行程序可以得到如图3.6所示的结果。

        将真实函数的数据点和拟合的多项式画在同一张图上,我们可以得到如图3.7所示的结果。

        从两个结果来看,我们已经很接近真实的函数了。现实世界中很多问题都不是简单的线性回归,涉及很多复杂的非线性模型,而线性模型是机器学习中最重要的模型之一,它的统计思想及其非常直观的解释性仍然可以给我们一些启发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3247030.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch学习笔记day2——Tensor运算

那么今天&#xff0c;我们来学习一下张量运算。笔者最早接触AI还是在tensorflow的时代。张量tensor本身&#xff0c;可以理解成向量和矩阵的一个推广。 一维张量就是向量&#xff1a;A[i] 二维张量就是矩阵&#xff1a;A[i][j] 三维张量就是…就是三维张量…嗯总不能每个维度都…

Hadoop3:RPC通信原理及简单案例实现

一、场景介绍 我们知道&#xff0c;Hadoop中存在多种服务&#xff0c;那么&#xff0c;服务之间是如何通信的了&#xff1f; 比如&#xff0c;DN和NN之间如何通信&#xff1f; 这里&#xff0c;实际上是通过RPC实现进程间通信的了。 RPC属于Java网络编程范畴 需要编写客户端和…

AV1 编码标准屏幕内容编码技术概述

AV1 屏幕内容编码 为了提高屏幕捕获内容的压缩性能&#xff0c;AV1采用了几种编码工具&#xff0c;例如用于处理屏幕画面中重复模式的内帧内块复制&#xff08;IntraBC&#xff09;&#xff0c;以及用于处理颜色数量有限的屏幕块的调色板模式。 帧内块拷贝 AV1 编码中的 Intra …

代码随想录二刷复习(二分法)

二分法模板&#xff1a; 1&#xff1a;左闭右闭区间写法 第一种写法&#xff0c;我们定义 target 是在一个在左闭右闭的区间里&#xff0c;也就是[left, right] &#xff08;这个很重要非常重要&#xff09;。 区间的定义这就决定了二分法的代码应该如何写&#xff0c;因为定…

函数定义、合约与面向对象(以太坊solidity合约)

函数定义、合约与面向对象&#xff08;以太坊solidity合约&#xff09; 1-函数定义、构造与多态2-事件日志3-面向对象特征 1-函数定义、构造与多态 创建合约就是创建类&#xff0c;部署合约就是实例化 合约的方法还支持多态 还能使用第三方的库进行开发 整个合约部署后&…

运维管理数智化:数据与智能运维场景实践

本文来自腾讯蓝鲸智云社区用户&#xff1a;CanWay 摘要&#xff1a;笔者根据自身的技术和行业理解&#xff0c;分享嘉为蓝鲸数据与智能运维场景实践。 涉及关键字&#xff1a;一体化运维、平台化运维、数智化运维、AIOps、运维PaaS、运维工具系统、蓝鲸等。 本文作者&#xf…

自动驾驶AVM环视算法–全景和标定全功能算法实现和exe测试demo

参考&#xff1a;全景和标定全功能算法实现和exe测试demo-金书世界 1、测试环境 opencv310vs2022 2、使用的编程语言 c和c 3、测试的demo的获取 更新&#xff1a;测试的exe程序&#xff0c;无需解压码就可以体验算法测试效果 百度网盘&#xff1a; 链接&#xff1a;http…

minio 获取预览地址

1.进入到 minio&#xff0c;并设置桶的权限。 2.获取预览地址代码如下&#xff1a; 注意&#xff1a; GetPresignedObjectUrlArgs.builder().method(Method.GET)&#xff0c;这个地方一定要用 GET&#xff0c;我当时按照官网的例子写的&#xff0c;没注意这个&#xff0c;搞了…

深入解析公有IP与私有IP:地址分配与使用限制

IP地址在网络基础设施的建设和维护过程中起着至关重要的作用。作为IP地址的两大类型&#xff0c;公有IP和私有IP各自具有独特的分配机制和使用限制。本文将详细分析两者之间的区别&#xff0c;以帮助读者更好地理解和使用IP地址。 1. 公有IP与私有IP概述 IP地址是网络中的唯一…

库迪“夏日果咖季”打卡活动走样,联营商不想配合了?

库迪的“夏日果咖季”打卡活动&#xff0c;真是让人在这个炎炎夏日受一肚子气。 有大批不同IP的网友在社交媒体平台吐槽&#xff0c;特意前去门店打卡&#xff0c;却被告知门店没有这个活动。 一位广州的网友在小红书发帖表示&#xff0c;上班前特意坐地铁去门店参加活动&…

半自动辅助制作数据集【实例分割】

利用yoloV8的实例分割模型&#xff0c;半自动辅助制作数据集 引言&#xff1a;【主要步骤】 步骤1&#xff1a;无人机航拍&#xff0c;收集基础图片 步骤2&#xff1a;将收集到的图片&#xff0c;全部用yoloV8-seg.pt模型进行实例分割【预测之前&#xff0c;将配置文件default.…

什么是大模型?(超详细)从入门到精通 一文读懂大模型的基本概念

1. 大模型的定义 大模型是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能&#xff0c;能够处理更加复杂的任务和数据。大模型在各种领域都有…

海外社媒矩阵为何会被关联?如何IP隔离?

在当今的数字时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。通过社交媒体&#xff0c;人们可以与朋友互动&#xff0c;分享生活&#xff0c;甚至进行业务推广和营销。然而&#xff0c;社交媒体账号关联问题逐渐受到广泛关注。社交媒体账号为何会关联&#…

力扣经典题目之->删除有序数组中的重复项讲解 的讲解与实现

一&#xff1a;题目 二&#xff1a;思路讲解 第一步&#xff1a;创建两个下标&#xff0c;一个是第一个元素的&#xff08;start0&#xff09;&#xff0c;一个是第二个元素的&#xff08;end1&#xff09; 第二步&#xff1a; a&#xff1a;end移动&#xff0c;直到遇到不等…

Flowable-会签与或签

一、会签 会签的意思是&#xff0c;在流程任务管理中&#xff0c;任务通常是由一个人或者多个人同时去处理的&#xff0c;这种任务叫做会签任务。类似于并行网关&#xff0c;会签任务一般需要任务候选人全部完成审批后&#xff0c;才能进入下一个审批环节。 (一) 会签类型 按…

持续集成06--Jenkins构建触发器

前言 在持续集成&#xff08;CI&#xff09;的实践中&#xff0c;构建触发器是自动化流程中不可或缺的一环。它决定了何时启动构建过程&#xff0c;从而确保代码变更能够及时地得到验证和反馈。Jenkins&#xff0c;作为业界领先的CI/CD工具&#xff0c;提供了多种构建触发器选项…

jeecgboot项目不知道什么原因启动出来8080端口后就不下去了,要等上10多分钟才出来接口地址等正常情况

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、项目中途不知道什么原因&#xff0c;就出现下面情况 具体如下&#xff1a; 2024-07-15 15:08:15.767 [main] [34mINFO [0;39m [36mliquibase.changelog:30[0;39m - Reading from jeec…

什么是鉴权开发框架?如何认证和限流

目录 一、鉴权开发框架介绍二、Django REST framework是什么三、如何实现认证、权限与限流功能四、Django REST framework的应用场景 一、鉴权开发框架介绍 鉴权开发框架是一种用于实现身份验证和授权的软件开发工具。它可以帮助开发者快速构建安全、可靠的身份验证和授权系统…

Spring Boot 中使用 Resilience4j 实现弹性微服务的简单了解

1. 引言 在微服务架构中&#xff0c;服务的弹性是非常重要的。Resilience4j 是一个轻量级的容错库&#xff0c;专为函数式编程设计&#xff0c;提供了断路器、重试、舱壁、限流器和限时器等功能。 这里不做过多演示&#xff0c;只是查看一下官方案例并换成maven构建相关展示&…

DNS查询过程

DNS&#xff08;域名系统&#xff0c;Domain Name System&#xff09;是一个用于将域名和IP地址相互映射的系统。当你在浏览器中输入一个网址时&#xff0c;浏览器会通过DNS查询过程来找到对应的IP地址&#xff0c;以便能够连接到目标服务器。其查询过程一般通过以下步骤&#…