第一节 数据操作+数据处理

本系列文章为李沐老师《动手学深度学习》Pytorch版实践学习笔记,相关课程教学、书籍、代码均为开源,可通过以下链接参考学习:

跟李沐学AI的个人空间-跟李沐学AI个人主页-哔哩哔哩视频 (bilibili.com)

前言 — 动手学深度学习 2.0.0 documentation (d2l.ai)

安装 — 动手学深度学习 2.0.0 documentation (d2l.ai)

一、数据操作

  1. N维数组:N维数组是机器学习和神经网络的主要数据结构。其中0维为标量,例如一个类别;1维为向量,例如一个特征向量;2维为矩阵,例如一个样本的特征矩阵;3维例如一张RGB图片(宽×长×RGB通道);4维例如一个RGB图片批量(批量大小patch×宽×长×RGB通道);5维例如一个视频批量(批量大小×宽×高×通道)
  2. 创建数组需要:①形状;②每个元素的数据类型;③每个元素的值
  3. 深度学习框架比Numpy的ndarray多一些重要功能:首先,GPU很好地支持加速计算,而NumPy仅支持CPU计算;其次,张量类支持自动微分。 这些功能使得张量类更适合深度学习。

数据操作实现

  1. 导入torch:import torch

  2. 张量tensor表示一个数值组成的数组,这个数组可能有多个维度。可以通过张量的shape属性【注意是属性,不是调用函数】来访问张量的形状。调用numel()函数(number of elements)可以查看张量中元素的总数,永远是标量。

  3. 若要改变张量的形状,可以调用reshape()函数,注意该函数生成的是一个新的张量:

    我们不需要通过手动指定每个维度来改变形状。 也就是说,如果我们的目标形状是(高度,宽度), 那么在知道宽度后,高度会被自动计算得出,不必我们自己做除法。 我们也可以通过-1来调用此自动计算出维度的功能。 即我们可以用x.reshape(-1,4)x.reshape(3,-1)来取代x.reshape(3,4)b = a.reshape()是对a的引用,操作b会改变a。

  4. 可以调用zeors()和ones()函数等生成具有指定元素值的张量:

    在 PyTorch 中,torch.zeros(2,3,4) 和 torch.zeros((2,3,4)) 实际上是等价的,它们没有区别。两者都是用来创建一个形状为 (2, 3, 4) 的全零张量(Tensor),即该张量共有 2 层,每层有 3 行,每行有 4 列,总共包含 2 * 3 * 4 个元素,并且所有元素初始值都为零。

  5. 通过提供包含数值的Python列表或嵌套列表可以为张量中的每个元素赋值,使用tensor()函数构造向量:

  6. 常见的标准运算符(+、-、*、/、**)都可以被升级为按元素运算。

  7. 可以使用cat()函数将多个向量连结在一起,其中dim表示在第几维度进行合并,0为行,1为列,即第几层中括号

  8. 可以通过逻辑运算符构建二元张量,按元素进行比较:

  9. sum()函数对张量中所有元素进行求和,会产生一个只有一个元素的张量

    1. 若要按照某一维度进行求和,使用X.sum(axis=…)。如果要保持最终结果的维度数不变,在sum()函数中使用参数keepdims=True,便于相同维度使用广播机制。
    2. X.cumsum(axis=…)函数为按维度进行累加求和,也就是维度数不变,将累加结果更新到当前计算到的位置:
  10. 即使形状不同,也可以通过调用广播机制来执行按元素操作:

  11. 和列表一样,可以通过指定索引读取或者修改元素。

  12. 执行原地操作举例:

    对元素进行操作时地址不变,或者使用命令X += Y;使用X = X + Y地址会改变。

    X += Y: 这是一个就地操作(in-place operation),意味着它直接修改了张量X的内容而没有创建新的张量。由于张量数据是在同一块内存区域上进行更新,所以其内存地址不会改变。

    X = X + Y: 在默认情况下,这个表达式会创建一个新的张量来存储X与Y相加的结果。这是因为Python中的赋值语句实际上是对引用的重新绑定,而不是原地修改对象内容。因此,在执行X = X + Y时,首先计算X + Y得到一个新张量,然后将变量X指向这个新创建的张量,原来的X所指向的内存区域不再被X引用,从而导致X的内存地址发生了变化。

    在某些情况下,特别是在使用深度学习框架时,为了优化内存使用并减少数据复制,用户可能会选择使用就地操作以提高性能。不过,需要注意的是,频繁使用就地操作可能会影响梯度计算,因为它们破坏了原始数据,无法回溯到之前的计算状态。因此,在实际应用中,需要根据具体需求权衡是否采用就地操作。

二、数据预处理

为了能用深度学习来解决现实世界的问题,我们经常从预处理原始数据开始, 而不是从那些准备好的张量格式数据开始。在Python中常用的数据分析工具中,我们通常使用pandas软件包,pandas可以与张量兼容。

(1)读入数据

  1. 人工创建一个数据集:

    import osos.makedirs(os.path.join('..', 'data'), exist_ok=True)  # 如果在当前文件夹下,只指明data参数即可
    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')
    

  2. 使用pandas库的read_csv()函数读取数据,data数据为DataFrame类型:

(2)处理缺失值

为了处理缺失的数据,典型的方法包括插值法删除法]其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。

  1. 通过位置索引iloc(index location)将data分为inputs和outputs两部分,前两列为输入,最后一列为输出。对于inputs中缺失的数值,使用同一列的平均值代替。

  2. 对于inputs中缺失的类别值或者离散值,将”NAN”视为一个类别。由于“巷子类型”(“Alley”)列只接受两种类型的类别值“Pave”和“NaN”, pandas可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”。 巷子类型为“Pave”的行会将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。 缺少巷子类型的行会将“Alley_Pave”和“Alley_nan”分别设置为0和1。

    在 pandas 库中,pd.get_dummies()函数用于将分类变量(通常是字符串类型)转换为虚拟/指示/独热编码形式的数值列。通过这种方式,非数值型类别特征可以被转化为机器学习模型可直接处理的形式。

    参数 dummy_na=True 意味着包括一个额外的列来表示原始数据集中是否存在缺失值(NaN)。如果某个类别的值是 NaN,则会在生成的 dummy 变量中对应的位置上设置为 1,表示该观测值在这个类别上有缺失。

  3. 若要删除具有最多缺失值的列,则需要先统计每列缺失值的个数,找出缺失最多的列,并使用drop()函数删除:

    missing_counts = data.isnull().sum()  # 统计每列缺失值的数量
    # missing_counts = data.isnull().sum(axis=1) 对行统计
    print(missing_counts)   # Series,索引表示列名
    most_missing_column = missing_counts.idxmax()  # 返回最多的列,.idxmax() 方法用于返回具有最大值(在这个场景下是最大缺失值数量)的索引
    print(most_missing_column)
    data = data.drop(most_missing_column, axis = 1)
    print(data)
    

(3)转换为张量格式

由于inputs和outputs为DataFrame形式,要获取数值内容,需要先转换为numpy数组。

Python默认使用64位浮点数,但是对于深度学习而言比较慢,之后需要转换为32位浮点数。

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

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

相关文章

高校物品捐赠管理系统|基于springboot高校物品捐赠管理系统设计与实现(源码+数据库+文档)

高校物品捐赠管理系统目录 目录 基于springboot高校物品捐赠管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、捐赠信息管理 3、论坛信息管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算…

RabbitMQ讲解与整合

RabbitMq安装 类型概念 租户 RabbitMQ 中有一个概念叫做多租户,每一个 RabbitMQ 服务器都能创建出许多虚拟的消息服务器,这些虚拟的消息服务器就是我们所说的虚拟主机(virtual host),一般简称为 vhost。 每一个 vhos…

NLP-词向量、Word2vec

Word2vec Skip-gram算法的核心部分 我们做什么来计算一个词在中心词的上下文中出现的概率? 似然函数 词已知,它的上下文单词的概率 相乘。 然后所有中心词的这个相乘数 再全部相乘,希望得到最大。 目标函数(代价函数&#xff0…

如何用CDH+Apache DolphinScheduler开启Kerberos

搭建环境 多台linux主机搭建集群CDH 6.3.2 (Parcel)版本Apache DolphinScheduler1.3.2版本,本流程在CDH已搭建完成并可正常使用后,开启kerberos功能,Apache DolphinScheduler用于大数据任务管理与执行,是很不错的任务调度平台&am…

ZYNQ--MIG核配置

文章目录 MIG核配置界面多通道AXI读写DDR3MIG核配置界面 Clock Period: DDR3 芯片运行时钟周期,这个参数的范围和 FPGA 的芯片类型以及具体类型的速度等级有关。本实验选择 1250ps,对应 800M,这是本次实验所采用芯片可选的最大频率。注意这个时钟是 MIG IP 核产生,并输出给…

压缩视频大小的软件有哪些?5款软件推荐

压缩视频大小的软件有哪些?随着高清摄像设备的普及和网络速度的不断提升,视频文件变得越来越庞大,动辄数百兆甚至数GB的大小常常让用户在分享和存储时感到头疼。幸运的是,市面上有许多优秀的视频压缩软件可以帮助我们轻松应对这一…

NFS服务器挂载失败问题

问题 mount.nfs: requested NFS version or transport protocol is not supported背景:现在做嵌入式开发,需要在板端挂载服务器,读取服务器文件。挂载中遇到该问题。 挂载命令长这样 mount -t nfs -o nolock (XXX.IP):/mnt/disk1/zixi01.ch…

vue实现水印功能

目录 一、应用场景 二、实现原理 三、详细开发 1.水印的实现方式 2.防止用户通过控制台修改样式去除水印效果(可跳过,有弊端) 3.水印的使用 (1)单页面/全局使用 (2)全局使用个别页面去掉…

绘制窗口及窗口位置变化

为了方便窗口的移动 ,及相交窗口关闭之后被遮挡窗口的重绘,因此给每个窗口建立一个内存BUF,等到不涉及内容变更的重绘,只需要将该BUF复制到显存之中。 然而,重绘时存在一个被遮挡时如何操作的问题。比如下图中依次为从…

【QT+JS】QT和JS 中的正则表达式 、QT跑JS语言

【QTJS】QT和JS 中的正则表达式 、QT跑JS语言 前言正则表达式QT 中的使用QRegExp自带的cap方法怎么用?QRegExp的非贪婪模式与贪婪模式 JS 中的使用 QT 跑JS 语言 前言 在看大佬的系统代码时候,对其中灵活用到的正则表达式和QT 跑JS 语言部分感觉很陌生&…

iOS App冷启动优化:二进制重排

原理 二进制文件中方法的加载顺序, 取决于方法在代码文件中的书写顺序,而不是调用顺序。 应用程序启动时会调用到的方法是有限的,但可能分散在很多个。 由于内存是分页管理的,要加载就要 整页加载。 这就导致很多完全还用不到的方…

网站添加pwa操作和配置manifest.json后,没有效果排查问题

pwa技术官网:https://web.dev/learn/pwa 应用清单manifest.json文件字段说明:https://web.dev/articles/add-manifest?hlzh-cn Web App Manifest:Web App Manifest | MDN 当网站添加了manifest.json文件后,也引入到html中了&a…

FPGA-FIF0模型与应用场景(IP核)

什么是FIFO FIFO (First In First Out) ,也就是先进先出。FPGA或者ASIC中使用到的FIFO一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存或者高速异步数据的交互。它与普通存储器的区别是没有外部读写地址线,这样使用起来相对简单,但缺点就是只能顺序写…

python脚本实现全景站点欧拉角转矩阵

效果 脚本 import numpy as np import math import csv import os from settings import *def euler_to_rotation_matrix(roll, pitch, yaw):# 计算旋转矩阵# Z-Y-X转换顺序Rz

java多线程编程(学习笔记)入门

一、多线程创建的三种方式 (1)通过继承Thread本身 (2)通过实现runnable接口 (3)通过 Callable 和 Future 创建线程 其中,前两种不能获取到编程的结果,第三种能获取到结果 二、常见的成员方法 方法名称说明String getName()返回此线程的名称void setNam…

Docker之数据卷自定义镜像

文章目录 前言一、数据卷二、自定义镜像 前言 Docker提供了一个持久化存储数据的机制,与容器生命周期分离,从而带来一系列好处: 总的来说Docker 数据卷提供了一种灵活、持久、可共享的存储机制,使得容器化应用在数据管理方面更加…

Git 指令深入浅出【3】—— 远程仓库

Git 指令深入浅出【3】—— 远程仓库 一、远程仓库(一)基本指令1. 配置 SSH 密钥2. 推送远程仓库其他分支推送远程仓库方法1方法2建立分支链接 方法3 3. 合并分支请求 (二).gitignore 忽略文件(三)标签管理…

MVCC【重点】

参考链接 [1] https://www.bilibili.com/video/BV1YD4y1J7Qq/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source0cb0c5881f5c7d76e7580fbd2f551074 [2]https://www.cnblogs.com/jelly12345/p/14889331.html [3]https://xiaolincoding.com/mysql…

基于频率增强的数据增广的视觉语言导航方法(VLN论文阅读)

基于频率增强的数据增广的视觉语言导航方法(VLN论文阅读) 本文提出的方法很简单,将原始图像增加其他随机图像的高频信息,得到增强的图像作为新的样本,与原始的样本交替训练。背后的动机是,vln模型对高频信息…

TV-SAM 新型零样本医学图像分割算法:GPT-4语言处理 + GLIP视觉理解 + SAM分割技术

TV-SAM 新型零样本医学图像分割算法:GPT-4语言处理 GLIP视觉理解 SAM分割技术 提出背景TV-SAM 方法论 提出背景 论文:https://arxiv.org/ftp/arxiv/papers/2402/2402.15759.pdf 代码:https://github.com/JZK00/TV-SAM 利用了GPT-4的强大语…