这一节课主要讲了pytorch。
百度百科上的说明是
PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。
2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。它是一个基于Python的可续计算包,提供两个高级功能:1、具有强大的GPU加速的张量计算(如NumPy)。2、包含自动求导系统的深度神经网络。
简单来说就是
可以调用GPU来加速计算(妈妈再也不用担心GPU只能打游戏了)
网络结构随便堆,只要合理,梯度计算不用自己担心
上面是老师上课时的PPT里面的图,整个神经网络的训练部分可以分成三个部分,即
Define Function
Define Loss Function
Define Optimization Function
也就是
怎么定义算的方法
怎么定义算得好
怎么改进算的方法
当模型完成训练之后一般要进行Validation,也就是让模型看自己手里已经有答案的问题,以此来看自己的模型的效果,然后又训练,又看,来个1000次,这就是炼丹过程
当你觉得自己的丹炼得差不多了,可以看一下最后的效果了,就是Testing的过程,其实可以直接把数据分成三个部分,即Trainin data,Validation data与Testing data,在LHY老师的代码里面就是这样写的
由于在训练的过程中数据的加入是必不可少的,因此Pytorch中专门为数据设计的东西:Dataset & Dataloader。
Dataset负责配合Dataloader,相当于数据的来源,而Dataloader主要负责了组成Batch,Batch这个东西在训练的过程中比较重要,相当于原来1000个数据要训练1000次,但如果使用size为10的Batch则只需要搞100次了,而在计算Batch的过程中又可以使用GPU的并行计算能力,时间上大大加快。
一般Dataset定义形式如下图所示
class COVID19Dataset(Dataset):
# 在这里进行数据的预处理,比如文件读取,类型转化
def __init__(self, x, y=None):
self.x = torch.FloatTensor(x)
# 在这里进行数据的返回,此时返回的数据就是组成batch的东西了
def __getitem__(self, idx):
return self.x[idx], self.y[idx]
# 在这里返回整个数据的长度
def __len__(self):
return len(self.x)
其实这三个方法都是python的魔法方法
如
class test:
def __init__(self):
print("hello world init function")
def __getitem__(self,idx):
print(f"{idx} item return")
def __len__(self):
return 100
mytest=test()
mytest[1]
len(mytest)
返回
hello world init function
1 item return
100
然后就是主要的Dataloader了
Dataloader在官方文档中介绍如下:
DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
batch_sampler=None, num_workers=0, collate_fn=None,
pin_memory=False, drop_last=False, timeout=0,
worker_init_fn=None, *, prefetch_factor=2,
persistent_workers=False)
官方的说明已经比较详细了,主要有几个要注意的地方
tensor是pytorch中比较常见的数据形式,一般只要你使用pytorch总会和tensor打交道
tensor在百度翻译中是张量的意思,因为在pytorch中进行神经网络的训练的数据都不会只有二维,明显矩阵的维度就不够用了,因此出现张量的概念,张量可以理解为可以扩展维度的矩阵,如下图所示(也是老师ppt里面的东西~~)
对于tensor的操作主要可以分成几个类别:
a=torch.tensor([1,2,3,4])
print(a.size())
print(a.shape)
print(a.dim())
a=torch.tensor([1.0,2,3,4],dtype=torch.int32)
b=torch.Tensor([1,2,3,4])
a=torch.from_numpy(numpy.array([1,2,3,4]))
a=torch.ones(1,2)
a=torch.zeros(1,2)
a=torch.linspace(1,10,10)
在生成里要注意 tensor是可以指定dtype,而Tensor不可以指定,dtype=float32,
permute
和view
,transpose
,这三个函数都是进行维度转化,但有一点区别,view比较像是填东西,即会将数据从第一个位置到最后一个位置开始填满开头,无论形状如何,类似于水,而permute和transpose则像是从不同的角度来看一个tensor