寒假学习Day 4:PyTorch学习
PyTorch
参考教程:https://www.bilibili.com/video/BV15K411N7CF?p=1
PyTorch Explained
PyTorch是帮助和促进我们构建深度学习项目的一个库。它强调灵活性并允许我们使用熟悉的Python格式来表达深度学习模型。PyTorch的易用性使得其很早便被研究社区所接纳,并且在官方发布后的这几年里,它已发展成为适用于广泛应用的最杰出的深度学习工具之一。
PyTorch提供了一个核心数据结构——Tensor,一个与NumPy数组非常相似的多维数组。在此基础上,为了轻松实现并运行一个项目,或者设计和训练一个新的神经网络结构,Tensor内部实现了一系列功能。Tensor可用于加速数学运算(需要软硬件搭配得当),并且PyTorch内置了可用于分布式训练、高效数据加载的函数包,以及大量常用的深度学习函数。
PyTorch 包
torch | 包含所有其他包和张量库 |
---|---|
torch.nn | 神经网络 包含类和模块 比如图层 权重 |
torch.autogard | 是一个子包,负责处理在核心处优化我们的神经网络权重所需的导数计算 |
torch.nn.functional | 是功能接口,让我们能够访问像损失函数 激活函数和卷积运算 |
torch.optim | 使我们能够访问典型的优化 |
torch.utils | 子包 包含像数据集和数据加载器这样的实用程序类,使数据预处理更加容易 |
torchvision | 单独的包 它能让我们访问流行的数据集 计算机视觉的模型架构和图像转换 |
PyTorch install
我是参考的这个视频
https://www.bilibili.com/video/BV1hE411t7RN?p=1
CUDA是什么
GPU相对于CPU的速度取决于所执行的计算的类型,最适合GPU的是一个可以并行完成的计算。并行计算是一种计算方法,通过这种计算方法,一个
特定的计算被分解成独立的,可以同时进行的更小的计算,然后,得到的计算被重新组合或同步,以形成原始较大计算的结果。
通过cuda,可以将计算转到GPU上进行
Tensors
tensors 是神经网络使用的主要数据结构,在网络中的输入,输出和转换都使用张量来表示
n维tensor n是指在结构中访问特定元素所需要的索引数量
秩
tensor的秩告诉我们需要多少个索引来访问或者引用tensor数据结构中包含的特定数据元素
#查看张量的秩
len(t.shape)
轴
tensor的秩=tensor的维度数=tensor的轴数
shape
t.shape
从形状可以直接看出每一个轴的长度
reshape
t=torch.tensor([
[1,1,1,1],
[2,2,2,2],
[3,3,3,3]
],dtype=torch.float32)
t.shape#shape
len(t.shape)#秩
torch.tensor(t.shape).prod()#查看tensor的分量数
t.numel()#查看tensor的分量数的另一种方法
reshape时分量值的乘积必须等于tensor中元素的总数
t.reshape(1,12)
压缩一个tensor可以移除长度为1的轴,而解压缩一个tensor会增加一个长度为1的维度
#压缩
print(t.reshape(1,12).squeeze())
print(t.reshape(1,12).squeeze().shape)
#解压缩
print(t.reshape(1,12).unsqueeze(dim=0))
print(t.reshape(1,12).unsqueeze(dim=0).shape)
在pytorch中,-1告诉reshape函数,根据一个tensor中包含的其他值和元素的个数来求出值应该是多少
t=t.reshape(1,-1)
CNN输入
len([A0,A1,A2,A3])=4
A2:Height
A3:Wide
A1:Color
- A1=1:灰度图像
- A1=3:RGB图像
A0:批量的大小,即批中有多少样本
PyTorch Tensor
import torch
import numpy as np
t=torch.Tensor
type(t)
print(t.dtype)
print(t.device)#设备
print(t.layout)#内存布局
在Pytorch中创建tensor
构造函数在构造一个tensor时使用全局缺省值
工厂函数根据输入判断数据类型
data=np.arry([1,2,3])
#方法1(类构造函数)
torch.Tensor(data)
#方法2(工厂函数)
torch.tensor(data)
#方法3(工厂函数)
torch.as_tensor(data)
#方法4(工厂函数)
torch.from_numpy(data)
方法一和方法二在更改输入的data值之后不会改变输出
方法三和方法四在更改输入的data值之后会改变输出
不需要内存共享时方法二是最优的
需要内存共享时方法三是最优的
在没有输入数据的情况下创建tensor
Flatten
四个等价的操作
t.reshape(1,-1)[0]
t.reshape(-1)
t.view(t.numel())
t.flatten()
CNN Flatten Operation
t1=torch.tensor([
[1,1,1,1],
[1,1,1,1],
[1,1,1,1],
[1,1,1,1]
])
t2=torch.tensor([
[2,2,2,2],
[2,2,2,2],
[2,2,2,2],
[2,2,2,2]
])
t3=torch.tensor([
[3,3,3,3],
[3,3,3,3],
[3,3,3,3],
[3,3,3,3]
])
#合并
t=torch.stack((t1,t2,t3))
#增加一个轴
t=t.reshape(3,1,4,4)
#得到了CNN的理想输入,3个灰度样本,每个样本的大小为4x4
t.flatten(start_dim=1).shape
t.flatten(start_dim=1)#控制flatten操作时从哪个轴开始
Tensors for Deep Learning
有些操作原理是利用了广播
- numpy 广播
t1=torch.tensor([
[1,2],
[3,4]
],dtype=torch.float32)
t2=torch.tensor([2,4],dtype=torch.float)
np.broadcast_to(t2.numpy(),t1.shape)
- tensor 比较(利用了广播)
t1=torch.tensor([
[0,5,7],
[6,0,7],
[0,8,0]
],dtype=torch.float32)
t.eq(0)#元素等于0
t.ge(0)#元素大于等于0
t.gt(0)#元素大于0
t.lt(0)#元素小于0
t.le(7)#元素小于或等于7
tensors 缩减操作
tensors 缩减操作是指减少tensors中包含的元素数量的操作
t=torch.tensor([
[0,1,0],
[2,0,2],
[0,3,0]
],dtype=torch.float32)
t.sum()
t.numel()
t.sum().numel()
t.sum().numel()
t.sum().numel()<t.numel()
返回的值是true
在sum操作中元素减少了,这是缩减操作的一个例子
其他的还有
t.prod()#返回元素的乘积
t.mean()#返回元素的平均值
t.std()#返回标准差
t.argmax()#返回最大值的索引
t.mean().item()#把标量张量的值作为一个数字
t.mean(dim=0).tolist()#把tensor转化成列表
t.mean(dim=0).numpy()#把tensor转化成array
Pytorch CNN
- Pytorch 创建数据集原理
class OHLC(Dataset):
def __init__(self,csv_file):
self.data=pd.read_csv(csv_file)
def __getitem__(self,index):
r=self.data.iloc[index]
label=torch.tensor(r.is_up_day,dtype=torch.long)
sample=self.normalize(torch.tensor([r.open,r.high,r.low,r.close]))
return sample,label
def __len__(self):
return len(self.data)
- 实例
#所用到的库
import torch
import torchvision
import torchvision.transforms as transforms
#数据集下载
train_set=torchvision.datasets.FashionMNIST(
root='./data/FashionMNIST'
,train=True
,download=True
,transform=transforms.Compose([
transforms.ToTensor()
])
)
Done的那一刻非常喜悦!