1.張量的簡(jiǎn)介
張量也可以稱為多維矩陣卫枝。例如,標(biāo)量: 為0維張量???????? 向量:為1維張量?????????? 矩陣:為2維張量 .......
張量除了有維度、大小和元素個(gè)數(shù)之外矗烛,還有元素的類型,例如: torch.float16, torch.float32, torch.int16, torch.int32......
注:在pyTorch中箩溃,函數(shù)名都是小寫瞭吃,類名的首字母大寫碌嘀。
torch.arange()和torch.range()的區(qū)別:
torch.arange(start, end, step)?? 返回一個(gè)以start為首項(xiàng), 以end為尾項(xiàng)虱而,以step為公差的等差數(shù)列筏餐。"不包含end"
torch.range(start, end, step)? 返回一個(gè)以start為首項(xiàng), 以end為尾項(xiàng)牡拇,以step為公差的等差數(shù)列魁瞪。"但是包含end"
另外,torch.linspace(start, end, steps)?? 也可以返回一個(gè)等差數(shù)列惠呼,但是該數(shù)列以start 為起點(diǎn)导俘,以end為終點(diǎn),等間距地取steps個(gè)數(shù)剔蹋。(包含start和end)
(1)張量的重排
tensor.reshape(r, c, k)??? 將張量tensor各個(gè)維度的大小改變?yōu)椋╮, c, k)
tensor.squeeze()??? 表示將張量tensor中大小為1的維度去掉
tensor.unsqueeze(dim)??? 表示在張量tensor指定的維度dim上增加一個(gè)大小為1的維度
tensor.permute(2, 0, 1,3) ?? 表示對(duì)張量tensor的維度進(jìn)行重新排列
tensor.transpose(0, 2) ? ? 表示將張量tensor指定的兩個(gè)維度0 和 2 進(jìn)行互換
(2)張量中部分?jǐn)?shù)據(jù)的選擇
tensor.index_select(1, [1, 4, 5]) ?? 表示將張量tensor第二個(gè)維度旅薄,索引為1,4,5的數(shù)據(jù)挑選出來,其余數(shù)據(jù)丟掉
tensor.masked_select(mask)? ?? 其中mask是一個(gè)與tensor大小相同的張量泣崩,且其所有元素為1或者0少梁,該函數(shù)的作用是將mask張量中值為1的位置的數(shù)據(jù)挑選出來,將其余數(shù)據(jù)丟掉矫付,返回值由挑選出來的元素組成的1維張量凯沪。?
(3)張量的擴(kuò)張與拼接
tensor.repeat(x, y, z)? ?表示將張量tensor在三個(gè)維度上分別重復(fù)x, y, z次, 重復(fù)之后只是各個(gè)維度元素的數(shù)量增加了买优,張量的維度并沒有改變
torch.cat([t1, t2], k)????? 表示將張量他t1和t2在維度k上進(jìn)行拼接妨马,注意:拼接完后張量的維度并沒有變化。
torch.stack([t1, t2], k)????? 表示將張量t1和t2在維度k上進(jìn)行拼接杀赢,拼接之后維度會(huì)增加1烘跺。 這種方式要求被拼接的張量t1, t2必須大小形狀相同,增加的維度的大小等于拼接的張量的個(gè)數(shù)脂崔。
tensor.expand(x, y, z ...)? ?表示將張量tensor進(jìn)行擴(kuò)張滤淳,例如:
>>> 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 函數(shù)
torch.Tensor scatter_(dim,?index,?src)?→ Tensor分散操作
將張量src中的各個(gè)元素,按照index張量中指定的索引位置脱篙,寫入到張量Tensor中娇钱。此函數(shù)中index張量的大小一般大于或等于src張量。例如绊困,該函數(shù)可以用來進(jìn)行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, ...... ] 的數(shù)字向量, y_vec便是對(duì)y_進(jìn)行one-hot編碼的結(jié)果秤朗。?
2.張量的運(yùn)算
(1)張量的初等運(yùn)算
加法 +? 煤蹭, 減法 - , 乘法 *?? , 除法 / 硝皂, 乘方 **k?? 常挚, 開方? **? 。 這些運(yùn)算要求參與運(yùn)算的張量必須大小形狀相同稽物,張量的這些運(yùn)算都是逐個(gè)元素進(jìn)行運(yùn)算奄毡,運(yùn)算的結(jié)果為大小和形狀都相同的張量。
3. pyTorch中使用GPU
(1)使用GPU進(jìn)行運(yùn)算
首先贝或,可以根據(jù)語(yǔ)句 torch.cuda.is_available() 的返回值來判斷GPU是否可用吼过;通過torch.cuda.device_count()可以獲得能夠使用的GPU數(shù)量。然后調(diào)用GPU進(jìn)行運(yùn)算的方法為:
1)通過cuda() 方法將Tensor遷移到現(xiàn)存中去咪奖,具體操作為: Tensor.cuda()
2)使用.cuda() 將Variable遷移到顯存中去盗忱,具體操作為:Variable.cuda()
3)對(duì)于模型來說,也是同樣的方式羊赵,使用.cuda() 方法可以將網(wǎng)絡(luò)模型放到顯存上去趟佃, 具體操作為: model.cuda()
(2)使用指定的GPU運(yùn)算
1)通過以下語(yǔ)句設(shè)置使用的GPU的id
import? os
os.environ["CUDA_VISIBLE_DEVICES"] ="id"
2)使用函數(shù)set_device
import? torch?
torch.cuda.set_device(id)
(3)同時(shí)使用多GPU進(jìn)行訓(xùn)練
Pytorch 的多 GPU 處理接口是torch.nn.DataParallel(module, device_ids),其中module參數(shù)是所要執(zhí)行的模型昧捷,而device_ids則是指定并行的 GPU id 列表闲昭。