深度学习--pytorch的各种处理
什么是深度学习
Pytorch
张量的创建
1.基本创建方式
2.创建线性和随机张量
3.创建0和1张量
4.张量的元素类型转换
代码示例
import torch
import numpy as np
# 1. torch.tensor() 根据指定数据创建张量
print(10)
print(torch.tensor(10))
data_np = np.random.rand(2,3)
print(data_np)
print(torch.tensor(data_np))
data = [[1.,2,3],[2,3,4]]
print(data)
print(torch.tensor(data))
print('-'*60)
# 2. torch.Tensor() 根据指定形状创建张量
print(torch.Tensor(2))
print(torch.Tensor([2])) # float32
print('-'*60)
# 3. 创建指定类型的张量
print(torch.IntTensor(2,3)) #创建2行3列, dtype 为 int32 的张量
print(torch.ShortTensor((2,3))) # int16
print(torch.LongTensor([2,3])) # int64
print(torch.FloatTensor([2,3])) # float32
print(torch.DoubleTensor([2,3])) # float64
print('-'*60)
# 4. 创建线性张量
print(torch.arange(0,10,2)) # 在指定区间按照步长生成元素
print(torch.linspace(0,10,10)) # 在指定区间按照元素个数生成
print('-'*60)
# 5. 随机种子设置
print(torch.randn(2,3)) # 每次都是随机的
seed = torch.random.initial_seed() ## 查看随机数种子
print(seed)
torch.random.manual_seed(seed) ## 设置随机数种子
print(torch.random.manual_seed(seed))
print('-'*60)
# 6. 创建0-1张量
# 全0
data = torch.randn(4,5)
print(data)
print(torch.zeros(2,3))
print(torch.zeros_like(data))
# 全1
print(torch.ones(2,3))
print(torch.ones_like(data))
# 指定值
print(torch.full([2,3],100))
print(torch.full_like(data,10))
print('-'*60)
# 7. 张量的类型转换
data = torch.randn(4,5)
print(data)
print(data.dtype) # torch.float32
print(data.type(torch.IntTensor).dtype) # 转为torch.int32
print('-'*60)
张量的类型转换
1.张量转为numpy数组
2.numpy数组转为张量
3.标量张量和数字转换
代码示例
import torch
torch.random.manual_seed(100) # 设置随机数
data = torch.randn(2,3)
# 1. 张量转换为NumPy数组
print(type(data)) # 查看类型 torch.Tensor
data_numpy = data.numpy().copy() # 转换为numpy类型
print(type(data_numpy)) # 查看转换后的类型 'numpy.ndarray
# 更改数值
print(data)
data[0][1] = 100 # 它更改 共享内存 两个都更改
print(data)
print(data_numpy) # 若copy()不共享内存 numpy不更改
print('-'*60)
# 2. NumPy数组转换为张量
# from_numpy()
torch.random.manual_seed(200) # 设置随机数
data1 = torch.randn(2,3) # Tensor类型
data_numpy = data1.numpy().copy() # 转换为numpy类型
# 将ndarray数组转换为Tensor,共享内存
# copy() 不共享内存
data_tensor = torch.from_numpy(data_numpy.copy())
data_tensor[0][1] = 500
print(data_tensor)
print(data_numpy)
print('-'*60)
# 用torch.tensor()
torch.random.manual_seed(300) # 设置随机数
data2 = torch.randn(2,3) # Tensor类型
data_numpy = data2.numpy().copy() # 转换为numpy类型
# 将ndarray数组转换为Tensor,不共享内存
# torch.tensor 不用copy()
data_tensor = torch.tensor(data_numpy)
data_tensor[0][1] = 600
print(data_tensor)
print(data_numpy)
print('-'*60)
# 3. 标量张量和数字转换
# 当张量只包含一个元素时, 可以通过 item() 函数提取出该值
data = torch.tensor([30,])
print(data.item())
data = torch.tensor((30))
print(data.item())
张量的数值计算
1.基本运算
2.点乘运算
3.矩阵乘法运算
代码示例
import torch
# 1. 基本运算
torch.random.manual_seed(10)
data = torch.randint(0,10,[2,3])
print(data)
# 不修改原数据
new_data = data.add(10) # 加法
print(new_data)
# 直接修改原数据
data.add_(10) # 带下划线
print(data)
# 其他函数
print(data.sub(100))
print(data.mul(100))
print(data.div(100))
print(data.neg())
# 2. 点乘运算
data1 = torch.tensor([[1,2],[3,4]])
data2 = torch.tensor([[5,6],[7,8]])
# 第一种
data = torch.mul(data1,data2)
print(data)
# 第二种
data = data1*data2
print(data)
# 3. 矩阵相乘
data1 = torch.tensor([[1, 2], [3, 4], [5, 6]])
data2 = torch.tensor([[5, 6], [7, 8]])
# 第一种
data = torch.matmul(data1,data2)
print(data)
# 第二种
data = data1@data2
print(data)
张量运算函数
代码示例
import torch
torch.random.manual_seed(10)
data=torch.randint(0,10,[2,3],dtype=torch.float64)
print(data)
print('-'*60)
# 1. 求和
print(data.sum())
print(data.sum(dim=0)) # 按列求和
print(data.sum(dim=1)) # 按行求和
print('-'*60)
# 2. 求均值
print(data.mean())
print(data.mean(dim=0)) # 按列均值
print(data.mean(dim=1)) # 按行均值
print('-'*60)
# 3. 求指数
print(data.exp()) # 右上角 exp固定的数
print('-'*60)
# 4. 求平方
print(torch.pow(data,2)) # 2次方
print('-'*60)
# 5. 平方根
print(torch.pow(data,0.5))
print(data.sqrt())
# 对数
print(data.log()) # 以log为底
print(data.log2()) # 以2为底
print(data.log10()) # 以10为底
张量索引操作
代码示例
import torch
torch.random.manual_seed(10)
data = torch.randint(0,10,[4,5])
print(data)
print('-'*60)
# 1. 简单行 简单列
print(data[0])
print(data[:,0])
print('-'*60)
# 2. 列表索引
# 返回 (0, 1)、(1, 2) 两个位置的元素
print(data[[0,1],[1,2]])
# 返回 0、1 行的 1、2 列共4个元素
print(data[[[0],[1]],[1,2]])
# 3. 范围索引
# 前3行的前2列数据
print(data[:3,:2])
# 第2行到最后的前2列数据
print(data[2:,:2])
# 4. 布尔索引
# 第三列大于5的行数据
print(data[data[:,2]>5])
# 第二行大于5的列数据
print(data[:,data[1]>5])
# 5. 多维索引
torch.random.manual_seed(10)
data = torch.randint(0,10,[3,4,5])
print(data)
# 获取0轴上的第一个数据
print(data[0,:,:])
# 获取1轴上的第一个数据
print(data[:,0,:])
# 获取2轴上的第一个数据
print(data[:,:,0])
张量的形状操作
1.reshape()函数
2.squeeze()和unsqueeze()函数
3.transpose()和permute()函数
4.view()和contiguous()函数
代码示例
import torch
torch.random.manual_seed(10)
data = torch.randint(0,10,[3,4])
print(data.size()) # 查看维度
print('-'*60)
# 1. reshape()
# 转换维度
print(data.reshape(2,6).size()) # 改变维度
print(data.reshape(2,2,3).size()) # 个数相同 可改变维度
print(data.reshape(2,2,-1).size()) # -1自动转换为个数相同的维度
print('-'*60)
# 2. squeeze()删除 unsqueeze()增加
print(data.unsqueeze(dim=0).shape)
print(data.unsqueeze(dim=-1).unsqueeze(dim=1).shape)
print(data.unsqueeze(dim=-1).squeeze(dim=-1).shape)
print('-'*60)
# 3. transpose()交换一次位置 permute()交换多个
# 创造张量
torch.random.manual_seed(10)
data = torch.randint(0,10,[2,3,4,5])
print(data.size()) # 查看维度
# transpose()
print(torch.transpose(data,1,2).shape)
# permute()
print(torch.permute(data,[3,2,1,0]).shape)
print(data.permute([3,2,1,0]).shape)
print('-'*60)
# 3. view()连续 不连续先转换 contiguous()
# 创造张量
torch.random.manual_seed(10)
data = torch.randint(0,10,[3,4,5,6])
print(data.size())
# view() 连续情况下
print(data.view(2,4,-1).shape)
# 不连续情况下: 先 contiguous() 再 view()
data1 = torch.transpose(data,1,2)
## 可以先判断是否连续
print(data1.is_contiguous()) # 判断
print(data1.contiguous().view(2,4,-1).shape) # 转换
张量拼接操作
代码示例
import torch
torch.random.manual_seed(10)
data1 = torch.randint(0,10,[3,4,5,6])
print(data1.shape)
torch.random.manual_seed(10)
data2 = torch.randint(0,10,[3,4,3,6])
print(data2.shape)
# 拼接 cat() 除拼接数以外 其他维度的数都要相同
print(torch.cat([data1,data2],dim=2).shape)
自动微分模块
代码示例
import torch
## 标量
# 设置x,y
x = torch.tensor(5)
y = torch.tensor(0.)
# requires_grad 是否计算权重
w = torch.tensor(1.,requires_grad=True)
b = torch.tensor(3.,requires_grad=True)
# 输出值
z = x*w + b
# 设置损失函数 计算损失
loss = torch.nn.MSELoss()
loss = loss(z,y)
# 自动微分
loss.backward()
# w.b 的梯度
print(w.grad)
print(b.grad)
print("-"*35)
## 数组
x = torch.ones(2,5)
y= torch.zeros(2,3)
w = torch.randn(5,3,requires_grad=True)
b = torch.randn(3,requires_grad=True)
z = torch.matmul(x,w) +b
loss = torch.nn.MSELoss()
loss = loss(z,y)
loss.backward()
print(w.grad)
print(b.grad)
原文地址:https://blog.csdn.net/ZZ_zhenzhen/article/details/136267890
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!