Тензорҳо
Тензорҳо барои чӣ лозиманд
Шабакаи нейронӣ ададҳо мегирад: равшании пикселҳо, ченкуниҳои сенсорҳо, аломатҳои матн. Рӯйхати Python барои нигоҳдорӣ қулай аст, вале коркарди ҳазорҳо қимат бо давраҳои ҷудогона зуд мураккаб мешавад. Тензор (tensor) ададҳоро якҷо нигоҳ медорад ва имкон медиҳад як амал ба тамоми массив татбиқ шавад. Дар PyTorch ҳамин маълумотро барои ҳосилаҳои худкор ва ҳисоб дар GPU низ истифода бурдан мумкин аст; барои ин курс протсессор кофист.
Ба сӯи шинохти рақамҳо меравем. Як тасвир ҷадвали равшанӣ аст, чанд тасвир як баста (batch) месозанд. Пеш аз сохтани шабака бояд шакли маълумотро хонем, навъи ададҳоро интихоб кунем ва натиҷаи ҳар амалро санҷем.
1. Қиматҳо, шакл ва навъ
Андоза як меҳвари массив аст. Вектор як меҳвар ва ҷадвал ду меҳвар дорад. shape дарозии меҳварҳоро, numel() шумораи умумии унсурҳоро ва dtype тарзи нигоҳдории як ададро нишон медиҳад. Ададҳои бутун дар рӯйхати одӣ torch.int64 медиҳанд; zeros бо танзимоти пешфарз сифрҳои касрии float32 месозад.
import torch
x = torch.tensor([[2, 4, 6], [1, 3, 5]])
print(tuple(x.shape), x.dtype, x.numel())
print(torch.zeros(2, 3).tolist())
print(torch.arange(4).tolist())
Натиҷа:
(2, 3) torch.int64 6
[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]
[0, 1, 2, 3]
Шакли (2, 3) ду сатр бо се ададӣ аст, на фосилаи қиматҳо. Барои тасвирҳои (N, H, W) меҳварҳо маънои рақами тасвир, сатр ва сутунро доранд. N, H ва W метавонанд тағйир ёбанд, бинобар ин андозаҳоро одатан аз shape мехонанд. torch.rand ададҳои касрии тасодуфӣ аз [0, 1) ва torch.arange пайдарпаиро бе сарҳади рости он месозад.
2. Ададҳои касрӣ ва миқёс
Равшанӣ аксар вақт ҳамчун uint8, адади бутун аз 0 то 255, нигоҳ дошта мешавад. Барои ҳисоби шабака одатан float32 лозим аст. Методи .float() тензорро бо ҳамин навъ бармегардонад. Миқёсбандӣ воҳиди ченкуниро иваз мекунад: агар қимати баландтарини сенсор 6 бошад, тақсим ба 6 ченкуниҳоро ба фосилаи аз 0 то 1 мегузаронад.
import torch
x = torch.tensor([0, 3, 6], dtype=torch.uint8)
print(x.float().dtype)
print((x.float() / 6).tolist())
print((x // 6).tolist())
Натиҷа:
torch.float32
[0.0, 0.5, 1.0]
[0, 0, 1]
Дар PyTorch оператори / ҳатто барои вуруди бутун тақсими одӣ мекунад. // бо яклухткунӣ ба поён тақсим карда, қисмҳои касриро гум мекунад. .float() пеш аз ҳисоби минбаъда навъро ошкоро муайян мекунад; тензори аслӣ аз ин даъват тағйир намеёбад.
3. Амалҳо ва меҳвари dim
Ҷамъ, зарби * ва дараҷа унсур ба унсур иҷро мешаванд. Адад дар x * 2 + 1 ба ҳар унсур татбиқ мешавад: ин ҳолати содаи broadcasting, мувофиқсозии шаклҳост. Зарби матритсавӣ бо @ навишта мешавад ва маънои дигар дорад.
Коҳишдиҳӣ (reduction) чанд ададро ба як адад ҷамъбаст мекунад, масалан sum ё mean. Бе dim амал тамоми тензорро фаро мегирад. Барои ҷадвал dim=0 меҳвари сатрҳоро мебардорад ва ҷамъи ҳар сутунро мемонад; dim=1 меҳвари сутунҳоро мебардорад ва ҷамъи ҳар сатрро мемонад.
import torch
x = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
print((x * 2 + 1).tolist())
print(x.sum(dim=0).tolist(), x.sum(dim=1).tolist())
print(x.mean().item())
print((x @ torch.ones(2, 1)).tolist())
Натиҷа:
[[3.0, 5.0], [7.0, 9.0]]
[4.0, 6.0] [3.0, 7.0]
2.5
[[3.0], [7.0]]
mean() тензори дорои як ададро бармегардонад. .item() аз он адади Python-ро барои чоп ё сабт мегирад. .item()-ро барои тамоми ҷадвал даъват накунед: аввал як унсурро интихоб кунед ё коҳишдиҳӣ иҷро намоед.
4. Шакли нав бо қиматҳои пешина
reshape ҷойгиршавии унсурҳоро иваз карда, шумора ва тартиби гузаришро нигоҳ медорад. Ҳисоби як андозаро бо -1 ба PyTorch супоридан мумкин аст. Дар мисол 12 унсур ба ду сатр тақсим мешавад, бинобар ин дар ҳар сатр 6 қимат ҳаст.
import torch
x = torch.arange(12)
grid = x.reshape(2, -1)
print(grid.tolist())
print(tuple(grid.shape), grid.numel())
Натиҷа:
[[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]]
(2, 6) 12
12 унсурро ба ҷадвали 5×3 ҷойгир кардан мумкин нест: барои он 15 унсур лозим аст. Ҳангоми кор бо баста меҳвари намунаҳоро назорат кунед: шабака бояд аломатҳои ҳар тасвирро гирад ва сарҳади байни тасвирҳоро гум накунад. Тағйири шакл бо ҷойивазкунии меҳварҳо як чиз нест.
5. Индексҳо, ниқобҳо ва интихоби синф
Индексгузорӣ аз сифр оғоз мешавад. : ҳамаи унсурҳои меҳварро интихоб мекунад; муқоиса ниқоб (mask), тензори қиматҳои мантиқӣ, месозад. Ниқоб қиматҳои мувофиқро интихоб мекунад. argmax индекси қимати калонтаринро бармегардонад, на худи қиматро. Барои як вектори баҳоҳо ин рақами синфи интихобшуда аст; ҳангоми баробарӣ максимуми аввал гирифта мешавад.
import torch
x = torch.tensor([[2, 5, 1], [7, 0, 3]])
print(x[0].tolist(), x[:, 1].tolist())
print(x[x > 3].tolist())
scores = torch.tensor([0.2, 1.5, -0.4])
print(scores.argmax(dim=0).item())
print((torch.tensor([1, 2, 3]) == torch.tensor([1, 0, 3])).float().mean().item())
Натиҷа:
[2, 5, 1] [5, 0]
[5, 7]
1
0.6666666865348816
.tolist() тензорро барои чопи фаҳмо ба рӯйхатҳо табдил медиҳад. Муқоисаи ду вектор True ва False медиҳад; табдил ба ададҳои касрӣ онҳоро ба 1 ва 0 мегузаронад. Миёнаи онҳо ҳиссаи мувофиқатҳоро нишон медиҳад. Думи дарози 0.666666686... хатогии одии нигоҳдории float32 аст, на як пешгӯии нодурусти иловагӣ.
Дар дохил чӣ рӯй медиҳад
Тензор буфери ададҳо ва тавсифи ҳаракат дар он дорад: шакл ва қадамҳо аз рӯи меҳварҳо (strides). Ҷадвали одӣ сатрҳоро пайдарпай нигоҳ медорад. Транспозитсияи .t() нақши сатр ва сутунро иваз мекунад, вале худи ададҳо метавонанд дар буфери пешина монанд. Чунин тензор метавонад пайваста ҷойгир набошад: is_contiguous() қимати False медиҳад.
view ҷойгиршавии мувофиқи хотираро талаб мекунад. reshape ҳам дар сурати имкон хотираи пешинаро истифода мебарад, вале ҳангоми зарурат нусха месозад. Пас ҳар тағйири шакл бе хароҷот нест.
import torch
x = torch.arange(6).reshape(2, 3).t()
print(x.is_contiguous())
try:
x.view(-1)
except RuntimeError as e:
print(type(e).__name__)
print(x.reshape(-1).tolist())
Натиҷа:
False
RuntimeError
[0, 3, 1, 4, 2, 5]
Хатоҳои маъмул ва ислоҳи онҳо
Гум кардани касрҳо.
x // 6барои қиматҳои аз 6 хурд асосан сифр медиҳад. Тақсими одӣ ва навъи касрии мувофиқро истифода баред; мисоли боло фарқро нишон медиҳад.Омехтани меҳварҳо.
x.sum(dim=0)ҷамъи сатрҳоро намедиҳад. Ҷадвал кашида, меҳвари нестшавандаро қайд кунед; барои ҷамъи ҳар сатри ҷадвали дученака меҳвари сутунҳо лозим аст.Миёнаи ададҳои бутун.
torch.tensor([2, 4]).mean()хатоиRuntimeErrorмедиҳад. Аввал маълумотро ба ададҳои касрӣ табдил диҳед:
import torch
x = torch.tensor([2, 4])
try:
print(x.mean())
except RuntimeError as e:
print(type(e).__name__)
print(x.float().mean().item())
Натиҷа:
RuntimeError
3.0
Универсалӣ донистани view. Баъди ҷойивазкунии меҳварҳо
view(-1)метавонадRuntimeErrorдиҳад.reshape-ро истифода баред ё пеш азviewбо.contiguous()нусхаи пайваста гиред.Гум кардани баста ё шумораи унсурҳо. Ҳосили зарби андозаҳоро пеш ва пас аз тағйири шакл санҷед. Ҳангоми интихоби синфҳо шакли натиҷаро низ санҷед: ба ҳар намуна як индекс бояд мувофиқ бошад.
Ёддошт
| Вазифа | Восита |
|---|---|
| Сохтани маълумот | torch.tensor, zeros, rand, arange |
| Санҷидани сохтори маълумот | shape, dtype, numel() |
| Гузариш ба float32 | .float() |
| Зарби унсурӣ / матритсавӣ | * / @ |
| Коҳиши меҳвари интихобшуда | sum(dim=...), mean(dim=...) |
| Тағйири шакл | reshape, як андозаи -1 |
| Интихоби индекси максимум | argmax(dim=...) |
| Гирифтани объектҳои Python | .item() барои як адад, .tolist() барои массив |
Дар масъалаҳо санҷиш функсияҳои шуморо бо маълумоти худ даъват мекунад, иҷро дар компютери худ бошад намоиш медиҳад. Импорти аввалини PyTorch метавонад чанд сония гирад. Пеш аз кор бо тамоми баста шаклҳо ва навъҳоро дар тензорҳои хурд санҷед.