浅谈pytorch中stack和cat的及to_tensor的坑
作者:kellen_f 发布时间:2022-12-14 11:53:23
初入计算机视觉遇到的一些坑
1.pytorch中转tensor
x=np.random.randint(10,100,(10,10,10))
x=TF.to_tensor(x)
print(x)
这个函数会对输入数据进行自动归一化,比如有时候我们需要将0-255的图片转为numpy类型的数据,则会自动转为0-1之间
2.stack和cat之间的差别
stack
x=torch.randn((1,2,3))
y=torch.randn((1,2,3))
z=torch.stack((x,y))#默认dim=0
print(z.shape)
#torch.Size([2, 1, 2, 3])
所以stack的之后的数据也就很好理解了,z[0,...]的数据是x,z[1,...]的数据是y。
cat
z=torch.cat((x,y))
print(z.size())
#torch.Size([2, 2, 3])
cat之后的数据 z[0,:,:]是x的值,z[1,:,:]是y的值。
其中最关键的是stack之后的数据的size会多出一个维度,而cat则不会,有一个很简单的例子来说明一下,比如要训练一个检测模型,label是一些标记点,eg:[x1,y1,x2,y2]
送入网络的加上batchsize则时Size:[batchsize,4],如果我已经有了两堆数据,data1:Size[128,4],data2:Size[128,4],需要将这两个数据合在一起的话目标data:Size[256,4]。
显然我们要做的是:torch.cat((data1,data2))
如果我们的数据是这样:有100个label,每一个label被放进一个list(data)中,[[x1,y1,x2,y2],[x1,y1,x2,y2],...]其中data是一个list长度为100,而list中每一个元素是张图片的标签,size为[4]我们需要将他们合一起成为一Size:[100,4]的的数据。
显然我们要做的是torch.stack(data)。而且torch.stack的输入参数为list类型!
补充:pytorch中的cat、stack、tranpose、permute、unsqeeze
pytorch中提供了对tensor常用的变换操作。
cat 连接
对数据沿着某一维度进行拼接。cat后数据的总维数不变。
比如下面代码对两个2维tensor(分别为2*3,1*3)进行拼接,拼接完后变为3*3还是2维的tensor。
代码如下:
import torch
torch.manual_seed(1)
x = torch.randn(2,3)
y = torch.randn(1,3)
print(x,y)
结果:
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x3]
-1.5228 0.3817 -1.0276
[torch.FloatTensor of size 1x3]
将两个tensor拼在一起:
torch.cat((x,y),0)
结果:
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
-1.5228 0.3817 -1.0276
[torch.FloatTensor of size 3x3]
更灵活的拼法:
torch.manual_seed(1)
x = torch.randn(2,3)
print(x)
print(torch.cat((x,x),0))
print(torch.cat((x,x),1))
结果
// x
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x3]// torch.cat((x,x),0)
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 4x3]// torch.cat((x,x),1)
0.6614 0.2669 0.0617 0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661 0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x6]
stack,增加新的维度进行堆叠
而stack则会增加新的维度。
如对两个1*2维的tensor在第0个维度上stack,则会变为2*1*2的tensor;在第1个维度上stack,则会变为1*2*2的tensor。
见代码:
a = torch.ones([1,2])
b = torch.ones([1,2])
c= torch.stack([a,b],0) // 第0个维度stack
输出:
(0 ,.,.) =
1 1(1 ,.,.) =
1 1
[torch.FloatTensor of size 2x1x2]
c= torch.stack([a,b],1) // 第1个维度stack
输出:
(0 ,.,.) =1 1
1 1
[torch.FloatTensor of size 1x2x2]
transpose ,两个维度互换
代码如下:
torch.manual_seed(1)
x = torch.randn(2,3)
print(x)
原来x的结果:
0.6614 0.2669 0.0617
0.6213 -0.4519 -0.1661
[torch.FloatTensor of size 2x3]
将x的维度互换
x.transpose(0,1)
结果
0.6614 0.6213
0.2669 -0.4519
0.0617 -0.1661
[torch.FloatTensor of size 3x2]
permute,多个维度互换,更灵活的transpose
permute是更灵活的transpose,可以灵活的对原数据的维度进行调换,而数据本身不变。
代码如下:
x = torch.randn(2,3,4)
print(x.size())
x_p = x.permute(1,0,2) # 将原来第1维变为0维,同理,0→1,2→2
print(x_p.size())
结果:
torch.Size([2, 3, 4])
torch.Size([3, 2, 4])
squeeze 和 unsqueeze
常用来增加或减少维度,如没有batch维度时,增加batch维度为1。
squeeze(dim_n)压缩,减少dim_n维度 ,即去掉元素数量为1的dim_n维度。
unsqueeze(dim_n),增加dim_n维度,元素数量为1。
上代码:
# 定义张量
import torch
b = torch.Tensor(2,1)
b.shape
Out[28]: torch.Size([2, 1])
# 不加参数,去掉所有为元素个数为1的维度
b_ = b.squeeze()
b_.shape
Out[30]: torch.Size([2])
# 加上参数,去掉第一维的元素为1,不起作用,因为第一维有2个元素
b_ = b.squeeze(0)
b_.shape
Out[32]: torch.Size([2, 1])
# 这样就可以了
b_ = b.squeeze(1)
b_.shape
Out[34]: torch.Size([2])
# 增加一个维度
b_ = b.unsqueeze(2)
b_.shape
Out[36]: torch.Size([2, 1, 1])
来源:https://blog.csdn.net/kellen_f/article/details/88784050


猜你喜欢
- 数据库 关键字:为了避免在数据库表结构设计过程中使用系统保留关键字我们必须知道数据库存在哪些关键字,接下来会列出mysql、oracle、s
- 首先,运行 Python 解释器,导入 re 模块并编译一个 RE:#!python Python 2.2.2 (#1, Feb 10 20
- 目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Stand ard C
- 数据库设计范式目前数据库设计有五种范式 , 一般我们数据库只需要满足前三项即可第一范式 : 确保每列保持原子性什么是原子性? 意思就是不可再
- 有时候我们在设计表单的时候不希望用户输入其它字符,只想他在input中输入数字,那么我们就可以使用下面的代码,当然这个比较是客户
- 这篇文章主要介绍了python3 反射的四种基本方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 打包成exe文件可以让python代码在没有python环境的条件下,依然能够运行,实在是码农们写追女朋友表白、情人节浪漫的必需品!1、使用
- 1.sp_helpsort SELECT SERVERPROPERTY ('Collation') 查看你的排序规则. 不过
- sklearn生成多项式import numpy as npfrom sklearn.preprocessing import Polyno
- 我就废话不多说了,还是直接看代码吧!import osimport timeimport mmapfilename = 'test.
- 本文通过实例为大家分享了python实现批量提取指定文件夹下同类型文件,供大家参考,具体内容如下代码import osimport shut
- 转自http://rookiefly.cn/detail/69作死小能手这两天闲着没事,把自己电脑重装了,然而重装过后配置开发环境踩了一些坑
- 本人曾经用过的备份方式有:mysqldump、mysqlhotcopy、BACKUP TABLE 、SELECT INTO OUTFILE,
- 原理中文分词,即 Chinese Word Segmentation,即将一个汉字序列进行切分,得到一个个单独的词。表面上看,分词其实就是那
- 增大 SGA 已经缓冲看来对于性能的提升并不显著,加载时间只提升了 1.73%。下面我们增加 SGA 重做日志的大小: DB3: Log B
- 在js方法中添加"path= 过期时间"就可以解决这个问题。 例如://写cookies function setCoo
- 如下所示:import jsonf = open("index.html", "wb")json.d
- --按日 select sum(consume),day([date]) from consume_record where year([d
- PyQt5布局控件QVBoxLayout简介采用QVBoxLayout类,按照从上到下的顺序添加控件本节内容较少,演示两个实例,便于明白QV
- 这一段要毕业,得折磨自己两个月....这段时间还是会摆弄了javascript的.大致在下面两个方面: 1.javascript的