pip install torch
pip install torchvision
#IPython魔术命令
import torch as t
a=t.Tensor(3,4)
%timeit a.sum() #检测某条语句的执行时间
%hist #查看输入历史
autograd.Variable是Autograd中的核心类。
Variable主要包含三个属性:
Autograd实现了反向传播功能,但是使用还略显复杂。torch.nn是专门为神经网络设计的模块化接口。nn构建于Autograd之上,可用来定义和运行神经网络。
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net,self).__init__()
self.conv1 = nn.Conv2d(1,6,5)
self.conv2 = nn.Conv2d(6,16,5)
self.fc1 = nn.Linear(16*5*5,120)
self.fc2 = nn.Linear(120,84)
self.fc3 = nn.Linear(84,10)
def forward(self,x):
x = F.max_pool2d(F.relu(self.conv1(x)),(2,2))
x = F.max_pool2d(F.relu(self.conv2(x)),2)
x = x.view(x.size()[0],-1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
print(net)
for name,parameters in net.named_parameters():
print(name,':',parameters.size())
forward函数的输入和输出都Variable,只有Variable才具有自动求导功能,Tensor是没有的,需封装称Variable。
torch.nn只支持mini-batches,不支持一次只输入一个样本,即每次输入必为1个batch。如果只输入一个样本,则用input.unsqueeze(0)将batch_size设置为1.例如,nn.Conv2d输入必须为4维的,形如nSamplesnChannelsHeightWidth,可将nSample设置为1,即1nChannelsHeightWidth。
nn实现了神经网络中大多数的损失函数。例如nn.MESLoss用来计算均方误差,nn.CrossEntropyLoss用来计算交叉熵函数。
torchvision实现了常用的图像数据加载功能,例如Imagenet、CIFAR10、MNIST等,以及常用的数据转换操作。
CIFAR分类步骤:
可以通过tensor.view方法来调整tensor的形状,但必须保证调整前后元素总数一致。view不会修改自身的数据,返回的新tensor与源tensor共享内存,会发生联动。在实际应用中如果修改维度,需要使用sequeeze和unsqueeze两个函数。
resize为调整size的另一种方法,此方法可以修改tensor的尺寸。如果修改后的尺寸超过了原尺寸,会自动分配新的内存空间。如果修改后的尺寸小于原尺寸,则之前的数据依旧会保存。
函数 | 功能 |
---|---|
index_select(input, dim, index) | 在指定维度dim上选取,例如选取某些行、某些列 |
masked_select(input, mask) | 例如a[a>0],使用ByteTensor进行选取 |
non_zero(input) | 非0元素的下标 |
gather(input, dim, index) | 根据index,在dim维度上选取数据,输出的size与index一样 |
gather是较为复杂的操作,对于一个二维tensor,输出的每个元素如下:
out[i][j] = input[index[i][j]][j] #dim=0
out[i][j] = input[i][index[i][j]] #dim=1
与gather相对应的逆操作为scatter_,gather把数据从input中按index取出,而scatter_是把取出的数据再放回去。scatter_函数是inplace操作。
out = input .gather(dim,index) #---->近似逆操作
out = Tensor()
out.scatter_(dim,index)
https:///akari0216/article/details/108573648
PyTorch 0.2的高级索引一般不和原始的Tensor共享内存。
Tensor有不同的数据类型,每种类型分别对应CPU和GPU版本(HalfTensor除外)。默认的tensor是FloatTensor,可通过t.set_deault_tensor_type修改默认tensor类型(如果默认类型为GPU tensor,则所有操作都将在GPU上进行)。Tensor的类型对分析内存占用很有帮助。例如,一个size为(1000,1000,1000)的Float-Tensor,它有100010001000=10^9个元素,每个元素占32bit/8=4Byte内存,所以共占4GB内存/显存。HalfTensor是专门为GPU版本设计的,同样的元素个数,显存占用只有FloatTensor的一半,可以极大地缓解GPU显存不足的问题,但由于HalfTensor表示的数值和精度有限,所以容易出现溢出的问题。
tensor数据类型
数据类型 | CPU tensor | GPU tensor |
---|---|---|
32bit 浮点 | torch.FloatTensor | torch.cuda.FloatTensor |
64bit浮点 | torch.DoubleTensor | torch.cuda.DoubleTensor |
16bit半精度浮点 | N/A | torch.cuda.HalfTensor |
8bit无符号整形(0~255) | torch.ByteTensor | torch.cuda.ByteTensor |
8bit有符号整形(-128~127) | torch.CharTensor | torch.cuda.CharTensor |
16bit有符号整形 | torch.ShortTensor | torch.cuda.ShortTensor |
32bit有符号整形 | torch.IntTensor | torch.cuda.IntTensor |
64bit有符号整形 | torch.LongTensor | torch.cuda.LongTensor |
各数据类型之间可以相互转换,type(new_type)是通用的做法,同时还有float、long、half等快捷方法。CPU tensor和GPU tensor之间的互相转换通过tensor.cuda和tensor.cpu的方法实现。
常见的逐元素操作
函数 | 功能 |
---|---|
abs/sqrt/div/exp/fmod/log/pow | 绝对值/平方根/除法/指数/求余/求幂 |
cos/sin/asin/atan2/cosh | 三角函数 |
ceil/round/floor/trunc | 上取整/四舍五入/下取整/只保留整数部分 |
clamp(input, min, max) | 超过min和max部分截断 |
sigmod/tanh… | 激活函数 |
归并操作
函数 | 功能 |
---|---|
mean/sum/median/mode | 均值/和/中位数/众数 |
norm/dist | 范数/距离 |
std/var | 标准差/方差 |
cumsum/cumprod | 累加/累乘 |
以上函数大多含有参数,dim的关联可以按下记忆。