【Python · PyTorch】数据基础

数据基础

  • 1. 数据操作
    • 1.1 入门
    • 1.2 运算符
    • 1.3 广播机制
    • 1.4 索引和切片
    • 1.5 节省内存
    • 1.6 转化为其他Python对象
  • 2. 数据预处理
    • 2.1 读取数据集
    • 2.2 处理缺失值
    • 2.3 转换为张量格式

本文介绍了PyTorch数据基础,Python版本3.9.0,代码于Jupyter Lab中运行,以尽可能简单的文字阐述相关内容。

1. 数据操作

1.1 入门

首先,我们先导入torch,在python中PyTorch被称作torch。

import torch

导入PyTorch

张量表示一个由数值(元素)组成的数组,其可能具有多个维度,即可在多个坐标轴上表示。

  • 一维张量:向量(vector)
  • 二维张量:矩阵(matrix)

我们调用arange函数创建一个行向量x,其包含从0开始前20个整数,默认为整数,也可被指定为浮点数。

x = torch.arange(20)

arange

调用python内置函数type可得知,创建的x为torch中的Tensor(张量)对象。

type(x)
# <class 'torch.Tensor'>

type

我们调用reshape函数可以改变一个张量的形状且不改变元素数量、元素值,下面我们对x向量作变换,得到4*5矩阵y。

y = x.reshape(4, 5)
z = x.reshape(5, 6)    # 当我们试图变换超过其总元素大小时,程序会抛出异常

reshape

当矩阵元素数量足够多时,我们不需要手动指定每个维度改变形状,可以使用-1来表示其中一个维度,如下所示。

z = x.reshape(5,-1)
y1 = x.reshape(4,-1)

reshape

我们通过shape属性访问张量的形状,通过numel获知其元素总量(大小),如下所示,我们分别对x和y做如上操作。

x.shape                  # 表示x矩阵的形状
x.numel()                # 表示x矩阵的元素总量y.shape                  # 表示x矩阵的形状
y.numel()                # 表示x矩阵的元素总量

shape & numel

通过zerosones函数创建任意形状的全0、全1元素矩阵。

torch.zeros(2, 3)torch.ones(3, 4)

zeors & ones

有时我们想从某个特定的概率分布中随机采样得到每个元素的值,通过randn函数创建一个每个元素都从均值为0、方差为1的标准高斯分布(正态分布)中随机采样的矩阵。

torch.randn(3, 4)

randn

1.2 运算符

下面介绍张量如何逐元素运算。

x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
# 加、减、乘、除、求幂
x + y, x - y, x * y, x / y, x ** y# 逐元素自然指数运算
torch.exp(x)
# tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])

exp

下面介绍如何将多个张量连接在一起,首先创建两个矩阵

X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

创建张量

分别对矩阵做纵向、横向拼接。


# 纵向拼接
torch.cat((X, Y), dim=0)
# 横向拼接
torch.cat((X, Y), dim=1)

cat

我们可以通过==对两矩阵逐元素进行比较,可以得到各元素均为布尔型的矩阵。

X == Y

==

对张量中所有元素求和,会产生一个单元素张量。

X.sum()

sum

1.3 广播机制

广播机制的工作方式如下:

  1. 通过适当复制元素来扩展一个或两个数组,使其转换后具有相同的形状
  2. 对生成的数组执行按元素操作

多数情况下,我们沿着数组中长度为1的轴进行广播。

a = torch.arange(3).reshape((3,1))
b = torch.arange(2).reshape((1,2))

创建张量

其形状不匹配,我们可以将其广播为一个更大的3×2的矩阵。

a + b

广播机制

1.4 索引和切片

我们可以使用[-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素:

X[-1], X[1:3]

索引

我们还可以通过索引的方式将单个元素写入矩阵:

X[1,2] = 9
X

索引写入

我们还可以通过这种方式为多个元素赋予相同的值,只需索引所有元素,如:

X[0:2, :] = 12       # 本例代表访问第1行和第2行,其中":"代表沿轴(列)的所有元素
X

索引写入

以上方法均适用于超过2个轴的其他类型的张量。

1.5 节省内存

当我们执行Y = Y + X操作后,Python会首先计算Y + X,为结果分配新的内存,然后使Y指向内存中的这个新位置。

这是不可取的:

  • 机器学习中,可能有数百兆参数,我们希望原地执行这些更新。
  • 若不原地更新,其他引用可能仍会指向旧的位置,可能会无形中引用旧的参数。

执行原地操作的方法很简单,可以使用切片操作执行。如Y[:]=<expression>

我们可以先创建一个新的矩阵Z,其为全零矩阵,与先前X的形状相同,然后比较其ID:

print('id(Z):', id(Z))
# id(Z): 2502249091776
Z[:] = X + X
print('id(Z):', id(Z))
# id(Z): 2502249091776

原地操作

1.6 转化为其他Python对象

将张量在torch框架与numpy框架间转换很容易,它们将共享底层内存,就地操作一个也会改变另一个张量。

A = X.numpy()
B = torch.tensor(A)
type(A), type(B)
# (<class 'numpy.ndarray'>, <class 'torch.Tensor'>)

tensor与numpy相互转换

将大小为1的张量转化为Python标量,有多种方法:

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

张量与标量相互转换

2. 数据预处理

2.1 读取数据集

我们先创建一个数据集,并按行写入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')

随后导入pandas包,并调用read_csv函数

import pandas as pddata = pd.read_csv(data_file)
print(data)

数据预处理

2.2 处理缺失值

NaN代表缺失值,处理的典型方法包括插值法删除法,插值法即用替代值弥补,删除法则忽视缺失值。

本例中,我们采用插值法。

通过位置索引函数iloc将数据分成inputs和outputs,其中inputs为data前两列,outputs为最后一列。

fillna函数可以使用传入参数值代替NaN缺失值,而mean函数可以求得其对应的平均值。

inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)

iloc函数,属于pandas库,全称为index location,即对数据进行位置索引,从而在数据表中提取出相应的数据。

iloc

对于inputs中的类别值或离散值,NaN可视作一个类别,而NA被视为字符串。由于Alley列有NA、Pave和NaN三个类别,Pandas可自动将其分为三列Alley_NAAlley_PaveAlley_nan。值激活为1,不激活为0。

inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)

pd.get_dummies相当于onehot编码,常用与把离散的类别信息转化为onehot编码形式。

get_dummies

2.3 转换为张量格式

通过调用type函数,我们发现pandas及分割后的数据均为<class 'pandas.core.frame.DataFrame'>类型。

我们可调用tneser函数将上述类型的数据转化为PyTorch张量(即<class torch.Tensor>类型)。

import torchX, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
X, y

pandas中DataFrame转换为torch张量

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

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

相关文章

人工智能之深度学习

1. 引言 时至今日&#xff0c;人们常用的计算机程序几乎都是软件开发人员从零编写的。 比如&#xff0c;现在开发人员要编写一个程序来管理网上商城。 经过思考&#xff0c;开发人员可能提出如下一个解决方案&#xff1a; 首先&#xff0c;用户通过Web浏览器&#xff08;或移动…

Elasticsearch的聚集统计,可以进行各种统计分析

说明&#xff1a; Elasticsearch不仅是一个大数据搜索引擎&#xff0c;也是一个大数据分析引擎。它的聚集(aggregation)统计的REST端点可用于实现与统计分析有关的功能。Elasticsearch提供的聚集分为三大类。 度量聚集(Metric aggregation)&#xff1a;度量聚集可以用于计算搜…

MyBatisPlus的使用【详细】

目录 Mybatis MybatisPlus特性 MybatisPlus的使用 常见注解 TableName TableId TableField MP常见配置 条件查询器Wrapper QueryWrapper UpdateWrapper LambdaQueryWrapper 自定义SQL Service接口 批量添加数据 MP的代码生成 MP静态工具 MP扩展功能之逻辑删除…

C++栈、队列、优先级队列模拟+仿函数

目录 一、栈的模拟和deque容器 1.deque 1.1deque结构 1.2deque优缺点 2.stack模拟 二、队列的模拟 三、priority_queue优先级队列 1.优先级队列模拟 2.添加仿函数 一、栈的模拟和deque容器 在之前&#xff0c;我们学过了C语言版本的栈&#xff0c;可以看这篇文章 栈和…

【刷题篇】笔试真题

文章目录 复数乘法一年中的第几天字符串相加字符串相乘 复数乘法 复数 可以用字符串表示&#xff0c;遵循 “实部虚部i” 的形式&#xff0c;并满足下述条件&#xff1a; 实部 是一个整数&#xff0c;取值范围是 [-100, 100] 虚部 也是一个整数&#xff0c;取值范围是 [-100, 1…

MySQL字段加密方案 安当加密

要通过安当KSP密钥管理系统实现MySQL数据库字段的加密&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装和配置安当KSP密钥管理系统&#xff1a;首先&#xff0c;您需要安装安当KSP密钥管理系统&#xff0c;并按照说明进行配置。确保您已经正确地设置了密钥管理系统的用…

C语言知识回顾

链接&#xff1a;https://pan.baidu.com/s/1CiB1Ydm4LTV6hZE8wx0VFw?pwdna4z 提取码&#xff1a;na4z --来自百度网盘超级会员V6的分享

判断过/欠拟合和学习率

一、说明 这篇博客是判断是否过拟合和学习率大小的问题&#xff0c;并没有给出解决办法。因为每个人的网络模型不一样&#xff0c;解决办法也不同。因此&#xff0c;如果需要解决办法的话&#xff0c;请参考其他博客。 二、拟合问题 1.train_loss 不断下降&#xff0c;test_los…

【Linux系统编程:信号】产生信号 | 阻塞信号 | 处理信号 | 可重入函数

写在前面 通过学习信号可以理解进程与进程的一个相对关系&#xff0c;还能理解操作系统与进程的关系。要注意的是进程间通信中的信号量与这里的信号没有半毛钱关系&#xff0c;就像老婆和老婆饼。 本文要点&#xff1a; 掌握 Linux 信号的基本概念掌握信号产生的一般方式理解…

Unity之ShaderGraph如何实现触电电流效果

前言 之前使用ASE做过一个电流效果的shader&#xff0c;今天我们通过ShaderGraph来实现一个电流效果。 效果如下&#xff1a; 关键节点 Simple Noise&#xff1a;根据输入UV生成简单噪声或Value噪声。生成的噪声的大小由输入Scale控制。 Power&#xff1a;返回输入A的结果…

统信UOS技术开放日:四大领域全面接入AI大模型能力

1024是程序员的节日&#xff0c;10月24日&#xff0c;统信举办2023统信UOS技术开放日暨deepin Meetup北京站活动&#xff0c;发布与大模型同行的UOS AI、浏览器AI助手、邮箱AI助手、自然语言全局搜索、畅写在线等多项最新AI技术与产品应用。 统信软件高级副总经理、CTO、深度社…

周记之马上要答辩了

“ 要变得温柔和强大&#xff0c;就算哪天突然孤身一人&#xff0c;也能平静地活下去&#xff0c;不至于崩溃。” 10.16 今天提前写完了一篇六级阅读&#xff0c;积累了一些词组&#xff1a; speak out against 公然反对&#xff0c;印象最深刻的就这个&#xff1b; 先了解…

opencv dnn模块 示例(19) 目标检测 object_detection 之 yolox

文章目录 0、前言1、网络介绍1.1、输入1.2、Backbone主干网络1.3、Neck1.4、Prediction预测输出1.4.1、Decoupled Head解耦头1.4.2、Anchor-Free1.4.3、标签分配1.4.4、Loss计算 1.5、Yolox-s、l、m、x系列1.6、轻量级网络研究1.6.1、轻量级网络1.6.2、数据增强的优缺点 1.7、Y…

app专项测试:app弱网测试

弱网测试背景 用户体验 APP使用过程中&#xff0c;弱网的高延迟和高丢包&#xff0c;在实时性要求非常高的场景&#xff0c;容易伤害用户体验 非正常情况下&#xff0c;Bug出现几率会增加 在解决日常支持需求中&#xff0c;经常出现一些用户反馈的Bug无法复现&#xff0c;有…

库的操作【MySQL】

文章目录 创建数据库字符集和校验规则概念分类例子 查看数据库显示创建语句修改数据库删除数据库备份和恢复备份恢复 创建数据库 SQL: CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARSETcharset_name] [[DEFAULT] COLLATEcollation_name];其中&#xff0c;大写的单…

xhadmin多应用Saas框架之超级SEO应用介绍

xhadmin是什么&#xff1f; xhadmin 是一套基于最新技术的研发的多应用 Saas 框架&#xff0c;支持在线升级和安装模块及模板&#xff0c;拥有良好的开发框架、成熟稳定的技术解决方案、提供丰富的扩展功能。为开发者赋能&#xff0c;助力企业发展、国家富强&#xff0c;致力于…

面对史上最难求职季,哪些测试技能更容易拿到offer?

在一线大厂&#xff0c;没有测试这个岗位&#xff0c;只有测开这个岗位。这几年&#xff0c;各互联网大厂技术高速更新迭代&#xff0c;软件测试行业也正处于转型期。传统的功能测试技术逐步淘汰&#xff0c;各种新的测试技术层出不穷&#xff0c;测试人员的薪资也水涨船高。与…

ChatGPT 助力英文论文翻译和润色

文章目录 一、前言二、主要内容1. 中英互译2. 中文润色3. 英文润色 三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 随着全球化的推进&#xff0c;跨文化交流变得越来越重要。在学术领域&#xff0c;英文论文的质量对于研究成果的传…

JAVA设计模式全解(独家AI解析)

JAVA设计模式全解&#xff08;独家AI解析&#xff09; 一、JAVA介绍二、JAVA设计模式六大原则三、JAVA设计模式介绍四、JAVA设计模式详解4.1 单例模式4.1.1 懒汉式&#xff08;Lazy Initialization&#xff09;4.1.2 饿汉式&#xff08;Lazy Initialization&#xff09; 4.2 代…

nginx配置负载均衡--实战项目(适用于轮询、加权轮询、ip_hash)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…