神经网络和深度学习-处理多维特征的输入

news2025/7/8 18:30:56

处理多维特征的输入

前面有两个数据集,一个回归,一个分类。

在这里插入图片描述

在回归中输出y属于实数,而在分类中输出y属于一个离散的集合

例如在糖尿病分类的数据集中Diabetes Dataset,每一行作为一个sample(样本),每一列作为一个feature(特征)

在这里插入图片描述

之前我们在一个维度上的logistic回归模型为

在这里插入图片描述

现在我们要拓展到8个维度上面,每一个特征的的取值都要和权重进行相乘

在这里插入图片描述

之后再将XW进行展开,并进行sigmoid函数

在这里插入图片描述

接下来我们看一下mini-batch的情况对于1-N个样本都要求sigmoid,他们都是按照向量计算的函数

[ y ^ ( 1 ) ⋮ y ^ ( N ) ] = [ σ ( z ( 1 ) ) ⋮ σ ( z ( N ) ) ] = σ ( [ z ( 1 ) ⋮ z ( N ) ] ) \left[\begin{array}{c}\hat{y}^{(1)} \\ \vdots \\ \hat{y}^{(N)}\end{array}\right]=\left[\begin{array}{c}\sigma\left(z^{(1)}\right) \\ \vdots \\ \sigma\left(z^{(N)}\right)\end{array}\right]=\sigma\left(\left[\begin{array}{c}z^{(1)} \\ \vdots \\ z^{(N)}\end{array}\right]\right) y^(1)y^(N)=σ(z(1))σ(z(N))=σz(1)z(N)

Z从第1个样本到第8个样本计算的时候,z1等于第一个样本的x1到x8 乘上权重,在加偏置

z ( 1 ) = [ x 1 ( 1 ) ⋯ x 8 ( 1 ) ] [ ω 1 ⋮ ω 8 ] + b z ( N ) = [ x 1 ( N ) ⋯ x 8 ( N ) ] [ ω 1 ⋮ ω 8 ] + b z^{(1)}=\left[\begin{array}{lll}x_{1}^{(1)} & \cdots & x_{8}^{(1)}\end{array}\right]\left[\begin{array}{c}\omega_{1} \\ \vdots \\ \omega_{8}\end{array}\right]+b\\z^{(N)}=\left[\begin{array}{lll}x_{1}^{(N)} & \cdots & x_{8}^{(N)}\end{array}\right]\left[\begin{array}{c}\omega_{1} \\ \vdots \\ \omega_{8}\end{array}\right]+b z(1)=[x1(1)x8(1)]ω1ω8+bz(N)=[x1(N)x8(N)]ω1ω8+b

同时将Z看作一组向量的运算

[ z ( 1 ) ⋮ z ( N ) ] = [ x 1 ( 1 ) … x 8 ( 1 ) ⋮ ⋱ ⋮ x 1 ( N ) … x 8 ( N ) ] [ ω 1 ⋮ ω 8 ] + [ b ⋮ b ] \left[\begin{array}{c}z^{(1)} \\ \vdots \\ z^{(N)}\end{array}\right]=\left[\begin{array}{ccc}x_{1}^{(1)} & \ldots & x_{8}^{(1)} \\ \vdots & \ddots & \vdots \\ x_{1}^{(N)} & \ldots & x_{8}^{(N)}\end{array}\right]\left[\begin{array}{c}\omega_{1} \\ \vdots \\ \omega_{8}\end{array}\right]+\left[\begin{array}{c}b \\ \vdots \\ b\end{array}\right] z(1)z(N)=x1(1)x1(N)x8(1)x8(N)ω1ω8+bb

我们来看一下转换为向量化计算的完整结构图,提高运行速度

在这里插入图片描述

我们再来看一下他的代码形式,输入的x维度为8,输出的z维度为1

在这里插入图片描述

在这里插入图片描述

假如我们需要一个(8,2)的维度,输出变成了两个维度,只需要在后面增加一个(2,1)的维度,就可以降到1维

在这里插入图片描述

在神经网络中我们就可以进行转换维度,但转入更高的维度,更多的隐层,虽然能提取更多特征,但是相应的也会出现更多的噪声,我们应该提高的是泛化能力

在这里插入图片描述

在这里插入图片描述

我们下面结合糖尿病分类的数据集中Diabetes Dataset来看,x1-x8是糖尿病患者相应的指标,y代表病情是否会在一年之后加重

我们继续按照四个模块来进行代码分析

在这里插入图片描述

准备数据:首先我们来看一下数据的读取

在这里插入图片描述

定义模型:我们采用多个线性模型来定义模型

在这里插入图片描述

构造损失和优化器:与之前的logistic回归之中并没有什么变化,学习率改为0.1进行训练

在这里插入图片描述

训练周期:在这里并没有使用mini-batch

在这里插入图片描述

我们也可以选择多种不同的激活函数

在这里插入图片描述

详细的内容我们可以查询文档

https://pytorch.org/docs/stable/index.html

比如我们想要改变激活函数Relu时,只需要改变一个地方,但后面如果要计算预测Y时也需要改成sigmoid函数

在这里插入图片描述

关于数据集的下载,我们可以到下面的网站进行下载,该数据集需要和源码放入同一个文件夹

diabetes.csv.gz

完整代码如下,这里训练epoch设置为1000,但并没有得到拟合的损失

import numpy as np
import torch
import matplotlib.pyplot as plt

# prepare dataset
xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, :-1])  # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
y_data = torch.from_numpy(xy[:, [-1]])  # [-1] 最后得到的是个矩阵


# design model using class


class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(8, 6)  # 输入数据x的特征是8维,x有8个特征
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid()  # 将其看作是网络的一层,而不是简单的函数使用

    def forward(self, x):
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x))  # y hat
        return x


model = Model()

# construct loss and optimizer
# criterion = torch.nn.BCELoss(size_average = True)
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

epoch_list = []
loss_list = []
# training cycle forward, backward, update
for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())
    epoch_list.append(epoch)
    loss_list.append(loss.item())

    optimizer.zero_grad()
    loss.backward()

    optimizer.step()

plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

图像显示为:

在这里插入图片描述

如果我们将epoch改为100000时,拟合到一定的程度,但还是可以继续进行下去

import numpy as np
import torch
import matplotlib.pyplot as plt

# prepare dataset
xy = np.loadtxt('diabetes.csv.gz', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, :-1])  # 第一个‘:’是指读取所有行,第二个‘:’是指从第一列开始,最后一列不要
y_data = torch.from_numpy(xy[:, [-1]])  # [-1] 最后得到的是个矩阵


# design model using class


class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(8, 6)  # 输入数据x的特征是8维,x有8个特征
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid()  # 将其看作是网络的一层,而不是简单的函数使用

    def forward(self, x):
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x))  # y hat
        return x


model = Model()

# construct loss and optimizer
# criterion = torch.nn.BCELoss(size_average = True)
criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

epoch_list = []
loss_list = []
# training cycle forward, backward, update
for epoch in range(100000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item()) 
    epoch_list.append(epoch)
    loss_list.append(loss.item())

    optimizer.zero_grad()
    loss.backward()

    optimizer.step()

plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

图像显示为:

在这里插入图片描述

如果想查看某些层的参数,以神经网络的第一层参数为例,可按照以下方法进行

# 参数说明
# 第一层的参数:
layer1_weight = model.linear1.weight.data
layer1_bias = model.linear1.bias.data
print("layer1_weight", layer1_weight)
print("layer1_weight.shape", layer1_weight.shape)
print("layer1_bias", layer1_bias)
print("layer1_bias.shape", layer1_bias.shape)

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

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

相关文章

Node.js 入门教程 11 Node.js 从命令行接收参数

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录Node.js 入门教程11 Node.js 从命令行接收参数11 Node.js 从命令行接收参数 当使用以下命令调用 Node.js 应用程序时,可以传入任…

Android -- 每日一问:两个 Activity 之间如何传递参数?

经典回答 使用 Intent 的 Bundle 协带参数,就是我们常用的 Intent.putExtra 方法。 除了传递基本类型外,如何传递自定义的对象呢? 这个问题就是想引出 Android 的 Parcelable 。一般很多面试者都有用过传递实现了Serializable接口的自定义对…

JavaWeb学习-监听器

什么是监听器? 类似于前端的事件绑定,java中的监听器用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。…

Flutter高仿微信-第54篇-群聊-邀请好友

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图: 实现代码: import package:flutter/material.dart; import package…

【JavaEE】HTML

努力经营当下,直至未来明朗! 文章目录前言一、HTML概述二、【HTML常见标签】1. 注释标签2. 标题标签:h1-h63. 段落标签:p4.换行标签:br5.【格式化标签】5. 图片标签:img 【单标签,没有结束标签】…

HTML+CSS简单漫画网页设计成品 蜡笔小新3页 大学生个人HTML网页制作作品

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

GreenPlum AOCO列存读IO原理

GreenPlum AOCO列存读IO原理GP自带AOCO列存,它的IO和heap表的IO是分开的。Heap表的脏数据由checkpoint或后台write进程刷写,也就是FlushBuffer函数调用smgrwrite。由magnetic disk storage manager管理IO模块。但是AOCO列存则是由本身进行管理&#xff0…

【信息融合】BP神经网络和DS证据理论不确定性信息融合问题【含Matlab源码 2204期】

⛄一、 D-S证据理论及解释 证据理论由Dempster在1967年最初提出,并由他的学生Shafer改进推广使之成为符合有限离散领域中推理的形式,因此称为D-S理论。证据理论讨论一个“辨识框架”(Frame of Discernment)Θ,它是关于命题的相互独立的可能答案或假设的一个有限集合。按传统方…

基于POI的可快速定制Excel导出脚本设想

基于POI的可快速定制Excel导出脚本设想 背景 年关将至,业务人员提出了好多比较着急但是又不常用的取数需求。所谓不常用,大概了是由于业务人员前期调研产生的临时需求,后续也不会大面积铺开,没必要专门分配人员去开发。所谓比较着…

诊断数据库ODX—数据库框架(基于ISO22901详解)

文章目录 前言一、ODX数据库自身架构是什么?二、ODX数据库架构具体组成部分和含义总结前言 车载诊断现阶段应用的诊断数据库大体分为三种: CDD(Vector私有格式); ODX全球通用诊断数据库格式; DEXT&…

【零基础入门SpringMVC】第四期——RESTFUL专题

一、RESTFul 概述 1、什么是 RESTFul? REST 全称 Representational State Transfer 代表 表现层资源状态转移 视图层 控制层 表现层 百度百科这样说: RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式…

轻松应对80% 的工作场景?GitHub 爆赞的 Java 高并发与集合框架,面试官也拿我没辙

在工作中,笔者经常和掌握不同技术的朋友讨论具体问题的解决方案,发现在 Java 体系中,大家使用最多的是 Java 集合框架(JCF)和 Java 并发工具包(JUC)。实际上,JCF 和 JUC 已经能够覆盖…

Flutter高仿微信-第50篇-群聊-查看群成员

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图: 实现代码: import package:flutter/material.dart; import package:…

Node.js 入门教程 7 从命令行运行 Node.js 脚本 8 如何退出 Node.js 程序

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录Node.js 入门教程7 从命令行运行 Node.js 脚本8 如何退出 Node.js 程序7 从命令行运行 Node.js 脚本 运行 Node.js 程序的常用方法是&#…

【点云处理】点云法向量估计及其加速(5)

在上一篇文章【点云处理】点云法向量估计及其加速(4)中我们尝试对pcl自带的KDTree的k近邻搜索过程使用OpenMP加速,效果比较明显,有将近1倍的提速。在这篇文章中我们暂时放弃pcl自带的KDTree,转而使用另一大杀器nanflann库提供的KDTree。nanof…

玩链子游戏

一 游戏描述 有一条链子,上面有 n 颗钻石,钻石编号为 1~n 。可以对该链子执行两种操作: ① CUT a b c (区间切割操作) 切下从第 a 颗钻石到第 b 颗钻石的链子,把它插在剩余链子的第 c 颗钻石…

【食品加工技术】第五章 烘烤食品加工技术 笔记

【食品加工技术】第五章 烘烤食品加工技术 笔记5.1 焙烤食品概述烘烤食品的分类按发酵和膨化程度分类安装生产工艺分类烘烤食品的原料面粉糖蛋品乳及乳制品膨松剂烘烤设备常用设备恒温设备常用工具5.2 面包加工工艺和关键技术面包的分类面包的发酵原理面包的工艺流程一次发酵二…

uboot引导应用程序

uboot默认是支持执行应用程序的,就像引导内核一样,我们也可以自己写一个应用程序,让uboot启动时引导。 在uboot examples/standalone 目录下,有hello_world.c文件,编译uboot的时候,会自动编译hello_world.…

详解 InnoDB Cluster 主机名问题

详解 InnoDB Cluster 主机名问题 文章目录详解 InnoDB Cluster 主机名问题导言测试过程结论导言 因在写 【InnoDB Cluster】修改已有集群实例名称及成员实例选项 时发现主机名这块有一些问题,在其中进行了部分测试,但为使其内容精简,故将此部…