broadcast自动扩展
两个特点:可以自动扩展维度,且不会copy数据方法:从最后一个维度开始匹配,如果前面没有维度,会在前面插入一个维度size=1;自动调用Expand函数使得维度size相同。
注意broadcast并不是函数,而是在不同size的tensor之间进行加减操作会自动进行的一种机制>
eg:已有feature map:[4,32,14,14],如何将一个一维的bias:[32]与之叠加。接下来看看一维的bias如何和四维的feature map叠加:首先,手动插入两个维度表示bias:[32,1,1] [4,32,14,14] [32,1 ,1]在前面补一个维度: [4,32,14,14] [1,32,1 ,1]自动调用Expand函数使得维度size相同: [4,32,14,14] [4,32,14,14]
原理
图片引自:pytorch学习笔记(六)——pytorch进阶教程之broadcast自动扩展_pytorch的broastcast_南风渐起的博客-CSDN博客
...
tensor
从list传入数据量较小时,可以直接传入。注意要区别tensor()和Tensor()这两个函数,前者是传入数据本身,后者时传入数据的shape,Tensor与FloatTensor函数用法类似,如FloatTensor(2,3)会生成一个两行三列的tensor,数据为随机量FloatTensor类型当然FloatTensor也能传入数据本身,但数据必须用一个list表示建议torch.FloatTensor(dim1,dim2,dim3)这种格式,不用Tensor直接传数据
未初始化数据
torch.empty()
torch.FloatTensor(dim1,dim2,dim3)
torch.IntTensor(dim1,dim2,dim3)
设置默认tensor增强学习一般使用double,其他一般使用float。
随机初始化torch.rand(2,3)随机生成一个两行三列的tensor,初始化数值在0-1范围内随机采样torch.randint(min,max,shape)表示从min-max中随机取整数,shape为一个list。均匀采样0-10的Tensor,要用x ...
张量数据类型
基本数据类型只需要知道torch.FloatTensor,torch.ByteTensor,torch.IntTensor,torch.LongTensor,GPU Tensor比CPU Tensor中间多一个cuda。可以用变量名.type检查类型。isinstance()用来对tensor进行类型检验,将两个进行对比类型一致返回TRUE注意:type(x)是python内置用法,只会返回torch.Tensor不会返回具体类型要用x.type。x.cuda()会返回一个gpu上的引用。
不同维度tensor创建Dim 0用于计算Loss,输出一个标量。
1torch.tensor(1.)
tensor(1.)注意:1.是0维,是标量,[1.]是1维,长度为1的张量。a.shape和a.size()作用等同,输出的torch.size([])即表示dimension为0,说明该tensor为标量
Dim 1用于神经网络的偏置bias,或者作为神经网络线性层的输入,如MNIST数据集中图片格式转换后为tensor([784])。
1torch.tensor([1.])
shape, ...
框架介绍
动态图和静态图
小白学PyTorch 动态图与静态图的浅显理解 - 知乎 (zhihu.com)
动态图:pytorch使用的,运算与搭建同时进行;灵活,易调节。即先有数据,再拿着数据按照算式算数。
静态图:老tensorflow使用的,先搭建图,后运算;高效,不灵活;图搭建好后不能修改。即先有算式(模型),再把数据往里带。
静态图先说明数据要怎么计算,然后再放入数据。假设要放入50组数据,运算图因为是事先构建的,所以每一次计算梯度都很快、高效;动态图的运算图是在数据计算的同时构建的,假设要放入50组数据,那么就要生成50次运算图。这样就没有那么高效。所以称为动态图。
动态图虽然没有那么高效,但是他的优点有以下:
更容易调试。
动态计算更适用于自然语言处理。(这个可能是因为自然语言处理的输入往往不定长?)
动态图更面向对象编程,我们会感觉更加自然。