Pytorch基础:张量Tensor
2024-01-09 22:43:28
Pytorch基础:张量Tensor
1. 张量类(Tensor)
张量类(Tensor)是深度学习框架必须提供的基础数据结构,神经网络的前向传播和反向传播都是基于 Tensor 类进行的。Tensor 类应具有以下多方面的功能:
- Tensor 应该具有不同的数值类型,以满足不同的精度需求。
- Tensor 的维度应该可以索引、改变。
- 不同类型的 Tensor 之间应可以相互转换。
- Tensor 应该支持常见的数值计算,比如加、减、乘、除。
- Tensor 的设备应该可以在 CPU 和 GPU 之间切换。
2. 数值类型
数据类型 | CPU | GPU |
---|---|---|
32位浮点数 | torch.FloatTensor | torch.cuda.FloatTensor |
64位浮点数 | torch.DoubleTensor | torch.cuda.DoubleTensor |
8位有符号整型 | torch.CharTensor | torch.cuda.CharTensor |
8位无符号整型 | torch.ByteTensor | torch.cuda.ByteTensor |
布尔类型 | torch.BoolTensor | torch.cuda.BoolTensor |
3. 创建方法
3.1 从内置数据类型创建
>>> import torch
>>>
>>> x1=[1,2,3]
>>> x1_tensor=torch.tensor(x1,dtype=torch.int32)
>>> print(x1_tensor)
tensor([1, 2, 3], dtype=torch.int32)
>>>
>>> x1_tensor2=torch.tensor([4,5,6],dtype=torch.int32)
>>> print(x1_tensor2)
tensor([4, 5, 6], dtype=torch.int32)
>>>
>>>
>>> x2 = torch.Tensor([7,8,9])
>>> print(x2,x2.dtype)
tensor([7., 8., 9.]) torch.float32 //默认为torch.float32类型
>>>
3.2 从numpy创建
>>> import numpy as np
>>> x2_numpy=np.array([1,2,3])
>>> x2.tensor=torch.from_numpy(x2_numpy)
>>> x2_tensor=torch.from_numpy(x2_numpy)
>>> print(x2_tensor)
tensor([1, 2, 3], dtype=torch.int32)
>>>
3.3 从已有Tensor创建新的Tensor
接着上面的,直接复制Tensor,但是新的Tensor与旧Tensor只是形状相同,数值却是使用特定的数值进行填充的。
>>> x3_tensor=torch.ones_like(x2_tensor)
>>> print(x3_tensor)
tensor([1, 1, 1], dtype=torch.int32)
3.4 创建随机值或特定值的Tensor
>>> size=[1,3]
>>> x4_tensor=torch.randn(size)
>>> x5_tensor=torch.zeros(size)
>>> print(x4_tensor)
tensor([[-0.0643, 0.8212, 0.1565]])
>>> print(x5_tensor)
tensor([[0., 0., 0.]])
>>>
4. 类型转换
>>> x=torch.tensor([1,2,3],dtype=torch.int32)
>>> print(x.dtype)
torch.int32
>>> x=x.half()
>>> print(x.dtype)
torch.float16
>>> x=x.float()
>>> print(x.dtype)
torch.float32
>>> x=x.double()
>>> print(x.dtype)
torch.float64
>>>
5. 维度分析
>>> x= torch.randn(1,3,4,4)
>>> print("ndimension:",x.ndimension()) //张量的维度
ndimension: 4
>>> print("nelement:",x.nelement()) //张量包含的元素总数
nelement: 48
>>> print("size",x.size()) //张量的尺寸信息
size torch.Size([1, 3, 4, 4])
>>> print("shape:",x.shape) //
shape: torch.Size([1, 3, 4, 4])
>>>
>>> x_view=x.view(1,3,4*4)
>>> print("x_view:",x_view.size())
x_view: torch.Size([1, 3, 16])
>>>
>>> x_view=x.view(1,-1)
>>> print("x_view:",x_view.size()) //view的一个参数是-1,pytorch会根据其他维度自动计算这一维度的大小
x_view: torch.Size([1, 48])
>>>
//====transpose方法,将2行3列的张量变换成3行2列的张量
>>> x= torch.randn(2,3)
>>> print(x)
tensor([[-0.7116, 1.0912, -1.3217],
[ 0.1371, -0.6021, -0.9689]])
>>> x_trans=x.transpose(1,0)
>>> print(x_trans)
tensor([[-0.7116, 0.1371],
[ 1.0912, -0.6021],
[-1.3217, -0.9689]])
>>>
//=======squeeze删除1维度,此时张量的数据内容不变
>>> x=torch.randn(1,3,16,16)
>>> x=x.squeeze(0)
>>> print(x.size())
torch.Size([3, 16, 16])
//=======squeeze增加1维度,此时张量的数据内容不变
>>> x=x.unsqueeze(0)
>>> print(x.size())
torch.Size([1, 3, 16, 16])
>>>
6. 常用操作
6.1 获取Tensor存储地址
>>> x= torch.tensor([1,2])
>>> y=torch.tensor([1,2])
>>> z=y.clone() //地址不同
>>> q=y.detach() //地址相同
//=====通过clone 方法获得的张量与原始张量的内存地址是不同的,通过detach方法获得的张量与原始张量的内存地址是相同的。
>>> print(x.data_ptr())
5447746589376
>>> print(y.data_ptr())
5447746589312
>>> print(z.data_ptr())
5447746589632
>>> print(q.data_ptr())
5447746589312
6.2 切片索引
>>> x=torch.tensor([1,2,3,4,5])
>>> print(x[1:3]) //获取1~3数值
tensor([2, 3])
>>> print(x[:]) //获取全部数值
tensor([1, 2, 3, 4, 5])
>>> print(x[-1]) //获取最后一个数值
tensor(5)
6.3 拼接不同的Tensor
- torch.cat 函数提供了拼接不同 Tensor 的功能,它需要指定两个参数,第一个参数 tensors 表示需要拼接的所有 Tensor 对象,第二参数 dim 表示在哪个维度上进行拼接。
- 在拼接不同的 Tensor 时,需要保证各 Tensor 除堆叠维度外其他维度是一致的,否则无法完成拼接。
>>> x1=torch.tensor([1,2])
>>> x2=torch.tensor([3,4])
>>> x3=torch.tensor([5,6])
>>>
>>> x_cat=torch.cat(tensors=(x1,x2,x3),dim=0)
>>> print(x_cat)
tensor([1, 2, 3, 4, 5, 6])
6.4 四则运算
6.4.1 torch.add 和 torch.sub
>>> x1=torch.tensor([[1,2],[3,4]])
>>> x2=torch.tensor([[1,2],[3,4]])
>>> print(torch.add(x1,x2))
tensor([[2, 4],
[6, 8]])
>>> print(torch.sub(x1,x2))
tensor([[0, 0],
[0, 0]])
>>>
6.4.2 inplace 原地加减法
>>> x1=torch.tensor([[1,2],[3,4]])
>>> x2=torch.tensor([[1,2],[3,4]])
>>> print(x1.add_(x2))
tensor([[2, 4],
[6, 8]])
>>> print(x1.sub_(x2))
tensor([[0, 0],
[0, 0]])
6.4.3 x1 + x2(将调用重载的加法运算符)
>>> x1=torch.tensor([[1,2],[3,4]])
>>> x2=torch.tensor([[1,2],[3,4]])
>>> print(x1+x2+x1+x2)
tensor([[ 4, 8],
[12, 16]])
6.5 逐元素乘法和矩阵乘法
>>> x1=torch.tensor([[1,2],[3,4]])
>>> x2=torch.tensor([[1,2],[3,4]])
>>> print(torch.mul(x1,x2))
tensor([[ 1, 4],
[ 9, 16]])
>>> print(torch.mm(x1,x2))
tensor([[ 7, 10],
[15, 22]])
文章来源:https://blog.csdn.net/weixin_38566632/article/details/135444840
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!