热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

动手学深度学习Pytorch(一)——数据操作与预处理

文章目录1.数据操作的实现1.1创建张量1.2张量的属性1.3张量的操作1.4节省内存2.数据预处理参考资料张量(tensor)比Numpy的ndarr


文章目录

  • 1. 数据操作的实现
    • 1.1 创建张量
    • 1.2 张量的属性
    • 1.3 张量的操作
    • 1.4 节省内存
  • 2. 数据预处理
  • 参考资料

张量(tensor)比Numpy的ndarray多一些重要功能。张量表示一个数组组成的数组。


  • (1)GPU很好地支持加速计算,而Numpy仅支持CPU计算。
  • (2)张量类支持自动微分。

1. 数据操作的实现

首先需要导入torch:

import torch

1.1 创建张量

有四种方式可以创建张量。


  • 创建随机张量:rand(), randn(), empty()
  • 创建指定类型张量:zeros(), ones(), arange()+reshape()
  • 利用列表创建张量:torch.tensor([ ])
  • 基于已知tensor创建tensor:torch.randn_like()

(1)创建随机张量


  • randn
    利用torch.randn(x,y)创建随机张量。

torch.randn(2,3)

tensor([[ 0.0422, 0.8539, 0.6049],
[ 0.1894, -0.2011, 0.9607]])



  • rand
    利用torch.rand(x,y)创建随机张量。

torch.rand(5,3)

tensor([[0.3854, 0.9028, 0.6086],
[0.5852, 0.8518, 0.0370],
[0.0108, 0.4854, 0.4645],
[0.1960, 0.2920, 0.4442],
[0.3127, 0.3314, 0.8453]])



  • empty

torch.empty(5,3

tensor([[9.0919e-39, 8.4490e-39, 9.6429e-39],
[8.4490e-39, 9.6429e-39, 9.2755e-39],
[1.0286e-38, 9.0919e-39, 8.9082e-39],
[9.2755e-39, 8.4490e-39, 1.0194e-38],
[9.0919e-39, 8.4490e-39, 9.9184e-39]])


(2)创建指定类型张量


  • arange + reshape
    利用torch.arrange(n)创建大小为n的从0到N-1的一维张量。在使用reshape()函数改变张量结构。

x = torch.arange(12)
print(x)
X = x.reshape(3,4)
print(X)

tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])



  • zeros(), ones()
    创建指定结构的全为0或者全为1的张量。

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

tensor([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]]])


(3)利用列表创建张量

torch.tensor([[1,2,3],[3,2,1]])

tensor([[1, 2, 3],
[3, 2, 1]])


(4)利用已知张量创建新的张量
torch.randn_like(tensor_x)
创建一个与张量x结构一样的新随机张量。

x = torch.randn_like(x)
x

tensor([[-1.7494, -0.3668, 0.4855],
[ 0.2274, -1.2627, 1.3266],
[-1.6725, 0.0836, -0.9513],
[ 1.0386, 0.5378, -0.4176],
[-0.0559, 0.3609, -0.4307]])



1.2 张量的属性


  • shape:返回张量的形状。
  • numel():返回张量内部元素的总数。

(1)tensor.shape
利用shape访问张量的形状。tensor.shape会返回形状列表。可以通过[0],[1]对列表的访问得到行列的大小。

X = torch.arange(12, dtype=torch.float32).reshape((3,4))
X.shape
X.shape[0]

torch.Size([3, 4])
3


(2)tensor.numel()
numel()函数可以获得张量内部的元素总数。

X.numel()

12



1.3 张量的操作


  • 改变形状:reshape(), view()
  • 张量的拼接:cat()
  • 张量求和:sum()
  • 转变为numpy:numpy(),from_numpy()

(1)改变形状


  • view():返回的新的tensor和源tensor共享内存。
    在这里插入图片描述
  • reshape():返回的新的tensor是原tensor的副本。

(2)张量的拼接
torch.cat((X,Y), dim = 0/1)。


  • dim=0dim = 0dim=0时,XY可以按行拼接,此时XY的列数需要有相同的列数。
  • dim=1dim=1dim=1时,XY可以按列拼接,此时XY需要有相同的行数。

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

tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
tensor([[2., 1., 4., 3.],
[1., 2., 3., 4.],
[4., 3., 2., 1.]])
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.]])


(3)张量求和
利用.sum(dim = 0/1)‘计算张量的和。


  • 不考虑dim值时,返回张量中的所有元素求和。
  • dim=0dim=0dim=0时,是将每列元素求和,返回行向量。
  • dim=1dim=1dim=1时,是将每行元素求和,返回列向量。

X.sum(0)
X.sum(1)

tensor([12., 15., 18., 21.])
tensor([ 6., 22., 38.])


(4)转换为numpy
使用numpy()将tensor转换为Numpy,使用torch.from_numpy()将numpy转换为tensor。

A = B.numpy()

1.4 节省内存

运行一些操作可能会导致为新结果分配内存。当我们用Y = X + Y时,我们取消引用Y指向的张量,而是指向新分配的内存处的张量。为了节省内存,我们希望操作原地执行这些更新。因此可以使用切片法表示先前分配的数组。

Y = X + Y # 新分配内存
Y[:] = X + Y # 先前分配的数组

2. 数据预处理

(1)缺失值处理


  • 数值型:fillna()、删除。
  • 非数值型:删除、get_dummies(dummy_na=True)。

参考资料

[1]跟着李沐学AI:https://space.bilibili.com/1567748478/channel/seriesdetail?sid=358497
[2]课程资料:https://zh-v2.d2l.ai/chapter_preliminaries/ndarray.html


推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • Window10+anaconda+python3.5.4+ tensorflow1.5+ keras(GPU版本)安装教程 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
author-avatar
wuli空空以空空
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有