DataWhale10月“深入浅出PyTorch”Task02打卡

ps:本文记录参与Datawhale10月“深入浅出Pytorch”的学习笔记
pss:该教程的GitHub地址:深入浅出PyTorch
哔哩哔哩视频地址:深入浅出Pytorch

1.张量(tensor)

1.1 简介

张量是现代机器学习的基础。它的核心是一个数据容器,多数情况下,它包含数字,有时候也包含字符串,但这种情况比较少。因此可以把它想象成一个数字的水桶。
在PyTorch中, torch.Tensor 是存储和变换数据的主要工具。它与NumPy的多维数组非常类似。然而,Tensor 提供GPU计算和自动求梯度等更多功能,这些使 Tensor 这一数据类型更加适合深度学习。
PyTorch中的 Tensor 支持超过一百种操作,包括转置、索引、切片、数学运算、线性代数、随机数等等,可参考PyTorch中文文档

  • 0维张量: 是一个数字,称为标量Scalar
  • 1维张量: 1维张量称为向量Vector
  • 2维张量: 2维张量称为矩阵Matrix
  • 3维张量: 可以理解为是矩阵数组,立体的

公用数据存储在张量如:时间序列数据,股价,文本数据,彩色图片(RGB)
1111
在这里插入图片描述

1.2 tensor的一些用法

1.2.1 创建tensor

  1. torch.rand(): 构建一个行列自定的矩阵,里面的数据随机,因为torch.tensor是默认的tensor类型(torch.FlaotTensor)的简称,所以随机出来的数据是浮点型.
x=torch.rand(2,3)
print(x)

输出结果:

> tensor([[0.3733, 0.7564, 0.4078],
        [0.7862, 0.6367, 0.0811]])
  1. torch.zeros() :创建矩阵全为0的矩阵

构造一个矩阵全为 0,而且数据类型是 long.

x = torch.zeros(4, 3, dtype=torch.long)
print(x)
tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
  1. dtype指定类型创建tensor
    在这里插入图片描述
  2. 直接使用数据构造一个张量
x=torch.tensor([[1.2,5.6],[1,2]])
print(x)

输出结果:

tensor([[1.2000, 5.6000],
        [1.0000, 2.0000]])
  1. torch.randn_like():复制tensor,基于一个已有的tensor创建一个大小,数据类型(内部元素是随机的所以不相等)等都相等的tenosr
x=torch.tensor([[1.2,5.6],[1,2]])
print(x)
y=torch.randn_like(x)
print(y)

输出结果:

tensor([[1.2000, 5.6000],
        [1.0000, 2.0000]])
tensor([[ 1.5941,  1.3084],
        [ 0.3106, -0.3887]])
  1. 常见的构造Tensor的函数
    在这里插入图片描述
k = torch.rand(2, 3) #创建一个2*3的float类型的随机矩阵
l = torch.ones(2, 3) #创建一个2*3,元素全为1的矩阵
m = torch.zeros(2, 3) #创建一个2*3,元素全为0的矩阵
n = torch.arange(0, 10, 2) #创建一个范围[0,10),步长为2的tensor
print(k, '\n', l, '\n', m, '\n', n)

输出结果:

tensor([[0.8868, 0.8053, 0.2448],
        [0.8655, 0.9854, 0.3839]]) 
 tensor([[1., 1., 1.],
        [1., 1., 1.]]) 
 tensor([[0., 0., 0.],
        [0., 0., 0.]]) 
 tensor([0, 2, 4, 6, 8])

注:
torch.rand():随机生成[0,1)均匀分布数据
torch.randn():生成标准状态分布数据

1.2.2 tensor的常用方法

查看tensor的维度信息
#查看tensor的行列维度信息(两种方式)
print(x.shape)
print(x.size())
print(x.ndim)#仅查看维度

输出结果:

torch.Size([2, 3])
torch.Size([2, 3])
2
一些加法操作

# 方式1
x=torch.rand(2,3) #注意得行列一致
y = torch.rand(2,3)
print(x,end='\n')
print(y,end='\n')
print(x + y)

# 方式2
print(torch.add(x, y))

# 方式3 提供一个输出 tensor 作为参数
result = torch.empty(2, 3) 
torch.add(x, y, out=result) 
print(result)

# 方式4 in-place
y.add_(x) #add()不修改自身数据,add_()修改自身数据
print(y)

输出结果:

tensor([[0.9482, 0.1593, 0.8739],
        [0.2904, 0.6314, 0.5835]])
tensor([[0.4368, 0.4753, 0.6056],
        [0.7562, 0.5373, 0.0029]])
tensor([[1.3850, 0.6347, 1.4795],
        [1.0466, 1.1687, 0.5864]])
修改Tensor形状

tensor常用修改形状的函数

函数功能
size()返回张量的shape属性值
numel(input)计算tensor的元素个数
view(*shape)修改tensor的shape,与reshap类似,但view返回的对象与源tensor共享内存,修改一个另一个也修改.
reshape则是生成新的tensor,另view(-1)展平数组
torch.unsqueeze(input, dim, out=None)扩展维度,返回一个新的张量,对输入的既定位置插入维度 1
参数说明:tensor (Tensor) 输入张量, dim (int) 插入维度的索引, out (Tensor, optional) 结果张量
torch.squeeze(input, dim=None, out=None)降低维度,与上述unsqueeze相反的操作,降维得注意索引dim是否合适

squeeze与unsqueeze的参考文章torch.unsqueeze() 和 torch.squeeze()

#生成一个形状为2x3的矩阵
x = torch.randn(2, 3)
#查看矩阵的形状
print(x.size())
print(x)
#把x变为3x2的矩阵,用y存储
y=x.view(3,2)
print(y)
print(y.size())
#把x展平为1维向量
o=x.view(-1)
print(o)
#添加一个维度
z=torch.unsqueeze(x,1)
#查看z的形状
print(z)
print(z.size())
#计算Z的元素个数
print(z.numel())   #结果为6

输出结果:

torch.Size([2, 3])
tensor([[ 0.5712, -1.3385,  1.6415],
        [ 0.6997, -0.9180, -0.2298]])
tensor([[ 0.5712, -1.3385],
        [ 1.6415,  0.6997],
        [-0.9180, -0.2298]])
torch.Size([3, 2])
tensor([ 0.5712, -1.3385,  1.6415,  0.6997, -0.9180, -0.2298])
tensor([[[ 0.5712, -1.3385,  1.6415]],

        [[ 0.6997, -0.9180, -0.2298]]])
torch.Size([2, 1, 3])
6
索引操作

tensor的索引操作与Numpy类似,一般情况下索引结果与源数据共享内存

#设置一个随机种子
torch.manual_seed(100)
#生成一个形状为2x3的矩阵
x = torch.randn(2, 3)
print(x)
#根据索引获取第1行,所有数据
print(x[0,:])
#获取最后一列数据
print(x[:,-1])
#生成是否大于0的Byter张量
mask=x>0
print(mask)
#获取大于0的值
y=torch.masked_select(x,mask)
print(y)
#获取非0下标,即行,列索引
print(torch.nonzero(mask))

输出结果:

tensor([[ 0.3607, -0.2859, -0.3938],
        [ 0.2429, -1.3833, -2.3134]])
tensor([ 0.3607, -0.2859, -0.3938])
tensor([-0.3938, -2.3134])
tensor([[ True, False, False],
        [ True, False, False]])
tensor([0.3607, 0.2429])
tensor([[0, 0],
        [1, 0]])
广播机制

“广播”指的是在不同维度的数组之间进行算术运算的一种执行机制,其通过将数据矢量化进行高效的运算,而不是按照传统的对标量数据进行循环运算达到目的,因此,“广播”是numpy一种中非常强大的功能,可以实现高效快速的矢量化数据的运算。

首先,我们对“广播”进行一个大概的理解。顾名思义,“广播”具有扩散的特点,在数组里面,它的意思是,一个数组在另外一个数组中进行某种运算的扩散,那么如何扩散呢?“广播”的一个工作原则是:两个数组的维度应该相同(即要对一个二维数组进行广播,那么用来广播的数组也应该是二维的),并且只能有一个维度的长度允许不一样,且那个不一样的维度在用来广播的数组里面的长度应该为1(比如,对于一个(3,4)的二维数组,那么用来广播的数组必须是(3,1)或(1,4);比如对于一个三维的数组(3,4,5),用来广播的数组必须是(1,4,5)或(3,1,5)或(3,4,1)),这样子,我们才说两个数组是广播兼容的。广播会在沿着长度为1的那个维度进行扩散进行。

tensor的广播机制(使用时要注意这个特性)

p = torch.arange(1, 3).view(1, 2)
print(p)
print(p.size())
q = torch.arange(1, 4).view(3, 1)
print(q)
print(q.size())
s=p+q
print(s)
print(s.size())   

输出结果:

tensor([[1, 2]])
torch.Size([1, 2])
tensor([[1],
        [2],
        [3]])
torch.Size([3, 1])
tensor([[2, 3],
        [3, 4],
        [4, 5]])
torch.Size([3, 2])

2.自动求导

记录一下自己在使用jupyter notebook上遇到的坑:
现象:先前能正常使用,突然开始出现run cell无反应,Cmd终端出现“Bad file descriptor”错误。
起初按照这篇博文解决了问题:叫你别乱动,乱动即报错。最详解:Bad file descriptor (C:\ci\zeromq_1602704446950\work\src\epoll.cpp:100)

但治标不治本,根本原因是Cmd的用户名是中文的,最后参考该博文最终解决该问题。Win10将用户名修改为英文

一把辛酸泪,甚至做了pe系统破解管理员用户的开机密码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值