Day24_【深度学习(3)—PyTorch使用(1)—张量的创建和类型转换】
·
一、创建张量
1.张量基本创建方式
- torch.tensor 根据指定数据创建张量 (最重要)
- torch.Tensor 根据形状创建张量, 其也可用来创建指定数据的张量
- torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定类型的张量
1.1 torch.tensor
# 方式一:创建张量 torch.tensor
def create_tensor():
# 1.创建标量张量
data1 = torch.tensor(3)
# print(data1.ndim) # 维度:0
# print(data1)
# print(data1.shape)
# print(data1.dtype)
# 2.创建一维向量张量
data2 = torch.tensor([2, 3, 4]) # 几个数字shape就是几 torch.Size([3]) torch.int64
# print(data2,data2.shape,data2.dtype)
# print(data2.ndim) # 维度:1
# 3.创建二维向量张量
data3 = torch.tensor([[2, 3, 4], [6, 7, 8]]) # 2个样本,每个样本三个特征 torch.Size([2, 3]) torch.int64
# print(data3,data3.shape,data3.dtype)
# print(data3.ndim) # 维度:2
if __name__ == '__main__':
create_tensor()
1.2 torch.Tensor
# 方式二:创建张量 torch.Tensor
def create_Tensor():
# ctrl+p:参数提示
# 根据形状
# data=torch.Tensor(2,3)
# data=torch.tensor(2,3) #报错
# data=torch.Tensor(3)
# 根据数值
data = torch.Tensor([3, 4])
# print(data)
if __name__ == '__main__':
create_Tensor()
1.3 torch.IntTensor、torch.FloatTensor、torch.DoubleTensor
# 方式三:创建张量 torch.IntTensor
def create_IntTensor():
# 根据形状创建
# data=torch.IntTensor(3,4)
# 根据数值创建
data = torch.IntTensor([3, 4])
# 尝试小数
# data=torch.IntTensor([3.2,4.3]) #会省略小数点后
# data=torch.FloatTensor([3.2,4.3]) #tensor([3.2000, 4.3000]) torch.float32
# data=torch.DoubleTensor([3.2,4.3]) #tensor([3.2000, 4.3000], dtype=torch.float64) torch.float64
print(data, data.dtype)
if __name__ == '__main__':
create_IntTensor()
2.创建线性和随机张量
- torch.arange 和 torch.linspace 创建线性张量
- torch.random.init_seed 和 torch.random.manual_seed 随机种子设置
- torch.randn 创建随机张量
2.1 torch.arange 和 torch.linspace
arange(start,end,step) start默认0,step默认1,表示步长,包左不包右 包含0不包含10
linspace(start,end,steps) 包左且包右,steps取多少个值
# 创建线性张量
def create_arange_linspace_tensor():
arange_data=torch.arange(0,10,1)
print(arange_data,arange_data.dtype) #tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) torch.int64
lin_data=torch.linspace(0,10,5)
print(lin_data,lin_data.dtype) #tensor([ 0.0000, 2.5000, 5.0000, 7.5000, 10.0000]) torch.float32
if __name__ == '__main__':
create_arange_linspace_tensor()
2.2 torch.random.init_seed 和 torch.random.manual_seed
- torch.initial_seed()
- torch.random.initial_seed() # 与上一行一样写法
- torch.manual_seed(100)
- torch.random.manual_seed(100) # 与上一行一样写法
# 创建随机张量
def create_random_tensor():
# 创建两行三列的随机种子
data=torch.randn(2,3)
# 查看随机数种子
# print('随机数种子:', torch.initial_seed()) #值一直在变
# print('随机数种子:', torch.random.initial_seed()) # 与上一行一样写法
# 手动随机数种子设置
torch.manual_seed(100)
# torch.random.manual_seed(100) # 与上一行一样写法
data = torch.randn(2, 3)
print(data,data.dtype)
if __name__ == '__main__':
create_random_tensor()
3.创建0-1张量
- torch.ones 和 torch.ones_like 创建全1张量
- torch.zeros 和 torch.zeros_like 创建全0张量 (重要)
- torch.full 和 torch.full_like 创建全为指定值张量
这里的like是模仿数据的形状进行创建,而不是模仿值
def create_ones_zeros_full_tensor():
# 1.1 创建指定形状全1张量
# data = torch.ones(2, 3)
# print(data,data.shape,data.size()) # torch.Size([2, 3]) torch.Size([2, 3]),pytorch中shape属性和size()方法是一样的
# 1.2 根据张量形状创建全1张量
# data = torch.ones_like(data)
# print(data)
# 2.1 创建指定形状全0张量
# data=torch.zeros(2,3)
# print(data,data.dtype)
# 2.2 根据张量形状创建全0张量
# data=torch.zeros_like(data)
# print(data,data.dtype)
# 3.1 创建指定形状指定值的张量
data = torch.full([2, 3], 10)
print(data) #tensor([[10, 10, 10],[10, 10, 10]])
# 3.2 根据张量形状创建指定值的张量
data = torch.full_like(data, 20)
print(data) #tensor([[20, 20, 20],[20, 20, 20]])
if __name__ == '__main__':
create_ones_zeros_full_tensor()
二、张量的类型转换
默认类型:float32,int64

1. 张量之间的类型转换
- data.type(torch.DoubleTensor)
- data.double() (重点)
# 张量元素类型转换
def type_transform_tensor():
data=torch.full([2, 3], 10)
print(data,data.dtype) # torch.int64
# 方式一
# data1=data.type(torch.DoubleTensor)
# print(data1,data1.dtype) # torch.float64
# 方式二
data2=data.double()
print(data2,data2.dtype) #torch.float64
if __name__ == '__main__':
type_transform_tensor()
2. 张量与numpy之间的类型转换
tensor转numpy
- 方式一:通过numpy()转换为numpy,影响data_tensor的值,但可以通过data_numpy=data_tensor.numpy().copy(),深拷贝解决
- 方式二:通过np.array()转换为numpy,不影响data_tensor的值,默认不共享内存
import numpy as np
import torch
def tensor_to_numpy():
# 1.tensor转numpy
data_tensor=torch.tensor([1,2,3,4,5])
print(data_tensor) # tensor([1, 2, 3, 4, 5])
# 方式一:通过numpy()转换为numpy,影响data_tensor的值,但可以通过data_numpy=data_tensor.numpy().copy(),深拷贝解决
data_numpy=data_tensor.numpy()
print(data_numpy) # [1 2 3 4 5]
# 修改numpy的值
data_numpy[0]=200
print(data_numpy) #[200 2 3 4 5]
print(data_tensor) #tensor([200, 2, 3, 4, 5])
# 方式二:通过np.array()转换为numpy,不影响data_tensor的值
# data_numpy = np.array(data_tensor)
# print("data_numpy-->", data_numpy) # [1 2 3 4 5]
# data_numpy[0] = 200
# print("data_numpy-->", data_numpy) # [200 2 3 4 5]
# print('data_tensor-->', data_tensor) # tensor([1, 2, 3, 4, 5])
numpy转tensor
- 方式一:torch.from_numpy 默认共享内存,使用 copy 函数避免共享,解决 data_tensor = torch.from_numpy(data_numpy.copy())
- 方式2:torch.tensor 默认不共享内存
def numpy_to_tensor():
# 2.numpy转tensor
# 准备一个numpy数据
data_numpy=np.array([2,3,4])
# print(data_numpy,data_numpy.dtype) # [2 3 4] int64
# 方式一:torch.from_numpy 默认共享内存,使用 copy 函数避免共享,解决 data_tensor = torch.from_numpy(data_numpy.copy())
# data_tensor = torch.from_numpy(data_numpy)
# # print(data_tensor,data_tensor.dtype) # tensor([2, 3, 4]) torch.int64
# # 修改tensor的值,发现会影响numpy
# data_tensor[0]=200
# print(data_tensor,data_tensor.dtype) # tensor([200, 3, 4]) torch.int64
# print(data_numpy,data_numpy.dtype) # [200 3 4] int64
# 方式2:torch.tensor 默认不共享内存
data_tensor=torch.tensor(data_numpy)
data_tensor[0]=200
print(data_tensor) # tensor([200, 3, 4])
print(data_numpy) # [2 3 4]
if __name__ == '__main__':
numpy_to_tensor()
3.标量张量和数字转换(重要)
data_tensor.item()
def scalar_tensor_to_number():
# 标量转number
# data_tensor=torch.tensor(3)
# 一维向量转number
data_tensor = torch.tensor([3]) # 一个数字 (1,)
# 二维矩阵转number
# data_tensor = torch.tensor([[3]]) # 一行一列(1,1)
print(data_tensor) # tensor(3) tensor([3]) tensor([[3]])
data1=data_tensor.item()
print(data1) # 3
if __name__ == '__main__':
scalar_tensor_to_number()
更多推荐



所有评论(0)