一、Tensor概述
PyTorch里面处理的最基本的操作对象就是Tensor(张量),它表示的是一个多维矩阵,在使用上和numpy是对应的
Tensor的基本数据类型有五种:
- 32位浮点型:torch.FloatTensor。pyorch.Tensor()默认的就是这种类型。
- 64位整型:torch.LongTensor。
- 32位整型:torch.IntTensor。
- 16位整型:torch.ShortTensor。
- 64位浮点型:torch.DoubleTensor。
二、Tensor张量的定义
tensor基本定义
import torch
from torch import tensor
a = tensor(10)
b = torch.IntTensor([1,2,3])
c = torch.Tensor([[1, 2], [3, 4], [5, 6]])
d = tensor([[[1, 2], [3, 4], [5, 6]],[[1, 2], [3, 4], [5, 6]]])
print(a)
print(b)
print(c)
print(d)
输出结果:
tensor(10)
tensor([1, 2, 3], dtype=torch.int32)
tensor([[1., 2.],
[3., 4.],
[5., 6.]])
tensor([[[1, 2],
[3, 4],
[5, 6]],
[[1, 2],
[3, 4],
[5, 6]]])
获取tensor大小
print(d.size())
print(d.shape)
输出结果
torch.Size([2, 3, 2])
torch.Size([2, 3, 2])
获取0维tensor的值
a.item()
三、生成Tensor
定义全0的tensor
# 定义一个5行3列的全为0的矩阵
a = torch.zeros(5,3,dtype=torch.double)
print(a)
输出
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]], dtype=torch.float64)
定义随机tensor
# 定义一个5行3列的随机值矩阵
x = torch.randn(5, 3)
print(x)
输出
tensor([[ 1.3276, 1.0624, -1.3002],
[-0.8084, 1.0612, -0.9558],
[ 1.2273, -0.0903, -0.9187],
[-0.2024, 0.0736, -1.3670],
[ 2.6466, 0.2927, 0.1307]])
定义未初始化数据的张量
# 定义未初始化数据的张量
x = torch.empty(5,3)
print(x)
输出
tensor([[1.0286e-38, 1.0653e-38, 1.0194e-38],
[8.4490e-39, 1.0469e-38, 9.3674e-39],
[9.9184e-39, 8.7245e-39, 9.2755e-39],
[8.9082e-39, 9.9184e-39, 8.4490e-39],
[9.6429e-39, 1.0653e-38, 1.0469e-38]])
# 定义未初始化数据的张量,torch.FloatTensor类型的张量
x = torch.Tensor(5, 3)
print(x)
输出
tensor([[9.9184e-39, 9.0919e-39, 1.0561e-38],
[4.2246e-39, 1.0286e-38, 1.0653e-38],
[1.0194e-38, 8.4490e-39, 1.0469e-38],
[9.3674e-39, 9.9184e-39, 8.7245e-39],
[9.2755e-39, 8.9082e-39, 9.9184e-39]])
arange方法生成tensor
torch.arange(start=0, end = 11, step=2)
输出
tensor([ 0, 2, 4, 6, 8, 10])
torch.linspace(start = 1, end = 10, steps=5)
输出
tensor([ 1.0000, 3.2500, 5.5000, 7.7500, 10.0000])
四、Numpy 数据转换
tensor转numpy格式
import torch
import numpy as np
# 定义一个3行2列的全为0的矩阵
b = torch.randn((3, 2))
# tensor转化为numpy
numpy_b = b.numpy()
print(numpy_b)
输出
[[-0.27381065 0.43861285]
[ 1.0121734 0.4847141 ]
[ 2.6019974 -0.65572333]]
numpy转tensor格式
# numpy转化为tensor
numpy_e = np.array([[1, 2], [3, 4], [5, 6]])
torch_e = torch.from_numpy(numpy_e)
print(numpy_e)
print(torch_e)
输出
[[1 2]
[3 4]
[5 6]]
tensor([[1, 2],
[3, 4],
[5, 6]], dtype=torch.int32)
五、tenso运算操作
加法
import torch
import numpy as np
x = torch.Tensor([[1, 2], [3, 4], [5, 6]])
y= torch.Tensor([[1, 2], [3, 4], [5, 6]])
print(x + y)
输出
tensor([[ 2., 4.],
[ 6., 8.],
[10., 12.]])
print(torch.add(x, y))
输出
tensor([[ 2., 4.],
[ 6., 8.],
[10., 12.]])
减法
x = torch.Tensor([[1, 2], [3, 4], [5, 6]])
y= torch.Tensor([[1, 2], [3, 4], [5, 6]])
print(x - y)
输出
tensor([[0., 0.],
[0., 0.],
[0., 0.]])
乘法
x = torch.Tensor([[1, 2], [3, 4], [5, 6]])
y= torch.Tensor([[1, 2], [3, 4], [5, 6]])
print(x * y)
输出
tensor([[ 1., 4.],
[ 9., 16.],
[25., 36.]])
除法
x = torch.Tensor([[1, 2], [3, 4], [5, 6]])
y= torch.Tensor([[1, 2], [3, 4], [5, 6]])
print(x / y)
print(torch.div(x, y))
tensor([[1., 1.],
[1., 1.],
[1., 1.]])
tensor([[1., 1.],
[1., 1.],
[1., 1.]])
六、tensor维度变换
# 转成3行4列的2维tensor
A = torch.arange(12.0).reshape(3,4)
A
输出
tensor([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.]])
## 使用torch.reshape()
torch.reshape(input = A,shape = (2,-1))
tensor([[ 0., 1., 2., 3., 4., 5.],
[ 6., 7., 8., 9., 10., 11.]])
unsqueeze方法
## torch.unsqueeze()返回在指定维度插入尺寸为1的新张量
A = torch.arange(12.0).reshape(2,6)
B = torch.unsqueeze(A,dim = 0)
B.shape
输出
torch.Size([1, 2, 6])
squeeze方法
## torch.squeeze()函数移除所有维度为1的维度
C = B.unsqueeze(dim = 3)
print("C.shape : ",C.shape)
D = torch.squeeze(C)
print("D.shape : ",D.shape)
## 移除指定维度为1的维度
E = torch.squeeze(C,dim = 0)
print("E.shape : ",E.shape)
输出
C.shape : torch.Size([1, 2, 6, 1])
D.shape : torch.Size([2, 6])
E.shape : torch.Size([2, 6, 1])
cat方法
## 在给定维度中连接给定的张量序列
A = torch.arange(6.0).reshape(2,3)
B = torch.linspace(0,10,6).reshape(2,3)
print(A)
print(B)
## 在0纬度连接张量
C = torch.cat((A,B),dim=0)
C
输出
tensor([[0., 1., 2.],
[3., 4., 5.]])
tensor([[ 0., 2., 4.],
[ 6., 8., 10.]])
tensor([[ 0., 1., 2.],
[ 3., 4., 5.],
[ 0., 2., 4.],
[ 6., 8., 10.]])
七、tensor索引
## 利用切片和索引获取张量中的元素
A = torch.arange(12).reshape(1,3,4)
A
输出
tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]])
A[0]
输出
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
## 获取第0维度下的矩阵前两行元素
A[0,0:2,:]
输出
tensor([[0, 1, 2, 3],
[4, 5, 6, 7]])
## 获取第0维度下的矩阵,最后一行-4~-1列
A[0,-1,-4:-1]
输出
tensor([ 8, 9, 10])
八、tensor统计相关的计算
## 1维张量的最大值和最小值
A = torch.tensor([12.,34,25,11,67,32,29,30,99,55,23,44])
## 最大值及位置
print("最大值:",A.max())
print("最大值位置:",A.argmax())
## 最小值及位置
print("最小值:",A.min())
print("最小值位置:",A.argmin())
输出
最大值: tensor(99.)
最大值位置: tensor(8)
最小值: tensor(11.)
最小值位置: tensor(3)
|