1.张量的简介
张量也可以称为多维矩阵。例如,标量: 为0维张量 向量:为1维张量 矩阵:为2维张量 .......
张量除了有维度、大小和元素个数之外,还有元素的类型,例如: torch.float16, torch.float32, torch.int16, torch.int32......
注:在pyTorch中,函数名都是小写,类名的首字母大写。
torch.arange()和torch.range()的区别:
torch.arange(start, end, step) 返回一个以start为首项, 以end为尾项,以step为公差的等差数列。"不包含end"
torch.range(start, end, step) 返回一个以start为首项, 以end为尾项,以step为公差的等差数列。"但是包含end"
另外,torch.linspace(start, end, steps) 也可以返回一个等差数列,但是该数列以start 为起点,以end为终点,等间距地取steps个数。(包含start和end)
(1)张量的重排
tensor.reshape(r, c, k) 将张量tensor各个维度的大小改变为(r, c, k)
tensor.squeeze() 表示将张量tensor中大小为1的维度去掉
tensor.unsqueeze(dim) 表示在张量tensor指定的维度dim上增加一个大小为1的维度
tensor.permute(2, 0, 1,3) 表示对张量tensor的维度进行重新排列
tensor.transpose(0, 2) 表示将张量tensor指定的两个维度0 和 2 进行互换
(2)张量中部分数据的选择
tensor.index_select(1, [1, 4, 5]) 表示将张量tensor第二个维度,索引为1,4,5的数据挑选出来,其余数据丢掉
tensor.masked_select(mask) 其中mask是一个与tensor大小相同的张量,且其所有元素为1或者0,该函数的作用是将mask张量中值为1的位置的数据挑选出来,将其余数据丢掉,返回值由挑选出来的元素组成的1维张量。
(3)张量的扩张与拼接
tensor.repeat(x, y, z) 表示将张量tensor在三个维度上分别重复x, y, z次, 重复之后只是各个维度元素的数量增加了,张量的维度并没有改变
torch.cat([t1, t2], k) 表示将张量他t1和t2在维度k上进行拼接,注意:拼接完后张量的维度并没有变化。
torch.stack([t1, t2], k) 表示将张量t1和t2在维度k上进行拼接,拼接之后维度会增加1。 这种方式要求被拼接的张量t1, t2必须大小形状相同,增加的维度的大小等于拼接的张量的个数。
tensor.expand(x, y, z ...) 表示将张量tensor进行扩张,例如:
>>> x = torch.Tensor([[1], [2], [3]])
>>> x.size()
torch.Size([3, 1])
>>> x.expand(3, 4)
tensor([[ 1., 1., 1., 1.],
[ 2., 2., 2., 2.],
[ 3., 3., 3., 3.]])
(4)scatter 函数
torch.Tensor scatter_(dim, index, src) → Tensor分散操作
将张量src中的各个元素,按照index张量中指定的索引位置,写入到张量Tensor中。此函数中index张量的大小一般大于或等于src张量。例如,该函数可以用来进行one-hot编码:
y_vec_ = torch.zeros((self.batch_size, self.class_num)).scatter_(1, y_.type(torch.LongTensor).unsqueeze(1), 1)
其中,class_num=10, y_= [ 5, 2, 6, 2, 9, 3, 0, 8, 2, ...... ] 的数字向量, y_vec便是对y_进行one-hot编码的结果。
2.张量的运算
(1)张量的初等运算
加法 + , 减法 - , 乘法 * , 除法 / , 乘方 **k , 开方 ** 。 这些运算要求参与运算的张量必须大小形状相同,张量的这些运算都是逐个元素进行运算,运算的结果为大小和形状都相同的张量。
3. pyTorch中使用GPU
(1)使用GPU进行运算
首先,可以根据语句 torch.cuda.is_available() 的返回值来判断GPU是否可用;通过torch.cuda.device_count()可以获得能够使用的GPU数量。然后调用GPU进行运算的方法为:
1)通过cuda() 方法将Tensor迁移到现存中去,具体操作为: Tensor.cuda()
2)使用.cuda() 将Variable迁移到显存中去,具体操作为:Variable.cuda()
3)对于模型来说,也是同样的方式,使用.cuda() 方法可以将网络模型放到显存上去, 具体操作为: model.cuda()
(2)使用指定的GPU运算
1)通过以下语句设置使用的GPU的id
import os
os.environ["CUDA_VISIBLE_DEVICES"] ="id"
2)使用函数set_device
import torch
torch.cuda.set_device(id)
(3)同时使用多GPU进行训练
Pytorch 的多 GPU 处理接口是torch.nn.DataParallel(module, device_ids),其中module参数是所要执行的模型,而device_ids则是指定并行的 GPU id 列表。