深度学习_2 数据操作

数据操作

机器学习包括的核心组件有:

  1. 可以用来学习的数据(data);
  2. 如何转换数据的模型(model);
  3. 一个目标函数(objective function),用来量化模型的有效性;
  4. 调整模型参数以优化目标函数的算法(algorithm)。

我们要从数据中提取出特征,机器学习、深度学习通过特征来进一步计算得到模型。因此下面主要介绍的是对数据要做哪些操作。

基本操作

深度学习里最多操作的数据结构是N维的数组。

0维:一个数,一个标量,比如1.

1维:比如一个一维数组,他的数据是一个一维的向量(特征向量)。

2维:比如二维数组(特征矩阵)。

当然还有更多维度,比如视频的长,宽,时间,批量大小,通道……

如果我们想创建这样一个数组,需要明确的因素:

  1. 数组结构,比如3*4.
  2. 数组数据类型,浮点?整形?
  3. 具体每个元素的值。

访问元素的方式:

1698545535004

1:3 是左闭右开,表示不包含第3行。

双冒号是跳着访问,后跟步长。比如 ::3 表示从第0行开始访问,每3行访问一次。

明白了这些,那接下来我们就创建一个数组。在机器学习中这种数据的容器一般被称作张量.

创建张量

这部分代码在 jupyter/pytorch/chapter_preliminaries/ndarray.ipynb 里。

在其中可以运行尝试代码部分,创建一维张量:

import torch
X = torch.arange(12) 	# 自动创建 0-11 的一维张量。输入 X 查看 X 内元素数据,输出:
# tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
X.shape					# 查看向量形状。输出 torch.Size([12]),指长12的一维向量
X.numel()				# 只获取长度,输出12
X = X.reshape(3, 4)		# 重新改成了3行4列形状。变成了0123 4567 891011
torch.zeros((2, 3, 4))	# 创建了一个形状为(2,3,4)的全0张量
# tensor([[[0., 0., 0., 0.],
#          [0., 0., 0., 0.],
#          [0., 0., 0., 0.]],
# 
#         [[0., 0., 0., 0.],
#          [0., 0., 0., 0.],
#          [0., 0., 0., 0.]]])
# torch.ones 同理,是全1的
# torch.randn 是取随机数,随机数是均值=0,方差=1的一个高斯分布中取
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])	# 给定值创建
torch.exp(X)			# 求e^x中每个元素值得到的新张量

reshape 很有意思,它不是复制原数组后重新开辟了一片空间,而是还是对原数组元素的操作(只不过原来是连续12个数,现在我们把他们视作4个一行的3行元素。存储空间都是连续的)。因此如果我们对 reshape 后的数组赋值,原数组值也会改变。

算术运算

对于两个相同形状的向量可以进行+ - * / **(求幂运算)运算。

x = torch.tensor([1.0, 2, 4, 8])	# 1.0 为了让这个数组变成浮点数组
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x ** y  # **运算符是求幂运算
# Output: 
(tensor([ 3.,  4.,  6., 10.]),tensor([-1.,  0.,  2.,  6.]),tensor([ 2.,  4.,  8., 16.]),tensor([0.5000, 1.0000, 2.0000, 4.0000]),tensor([ 1.,  4., 16., 64.]))
x==y								# 每一项分别判断是否相等。我试了一下,数据类型不影响。2.0==2
x.sum()								# 所有元素求和
张量连接
X = torch.arange(12, dtype=torch.float32).reshape((3,4))	# 创建 float32 位的张量
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)			# 行和列两个维度的拼接
# Output: 
(tensor([[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[ 2.,  1.,  4.,  3.],[ 1.,  2.,  3.,  4.],[ 4.,  3.,  2.,  1.]]),tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],[ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],[ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]]))
# 这里我看到弹幕前辈的讲解,感觉很受用。行是样例,列是特征属性,这个类似 MySQL 的关系数据库理解
广播机制

即使两个张量形状不同,也有可能通过广播机制进行按元素操作。

a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
# Output: 
(tensor([[0],[1],[2]]),tensor([[0, 1]]))a + b			# 把a按列复制2份,b按行复制3份,都变成3*2的张量进行操作
# Output:
tensor([[0, 1],[1, 2],[2, 3]])
索引
X[-1], X[1:3]						# 这里和前面介绍的概念一样。-1 是倒数第一个元素(一个n-1维度张量),1:3 是第2,第3个元素不包括第4个元素。
# Output:
(tensor([ 8.,  9., 10., 11.]),tensor([[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.]]))
X[1,2]=9							# 写入
X[0:2, :] = 12						# 批量写入,给0-1行,所有列写成12
X
# Output:
tensor([[12., 12., 12., 12.],[12., 12., 12., 12.],[ 8.,  9., 10., 11.]])
节省内存

有一些操作会分配新内存。比如 Y=Y+X,并不是直接在 Y 的原地址上加了X,而是在新地址上计算得到 Y+X,让 Y 指向新地址。

可以通过 id(X) 函数来查看地址。

Y[:]=Y+X 或者 Y+=X 会在原地执行计算,Y 地址不变。

类型转换

转换为 numpy 张量:A=X.numpy()

张量转换为标量:

a=torch.tensor([3.5])
a.item()				# 3.5
float(a)				# 3.5
int(a)					# 3

数据预处理

实际处理数据的时候我们并不是从张量数据类型开始的,我们可能得到一个 excel 文件,自己把它转换成 python 张量。以及在转换之前,我们可能对数据进行预处理,比如把其中的空值统一赋值为0之类的操作。以下是转换步骤。

首先我们创建一个 csv 文件作为原始数据集。

import osos.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n')  # 列名f.write('NA,Pave,127500\n')  # 每行表示一个数据样本f.write('2,NA,106000\n')f.write('4,NA,178100\n')f.write('NA,NA,140000\n')

三个属性分别是 room 数量,走廊状态(比如铺了地板),价格。

然后我们把这个数据读入 python,加载原始数据集。

# 如果没有安装pandas,只需取消对以下行的注释来安装pandas
# !pip install pandas
import pandas as pddata = pd.read_csv(data_file)

这个数据集里还是有很多 NaN 项的,我们要对其进行修改替换。数值类典型处理方式是插值删除

首先最后一列数据是完整不需要修改的,那么我们只要处理前两列,我们把前两列数据单独拿出来做完处理最后进行张量拼接。

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]

然后我们把 NumEooms 中的 NaN 值用均值替代,

inputs = inputs.fillna(inputs.mean(numeric_only=True))
print(inputs)
# Output:NumRooms Alley
0       3.0  Pave
1       2.0   NaN
2       4.0   NaN
3       3.0   NaN

对于 Alley 列,只有两种状态:NaN 和 Pave。我们用 pandas 的方法,把 NaN 也视作一个类,自动拆成两列设置值。

inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
# Output:NumRooms  Alley_Pave  Alley_nan
0       3.0           1          0
1       2.0           0          1
2       4.0           0          1
3       3.0           0          1

最后,我们将前两列处理后得到的结果与最后一列转换为张量后进行拼接。

import torchX = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
y=y.reshape(4,1)
torch.cat((X,y),dim=1)
# Output:
tensor([[3.0000e+00, 1.0000e+00, 0.0000e+00, 1.2750e+05],[2.0000e+00, 0.0000e+00, 1.0000e+00, 1.0600e+05],[4.0000e+00, 0.0000e+00, 1.0000e+00, 1.7810e+05],[3.0000e+00, 0.0000e+00, 1.0000e+00, 1.4000e+05]], dtype=torch.float64)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Instagram和kol展开合作

网红营销已经演变成一个由品牌、MCN机构、红人和消费者组成的复杂生态系统,并在某种程度上重新定义了当今社交媒体时代营销和广告的本质。在这个情况下,品牌找红人进行营销推广已经成为大势,而最能体现网红营销发展的莫过于Instagram这个平台…

黑豹程序员-架构师学习路线图-百科:jMeter并发测试计划

我们开发一个软件系统,为了保证代码的正确,我们需要测试。测试日常包括:单元测试、功能测试、集成测试、压力测试、回归测试。 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。 JMeter 最初被…

抖音上怎么挂小程序?制作小程序挂载抖音视频

公司企业商家现在已经把抖音作为营销的渠道之一,目前抖音支持短视频挂载小程序,可方便做营销。以下给大家分享这一操作流程。 一、申请自主挂载能力 首先需要在抖音开放平台官网注册一个抖音小程序账号,然后申请短视频自主挂载能力。 二、搭…

【ROS教程demo】用C++创建一个ROS节点,发布指令使得小海龟做圆周运动

ROS创建节点发布命令使得小海龟做圆周运动 1.任务需求2.任务分析2.1发布方topic和msg2.2接收方topic和msg2.3目标明确!3.创建ROS节点3.1创建发布方节点pub_pose3.2创建订阅方节点sub_pose1.任务需求 创建一个节点,在其中实现一个订阅者和一个发布者,完成以下功能: 发布者:…

2.预备知识-2简化版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 数据操作数据预处理一、N维数组样例二、创建数组三、访问元素四、数据操作D2L注意点五、数据预处理六、D2L注意点七、QA No.2 线性代数一、标量二、向量1、基本操作2、空间表示3、乘法 三、矩阵1、基本操作2、乘法3、空…

一百九十七、Java——IDEA项目中把多层文件夹拆开显示

一、目的 由于IDEA项目中,默认的是把文件夹连在一起显示,于是为了方便需要把这些连在一起的文件夹拆开,分层显示 如文件夹cn.kgc 二、解决措施 解决方法很简单 (一)找到IDEA项目上的小齿轮 (二&#xf…

springboot的spring.jackson.date-format失效解决

看起来数据库的格式非常完美,但是数据库字段look_date 是 datetime类型,java里没有datetime类型,这样一来如果你不在后端做处理,那么模型属性Date来接收一定会出问题.我通过实验证明最后拿到的是一个时间戳. 第一 解决时间格式问题 1.可以通过application.propertis配置文件中…

Ubuntu 内核降级到指定版本

reference https://www.cnblogs.com/leebri/p/16786685.html 前往此网站,找到所需的内核 https://kernel.ubuntu.com/~kernel-ppa/mainline/ 查看系统架构 dpkg --print-architecture 二、下载安装包 注意:下载除lowlatency以外的deb包 三、安装内核 3…

python excel接口自动化测试框架

前言 前些天写了pytestyamlallure接口自动化测试框架这篇文章。 今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件,得到测试信息,然后通过封装的requests方法&#xff0c…

吴恩达《机器学习》1-3:监督学习

一、监督学习 例如房屋价格的数据集。在监督学习中,我们将已知的房价作为"正确答案",并将这些价格与房屋的特征数据一起提供给学习算法。学习算法使用这些已知答案的数据来学习模式和关系,以便在未知情况下预测其他房屋的价格。这就…

SurfaceFliger与Vsync信号如何建立链接?

Vsync信号上报流程 Vsync的注册函数,来临时会回调HWComposer的hook_VSYNC方法,接着调用到vsync方法中 大致流程梳理: 该方法会通知给SurfaceFliger的onVsyncReceived方法,接着调用DispSync的addResyncSample方法。 DispSyncThr…

MA网络下,静态路由仅配出接口,不配下一跳是否可行

在MA网络模式下,静态路由只配置出接口,不配置下一跳地址是否可行 如下拓扑图: 如图所示,在R1上配置一条去往4.4.4.4的静态路由,此时如果静态路由只配置出接口,不配置下一跳地址: ip route-stat…

Hi3516DV500部署paddle版型分析模型记录

原版模型测试并导出onnx paddle 版面分析-> https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/ppstructure/layout/README_ch.md 测试 python3 deploy/python/infer.py \ --model_dirmodel/picodet_lcnet_x1_0_fgd_layout_cdla_infer/ \ --image_fil…

Day 4 登录页及路由 (二) -- Vue状态管理

状态管理 之前的实现中,判断登录状态用了伪实现,实际当中,应该是以缓存中的数据为依据来进行的。这就涉及到了应用程序中的状态管理。在Vue中,状态管理之前是Vuex,现在则是推荐使用Pinia,在脚手架项目创建…

渗透测试-Fastjson反序列化漏洞getshell

目录 前言 测试环境准备 dnslog测试 搭建rmi服务器&准备恶意类 引用JdbcRowSetImpl攻击 反弹shell$命令执行 总结 关键字:fastjson 1.2.24反序列化导致任意命令执行漏洞 注:本次渗透测试全在虚拟机中进行仅用于学习交流,请勿在实…

Visual Studio(VS)C++项目 管理第三方依赖库和目录设置

发现很多程序员存在这种做法:把项目依赖的第三方库的lib和dll放在项目目录下,或者复制到输出目录,因为每种配置都有不同的输出目录,所以要复制多份(至少包括Debug和Release两个输出目录),这些做…

Mac电脑配置Dart编程环境

1.安装Dart SDK 官网地址:https://dart.dev/get-dart $brew tap dart-lang/dart$brew install dart 安装后,用命令检测一下是否安装正常。 $brew info dart 2.VS Code配置Dart环境 1).安装VS Code 官网地址:https://code.visualstudio.c…

如何在 Photoshop 中使用污点修复画笔

学习污点修复画笔工具的基础知识,以及如何使用它来修复、平滑和删除图像中不需要的部分 1.如何在 Photoshop 中使用污点修复画笔 步骤1 在 Photoshop 中使用污点修复画笔的方法有很多。今天,让我们用它来去除这只手臂上的一些较小的纹身。 步骤2 在我…

少儿编程 2023年9月中国电子学会图形化编程等级考试Scratch编程四级真题解析(选择题)

2023年9月scratch编程等级考试四级真题 选择题(共25题,每题2分,共50分) 1、角色为一个紫色圆圈,运行程序后,舞台上的图案是 A、 B、 C、 D、 答案:A

Star History 九月开源精选 |开源 GitHub Copilot 替代

虽然大火了近一年,但是截至目前 AI 唯一破圈的场景是帮助写代码(谷歌云旗下的 DORA 年度报告也给 AI 泼了盆冷水)。不过对于软件开发来说,生成式人工智能绝对已经是新的标配。 本期 Star History 收集了一些开源 GitHub Copilot …