测试环境版本:
torch1.7.1 + CPU

python 3.6

Tensor是pytorch中的“张量”,可以看作是类似numpy的矩阵
本文介绍如何创建与调整Tensor

参考书目: 《深度学习框架pytorch: 入门与实践》陈云著

首先引用torch:

import torch as t

1、创建tensor

1)使用Tensor函数创建tensor

# 1 指定形状
a = t.Tensor(2,3)
a # 数值取决于内存空间的状态
tensor([[0., 0., 0.],[0., 0., 0.]])

2) torch.tensor()创建Tensor

本部分内容来自于pytorch官方文档:torch.tensor()

注意与torch.Tensor相区分,后者为构造函数。

torch.tensor(data, *, dtype=None, device=None, requires_grad=False, pin_memory=False) → Tensor
参数说明:

  • data (类似数组的数据) – 该数据用于对Tensor进行初始化. 可以是list(列表), tuple(元组), NumPy ndarray(numpy多维数组), scalar(标量), 以及其他很多类型的数据
  • dtype (生成的张量类型) 若该参数缺省,则与data的类型保持一致。
  • device 标识张量在哪种CPU/CUDA设备上运算的标识
  • requires_grad (bool类型) – 若为True,张量会记录其进行的操作。
import torch as tarr1 = [1.0,2.0]
a = t.tensor(arr1,requires_grad=True)

note: 这里的arr1必须是浮点数,否则会报错。(想想为什么?)

print(a)
arr1[0] = 2
print(a)
tensor([1., 2.], requires_grad=True)
tensor([1., 2.], requires_grad=True)

torch.tensor()创建的张量时为深度拷贝,与原对象不共用内存。

复杂的参数可以这样写:

t.tensor([[ 0.1111, 0.2222, 0.3333]], dtype=torch.float64, device=‘cuda:0’)

2)用list列表为参数创建

b = t.Tensor([[1,2],[3,4]])
b
tensor([[1., 2.],[3., 4.]])

`tensor也可以转化为list

ls = b.tolist()
ls
[[1.0, 2.0], [3.0, 4.0]]

3)用torch.size为参数

首先torch.Size是Tensor的参数

b_size = b.size()
b
tensor([[1., 2.],[3., 4.]])
b_size
torch.Size([2, 2])
type(b_size)
torch.Size
c = t.Tensor(b_size)
c
tensor([[ 4.0000e+00,  0.0000e+00],[-1.2593e+13,  4.5911e-41]])

Tensor.shape等价于Tensor.size()

c.shape
torch.Size([2, 2])

需要注意:使用Tensor(*sizes)创建Tensor时系统仅会检查剩余空间是否够用,但不会真的分配空间
只有创建的tensor被使用时才分配空间

2、其他常用创建方法

1)只含1的tensor

t.ones(2,3)
tensor([[1., 1., 1.],[1., 1., 1.]])

2)只含0的tensor

t.zeros(2,3)
tensor([[0., 0., 0.],[0., 0., 0.]])

3) 递增数列

t.arange(0,10,2)
tensor([0, 2, 4, 6, 8])
t.linspace(0,15,3) # 0到15均匀分割成3份
tensor([ 0.0000,  7.5000, 15.0000])
t.linspace(20,-5,5)
tensor([20.0000, 13.7500,  7.5000,  1.2500, -5.0000])

4) 均匀分布随机数

t.rand(2,3,4)
tensor([[[0.0350, 0.1746, 0.5931, 0.9241],[0.1791, 0.2205, 0.1145, 0.1942],[0.4908, 0.3410, 0.2910, 0.5894]],[[0.3705, 0.1012, 0.6324, 0.6196],[0.3016, 0.7018, 0.1615, 0.2207],[0.4301, 0.2420, 0.2793, 0.2108]]])

5) 正态分布随机数

t.randn(2,3)
tensor([[ 0.1970,  0.7628,  1.0303],[ 0.6061, -2.3474, -0.1140]])

6)随机排列

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

7) 对角线为1的矩阵

t.eye(3,4)
tensor([[1., 0., 0., 0.],[0., 1., 0., 0.],[0., 0., 1., 0.]])

不要求为方阵

2、调整tensor形状

1) tensor.view

tensor.view可以修改tensor的形状,但是

  • 新tensor与原tensor共享内存
  • 新tensor与原tensor必须保证元素个数相同
a = t.ones(2,3)
b = a.view(1,6)
print("a为:")
print(a)
print("b为:")
print(b)
a为:
tensor([[1., 1., 1.],[1., 1., 1.]])
b为:
tensor([[1., 1., 1., 1., 1., 1.]])

由共享内存可知,一个tensor的改变也会改变另一个tensor

a[0][0] = 0
b
tensor([[0., 1., 1., 1., 1., 1.]])

2)tensor.squeeze() 删除维度

将元素个数为1的维度删去

object.squeeze()以及t.squeeze()会将长度为1的维度抹去(或者称为“降维?”)

c = t.randn(1,3,4,1)
c.shape
torch.Size([1, 3, 4, 1])
d = c.squeeze()
d.shape
torch.Size([3, 4])
d = t.squeeze(c)
print("原矩阵形状")
print(c.shape)
print("压缩后形状")
print(d.shape)
原矩阵形状
torch.Size([1, 3, 4, 1])
压缩后形状
torch.Size([3, 4])

object.squeeze(n)会将第n维删去
但如果第n维不止一个元素操作无效

print("删去第2维:")
print(c.squeeze(2).shape)
print("删去第3维:")
print(c.squeeze(3).shape)
删去第2维:
torch.Size([1, 3, 4, 1])
删去第3维:
torch.Size([1, 3, 4])

3)tensor.unsqueeze()

object.squeeze(n)在第n维上插入一个
这里的n不可省略

print("原矩阵形状:")
c.shape
原矩阵形状:torch.Size([1, 3, 4, 1])
print("增加第1维:")
c.unsqueeze(1).shape
增加第1维:torch.Size([1, 1, 3, 4, 1])
print("原矩阵形状:")
c.shape
原矩阵形状:torch.Size([1, 3, 4, 1])
print("增加第2维:")
c.unsqueeze(2).shape
增加第2维:torch.Size([1, 3, 1, 4, 1])
c = t.Tensor([[[2]]])

squeeze()与unsqueeze()后的对象与原对象共享内存

d = c.squeeze()
e = c.unsqueeze(2)
c[0][0][0] = 1
print(d)
print(e)
tensor(1.)
tensor([[[[1.]]]])

4) tensor.resize()

c = t.arange(1,10)
c
tensor([1, 2, 3, 4, 5, 6, 7, 8, 9])

数据量不变的话,和view没有什么区别
resize()会有弃用提醒,所以这里使用resize_()

c.resize_(3,3)
tensor([[0, 2, 3],[4, 5, 6],[7, 8, 9]])

如果元素个数改变,填充和删除都是按“Z”字形

c.resize_(2,2)
tensor([[0, 2],[3, 4]])
c.resize_(4,4)
tensor([[                0,                 2,                 3,4],[                5,                 6,                 7,8],[                9, 32651548277538908, 27303553780220005,28992339220037731],[32651492442964069, 29273822787141743, 29555280582738012,26740621010600046]])

pytorch: Tensor的创建与调整相关推荐

  1. pytorch Tensor及其基本操作

    转自: https://zhuanlan.zhihu.com/p/36233589 由于之前的草稿都没了,现在只有重写-. 我好痛苦 本章只是对pytorch的常规操作进行一个总结,大家看过有脑子里有 ...

  2. PyTorch的六个学习率调整

    本文截取自<PyTorch 模型训练实用教程>,获取全文pdf请点击:https://github.com/tensor-yu/PyTorch_Tutorial 文章目录 一.pytorc ...

  3. 【PyTorch】lr_scheduler.StepLR==>调整学习率的方法

    lr_scheduler.StepLR class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoc ...

  4. python numpy.arry, pytorch.Tensor及原生list相互转换

    文章目录 python numpy.arry, pytorch.Tensor及原生list相互转换 1 原生list转numpy list 2 numpy.array 转原生list 3 numpy. ...

  5. 从头开始写STM32F103C8T6驱动库(一)——STM32CubeMX创建并调整工程结构

    系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...

  6. pytorch tensor求向量的模长

    想要求pytorch tensor中某个2048维度的向量的模长,可以先相乘,然后再用sum求和. 假设 v是一个2048维的向量,则可以利用一下两个语句求出模长的平方. sq = v * vsum_ ...

  7. PyTorch Tensor 的形状

    PyTorch Tensor 的形状 标量 (Scalar) 向量 (Vector) 矩阵 (Matrix) 图片展示 标量 (Scalar) 标量 (Scalar) 由一个值组成. (0维) # S ...

  8. 3dmax基础教程:聚光灯的创建及调整方式

    聚光灯具有一定的照射范围和照射角度,会被物体所遮蔽而产生阴影效果.本教程属于3dmax的基础知识:针对聚光灯的创建及调整方式进行了具体介绍,主要从聚光灯的创建.聚光灯的调整方式两个方面进行讲解. 一. ...

  9. Pytorch - 使用opencv-python解码视频文件并将视频帧转换为Pytorch tensor作为网络模型输入数据

    1 视频文件作为网络模型的输入数据 越来越多的神经网络模型开始以视频作为训练数据,比如基于视频数据的行为识别等等,这就需要我们将视频转换为可适用的张量,本文将以pytorch为例,展示一下视频数据转换 ...

最新文章

  1. Connection closed by foreign host无法连接linux
  2. linux查找日志技巧
  3. OpenGL透视投影函数gluPerspective的参数含义之解析(图示)
  4. OpenStack发布最新版本Ocata
  5. JQuery实现树的功能doc
  6. 21天学通HTML5和CSS3第二版,21天学通HTML5+CSS3
  7. 【Linux】工作管理
  8. 访问被拒绝:“microsoft.web.ui.webcontrols”的解决办法
  9. .NET Core中的CSV解析库
  10. 面试官:Java中线程是按什么顺序执行的?
  11. iOS App打包上架超详细流程1
  12. mgr未同步 mysql_MySQL MGR--数据同步原理
  13. 生物医学数据统计分析-回归分析
  14. 开关电源中的电感电容
  15. win10玩cf如何调全屏_穿越火线:WIN10系统烟雾头和画面卡顿解决办法
  16. 爬虫入门(3)——拉钩网
  17. [BJWC2008]雷涛的小猫 dp
  18. 深度学习第一次作业 - 波士顿房价预测
  19. 人机猜拳代码python_python 实现人和电脑猜拳的示例代码
  20. 关于微信小程序开发个人总结

热门文章

  1. EF架构~DefaultValue让我的UnitOfWork更可读
  2. Learning Modern 3D Graphics Programming笔记
  3. eclipse代码编辑区字符串自动转义设置
  4. SK海力士与电装四巨头论半导体供给
  5. oracle分区唯一索引,关于分区表与唯一索引的测试记录
  6. 暴力 ZOJ 1403 Safecracker
  7. python跳一跳编程构造_python实现微信跳一跳辅助工具步骤详解
  8. Android中Parcelable与Serializable接口用法
  9. POJO中使用ThreadLocal实现Java嵌套事务
  10. 【转】MongoDB介绍及下载与安装