
PyTorchã¯ãFacebookã®ç®¡çäžã§éçºãããŠããææ°ã®æ·±å±€åŠç¿ã©ã€ãã©ãªã§ãã CaffeãTheanoãTensorFlowãªã©ã®ä»ã®äžè¬çãªã©ã€ãã©ãªãšã¯ç°ãªããŸãã ããã«ãããç ç©¶è
ã¯æãã¯ã€ã«ããªãã¡ã³ã¿ãžãŒãå®çŸã§ãããšã³ãžãã¢ã¯ãããã®ãã¡ã³ã¿ãžãŒãç°¡åã«å®è£
ã§ããŸãã
ãã®èšäºã¯PyTorchã®ç°¡æœãªç޹ä»ã§ãããã©ã€ãã©ãªã«ãã°ããæ
£ãããã®äž»èŠãªæ©èœãšä»ã®ãã£ãŒãã©ãŒãã³ã°ã©ã€ãã©ãªã®äžã§ã®äœçœ®ãçè§£ããããšãç®çãšããŠããŸãã
PyTorchã¯ãPythonèšèªã®Torch7ãã¬ãŒã ã¯ãŒã¯ã«é¡äŒŒããŠããŸãã ãã®éçºã¯ãTorch7ã®ç»å Žããããã1幎åŸã®2012幎ã«Facebookã®è
žããå§ãŸããŸããããPyTorchã¯äžè¬å
¬éããã2017幎ã«ã®ã¿äžè¬ã«å
¬éãããŸããã ãã®æç¹ããããã¬ãŒã ã¯ãŒã¯ã¯éåžžã«æ¥éã«äººæ°ãåãããŸããŸãå€ãã®ç ç©¶è
ã®æ³šç®ãéããŠããŸãã äœããããªã«äººæ°ãããã®ïŒ
æ®ãã®ãã¬ãŒã ã¯ãŒã¯ã®äžã«é
眮ãã

ãŸãããã£ãŒãã©ãŒãã³ã°ãã¬ãŒã ã¯ãŒã¯ãšã¯äœããçè§£ããŸãããã ãã£ãŒãã©ãŒãã³ã°ã¯éåžžãå€ãã®éç·åœ¢å€æã®æ§æã§ãã颿°ã®åŠç¿ãæå³ãããšçè§£ãããŠããŸãã ãã®ãããªè€éãªé¢æ°ã¯ããããŒãŸãã¯èšç®ã°ã©ããšãåŒã°ããŸãã ãã£ãŒãã©ãŒãã³ã°ãã¬ãŒã ã¯ãŒã¯ã§ã¯ã次ã®3ã€ã®ããšããã§ããŸããã
- èšç®ã®ã°ã©ããå®çŸ©ããŸãã
- èšç®ã®ã°ã©ããåºå¥ããŸãã
- ãããèšç®ããŸãã
颿°ã®èšç®æ¹æ³ãæ©ãç¥ã£ãŠããããå®çŸ©ããæè»æ§ãé«ãã»ã©è¯ãã ãã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ããããªã«ãŒãã®å
šæ©èœã䜿çšã§ããããã«ãªã£ããããæåã®åºæºã¯éèŠãªåœ¹å²ãæãããªããªããŸããã æ¬åœã«èå³ãããã®ã¯ãã³ã³ãã¥ãŒãã£ã³ã°ã®ãããŒãå®çŸ©ããããã®å©çšå¯èœãªãªãã·ã§ã³ã§ãã ããã§ã®ãã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ã¯ã3ã€ã®å€§ããªã«ããŽãªã«åé¡ã§ããŸãã
- åºå®ã¢ãžã¥ãŒã« ãã®ã¢ãããŒãã¯ãã¬ãŽã³ã³ã¹ãã©ã¯ã¿ãŒãšæ¯èŒã§ããŸãããŠãŒã¶ãŒã¯ãå®çŸ©æžã¿ã®ãããã¯ãèšç®ã°ã©ãã«çµåããŠèµ·åããŸãã ãã®ãããªåãããã¯ã«ã¯ãååŸã®éè·¯ããã§ã«çž«ãä»ããããŠããŸãã æ°ãããããã¯ãå®çŸ©ããããšã¯ãæ¢è£œã®ãããã¯ã䜿çšãããããã¯ããã«é£ãããå®å
šã«ç°ãªãç¥èãšã¹ãã«ãå¿
èŠã§ãã æ¡åŒµæ§ã¯ã»ãŒãŒãã§ããããã®ãããªãã¬ãŒã ã¯ãŒã¯ã«ã¢ã€ãã¢ãå®å
šã«å®è£
ãããŠããå ŽåãéçºéåºŠã¯æå€§ã«ãªããŸãã é«åºŠã«æé©åãããäºåã«èšè¿°ãããã³ãŒãã®ãããã§ãäœæ¥ã®é床ãåé¡ãããŸããã å
žåçãªä»£è¡šè
ïŒCaffeãCaffe2ãCNTKãKaldiãDL4JãKerasïŒã€ã³ã¿ãŒãã§ãŒã¹ãšããŠïŒã
- èšç®ã®éçã°ã©ãã ãããã®ãã¬ãŒã ã¯ãŒã¯ã¯ãããªããŒã¯ã¬ã€ãšãã§ã«æ¯èŒã§ããŸãã説æã®æ®µéã§ã¯ãä»»æã®ãµã€ãºãšè€éãã®èšç®ã°ã©ããäœæã§ããŸãããããŒãã³ã°ïŒã³ã³ãã€ã«ïŒåŸã¯åºäœã§ã¢ããªã·ãã¯ã«ãªããŸãã 䜿çšå¯èœãªã¢ã¯ã·ã§ã³ã¯2ã€ã ãã§ããã°ã©ããé æ¹åãŸãã¯éæ¹åã«èµ·åããŸãã ãã®ãããªãã¬ãŒã ã¯ãŒã¯ã¯ãã¹ãŠã宣èšåããã°ã©ãã³ã°ã¹ã¿ã€ã«ã䜿çšãã颿°åèšèªãŸãã¯æ°åŠè¡šèšã«äŒŒãŠããŸãã äžæ¹ã§ã¯ããã®ã¢ãããŒãã¯ãèšè𿮵éã§ã®æè»æ§ãšå®è¡æã®é床ãå
ŒãåããŠããŸãã äžæ¹ã颿°åèšèªã®å Žåãšåæ§ã«ããããã°ã¯çã®é çã®çš®ã«ãªãããã©ãã€ã ãè¶
ããã¢ãã«ãå®è£
ããã«ã¯ã巚人ã®åªåãŸãã¯å€§ããªæŸèæãå¿
èŠã§ãã 代衚è
ïŒTheanoãTensorFlowãMXNetã
- èšç®ã®åçã°ã©ãã åå®è¡ã®åã«éçã°ã©ããåæ§ç¯ã§ãããšæ³åããŠãã ããã ããã¯ããã®ã¯ã©ã¹ã®ãã¬ãŒã ã¯ãŒã¯ã§ã»ãŒçºçããããšã§ãã å¥ã®ãšã³ãã£ãã£ãšããŠã®ã°ã©ãã®ã¿ãããã«ã¯ãããŸããã åœä»€åããã°ã©ãã³ã°èšèªã®ããã«ãæç€ºçãªæ§ç¯ã«ã¯è€éãããŠãå®è¡æã«ã®ã¿ååšããŸãã ããæ£ç¢ºã«ã¯ãã°ã©ãã¯æ¯åçŽæ¥ãã¹ã䜿çšããŠåçã«äœæãããéãã¹ãäœæã§ããŸãã ãã®ã¢ãããŒãã¯ãæå€§éã®æè»æ§ãšæ¡åŒµæ§ãæäŸããèšç®ã§äœ¿çšãããããã°ã©ãã³ã°èšèªã®ãã¹ãŠã®æ©èœã䜿çšã§ããããã«ãããŠãŒã¶ãŒãäœã«ãå¶éããŸããã ãã®ã¯ã©ã¹ã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãTorchãšPyTorchãå«ãŸããŸãã

ç§ãã¡ã®å€ãã¯ãNumPyã®ã¿ã䜿çšããŠããã£ãŒãã©ãŒãã³ã°ã«å¯ŸåŠãå§ãããšç¢ºä¿¡ããŠããŸãã ãã®äžã«çŽæ¥æç« ãæžãã®ã¯ç°¡åã§ãéã¿ãæŽæ°ããããã®åŒã¯çŽã®äžã§èšç®ããããšããã¢ã¹ãã©ã«ããæ¢è£œã®éã¿ãååŸããããšãã§ããŸãã ãã®ãããªæåã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
import numpy as np def MyNetworkForward(weights, bias, x): h1 = weights @ x + bias a1 = np.tanh(h1) return a1 y = MyNetworkForward(weights, bias, x) loss = np.mean((y - y_hat) ** 2)
æéãçµã€ã«ã€ããŠããããã¯ãŒã¯ã¢ãŒããã¯ãã£ã¯ããè€éã§æ·±ããªããNumPyãéçãçŽã®æ©èœã¯ãã¯ãååã§ã¯ãããŸããã ãã®æç¹ã§ã¢ã¹ãã©ã«ãšã®æ¥ç¶ããŸã éããããŠããããäœéãåŸãå Žæãããå Žåã¯ãéãããã§ãã ããã§ãªããã°ãæãã2ã€ã®ããšãèãå§ããŸãïŒ
- ããã§ããããªã«ãŒãã§èšç®ãå®è¡ã§ããŸãã
- ãã¹ãŠã®åŸé
ãã«ãŠã³ããããããšãæã¿ãŸãã
åæã«ãç§ã¯éåžžã®ã¢ãããŒãã倿ŽããããããŸããããã æžãããã§ãïŒ
import numpy as np def MyNetworkForward(weights, bias, x): h1 = weights @ x + bias a1 = np.tanh(h1) return a1 weights.cuda() bias.cuda() x.cuda() y = MyNetworkForward(weights, bias, x) loss = np.mean((y - y_hat) ** 2) loss.magically_calculate_backward_pass()
ããŠãäœã ãšæãïŒ PyTorchã¯ãŸãã«ãããè¡ããŸãïŒ å®å
šã«æ£ããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
import torch def MyNetworkForward(weights, bias, x): h1 = weights @ x + bias a1 = torch.tanh(h1) return a1 weights = weights.cuda() bias = bias.cuda() x = x.cuda() y = MyNetworkForward(weights, bias, x) loss = torch.mean((y - y_hat) ** 2) loss.backward()
æ¢ã«èšç®ããããã©ã¡ãŒã¿ãŒã®æŽæ°ãé©çšããããã«ã®ã¿æ®ããŸãã
Theanoããã³TensorFlowã§ã¯ã宣èšåDSLã®ã°ã©ãã«ã€ããŠèª¬æããŸãããã®ã°ã©ãã¯ãå
éšãã€ãã³ãŒãã«ã³ã³ãã€ã«ãããC ++ã§èšè¿°ãããã¢ããªã·ãã¯ã«ãŒãã«ã§å®è¡ãããããCã³ãŒãã«ã³ã³ãã€ã«ãããŠå¥ã®ãã€ããªãªããžã§ã¯ããšããŠå®è¡ãããŸãã ã³ã³ãã€ã«ã®æç¹ã§ã°ã©ãå
šäœãææ¡ããŠããå Žåãããšãã°èšå·çã«ç°¡åã«åºå¥ã§ããŸãã ãã ããã³ã³ãã€ã«æ®µéã¯å¿
èŠã§ããïŒ
ããã£ããããã èšç®ãšåæã«ã°ã©ããåçã«äœæããããšã劚ãããã®ã¯äœããããŸããïŒ ãŸããèªå埮åïŒADïŒæè¡ã®ãããã§ããã€ã§ãã©ã®ç¶æ
ã§ãã°ã©ããååŸããŠåŸ®åã§ããŸãã ã°ã©ããã³ã³ãã€ã«ããå¿
èŠã¯ãŸã£ãããããŸããã é床ã®é¢ã§ã¯ãPythonã€ã³ã¿ãŒããªã¿ãŒãã軜éã®ãã€ãã£ãããã·ãŒãžã£ãåŒã³åºãããšã¯ãã³ã³ãã€ã«ãããã³ãŒããå®è¡ããããé
ããããŸããã
DSLãšã³ã³ãã€ã«ã«éãããPythonã®ãã¹ãŠã®æ©èœã䜿çšããŠãã³ãŒããæ¬åœã«åçã«ããããšãã§ããŸãã ããšãã°ãå¶æ°æ¥ãšå¥æ°æ¥ã«ããŸããŸãªã¢ã¯ãã£ããŒã·ã§ã³æ©èœãé©çšããŸãã
from datetime import date import torch.nn.functional as F ... if date.today().day % 2 == 0: x = F.relu(x) else: x = F.linear(x) ...
ãŸãã¯ããŠãŒã¶ãŒãå
¥åããã°ããã®å€ããã³ãœã«ã«è¿œå ããã¬ã€ã€ãŒãäœæã§ããŸãã
... x += int(input()) ...
èšäºã®æåŸã«ãããæçšãªäŸã瀺ããŸãã èŠçŽãããšãäžèšã®ãã¹ãŠã¯æ¬¡ã®åŒã§è¡šãããšãã§ããŸãã
PyTorch = NumPy + CUDA + AD ã
ãã³ãœã«èšç®

NumPyã®éšåããå§ããŸãããã Tensorã³ã³ãã¥ãŒãã£ã³ã°ã¯ãPyTorchã®åºç€ã§ããPyTorchã¯ãä»ã®ãã¹ãŠã®æ©èœãæ§ç¯ããããã¬ãŒã ã¯ãŒã¯ã§ãã æ®å¿µãªããããã®åŽé¢ã«ãããã©ã€ãã©ãªã®åãšè¡šçŸåãNumPyã®åãšè¡šçŸåãšäžèŽãããšã¯èšããŸããã ãã³ãœã«ã䜿çšããå ŽåãPyTorchã¯æå€§éã®ã·ã³ãã«ããšéææ§ã®ååã«å°ãããBLASåŒã³åºãã®åŸ®åŠãªã©ãããŒãæäŸããŸãã
ãã³ãœã«
ãã³ãœã«ã«ãã£ãŠä¿åãããããŒã¿ã®ã¿ã€ãã¯ããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®ååã«åæ ãããŸãã ãã©ã¡ãŒã¿ãŒã®ãªãã³ã³ã¹ãã©ã¯ã¿ãŒã¯ç¹å¥ãªå€ãè¿ããŸããæ¬¡å
ã®ãªããã³ãœã«ã¯ãã©ã®æäœã«ã䜿çšã§ããŸããã
>>> torch.FloatTensor() [torch.FloatTensor with no dimension]
å¯èœãªãã¹ãŠã®ã¿ã€ãïŒ
torch.HalfTensor
ããã©ã«ããŸãã¯ã¿ã€ãã®èªåæ€åºã¯ãããŸããã torch.Tensor
ã¯torch.FloatTensor
ã§ãã
NumPyã®ãããªèªåãã£ã¹ããå®è¡ãããŸããã
>>> a = torch.FloatTensor([1.0]) >>> b = torch.DoubleTensor([2.0]) >>> a * b
TypeError: mul received an invalid combination of arguments - got (torch.DoubleTensor), but expected one of: * (float value) didn't match because some of the arguments have invalid types: (torch.DoubleTensor) * (torch.FloatTensor other) didn't match because some of the arguments have invalid types: (torch.DoubleTensor)
ãã®ç¹ã§ã PyTorch
ãã峿 Œã§å®å
šã§ããã¡ã¢ãªæ¶è²»éã2åã«å¢ããŠãã PyTorch
ãªãã®ã§ã宿°ã®ã¿ã€ããæ··ä¹±ããŸãã æç€ºçãªå倿ã¯ãé©åãªååã®ã¡ãœããã䜿çšããŠå©çšã§ããŸãã
>>> a = torch.IntTensor([1]) >>> a.byte() 1 [torch.ByteTensor of size 1] >>> a.float() 1 [torch.FloatTensor of size 1]
x.type_as(y)
ã¯ã y
ãšåãåã®x
ããå€ã®ãã³ãœã«ãè¿ããŸãã
ãã³ãœã«ãããèªäœã®ã¿ã€ãã«çž®å°ããŠããã³ããŒãããŸããã
ãªã¹ãããã©ã¡ãŒã¿ãŒãšããŠãã³ãœã«ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããšã察å¿ããæ¬¡å
ãšå¯Ÿå¿ããããŒã¿ã®ãã³ãœã«ãæ§ç¯ãããŸãã
>>> a = torch.IntTensor([[1, 2], [3, 4]]) >>> a 1 2 3 4 [torch.IntTensor of size 2x2]
NumPyã®å Žåãšåæ§ã«ã誀ã£ã圢åŒã®ãªã¹ãã¯èš±å¯ãããŸããã
>>> torch.IntTensor([[1, 2], [3]])
RuntimeError: inconsistent sequence length at index (1, 1) - expected 2 but got 1
ä»»æã®ã¿ã€ãã®ã·ãŒã±ã³ã¹ã®å€ãããã³ãœã«ãæ§ç¯ããããšãã§ããŸã ãããã¯éåžžã«çŽæçã§ãNumPyã®åäœã«å¯Ÿå¿ããŸãã
ãã³ãœã«ã³ã³ã¹ãã©ã¯ã¿ãŒã®å¥ã®å¯èœãªåŒæ°ã®ã»ããã¯ããã®ãµã€ãºã§ãã åŒæ°ã®æ°ã«ãã£ãŠæ¬¡å
ãæ±ºãŸããŸãã
ãã®ã¡ãœããã«ãã£ãŠæ§ç¯ããããã³ãœã«ã«ã¯ãã¬ããŒãž-ã©ã³ãã ãªå€ãå«ãŸããŠããŸãã
>>> torch.FloatTensor(1) 1.00000e-17 * -7.5072 [torch.FloatTensor of size 1]
>>> torch.FloatTensor(3, 3) -7.5072e-17 4.5909e-41 -7.5072e-17 4.5909e-41 -5.1601e+16 3.0712e-41 0.0000e+00 4.5909e-41 6.7262e-44 [torch.FloatTensor of size 3x3]
玢åŒä»ã
æšæºã®Pythonã€ã³ããã¯ã¹äœæããµããŒããããŠããŸãïŒã€ã³ããã¯ã¹ã®å転ãšã¹ã©ã€ã¹ã
>>> a = torch.IntTensor([[1, 2, 3], [4, 5, 6]]) >>> a 1 2 3 4 5 6 [torch.IntTensor of size 2x3]
>>> a[0] 1 2 3 [torch.IntTensor of size 3]
>>> a[0][1] 2 >>> a[0, 1] 2
>>> a[:, 0] 1 4 [torch.IntTensor of size 2] >>> a[0, 1:3] 2 3 [torch.IntTensor of size 2]
ä»ã®ãã³ãœã«ãã€ã³ããã¯ã¹ã«ããããšãã§ããŸãã ãã ãã2ã€ã®å¯èœæ§ãããããŸããã
- ãŒã次å
ïŒãã¯ãã«ã®å Žåã¯èŠçŽ ãè¡åã®å Žåã¯è¡ïŒã«ãã1次å
ã®
torch.LongTensor
ã€ã³ããã¯ã¹ã - ãã¹ã¯ãšããŠæ©èœãã
0
ãŸãã¯1
ã®ã¿ãå«ãã察å¿ããtorch.ByteTensor
ã
>>> a = torch.ByteTensor(3,4).random_() >>> a 26 119 225 238 83 123 182 83 136 5 96 68 [torch.ByteTensor of size 3x4] >>> a[torch.LongTensor([0, 2])] 81 218 40 131 144 46 196 6 [torch.ByteTensor of size 2x4]
>>> a > 128 0 1 0 1 0 0 1 0 1 0 1 0 [torch.ByteTensor of size 3x4] >>> a[a > 128] 218 131 253 144 196 [torch.ByteTensor of size 5]
x.dim()
ã x.size()
ããã³x.type()
颿°ã¯ããã³ãœã«ã«é¢ãããã¹ãŠã®æ
å ±ãèŠã€ããã®ã«åœ¹ç«ã¡ã x.data_ptr()
ã¯ãããŒã¿ãååšããã¡ã¢ãªå
ã®å Žæã瀺ããŸãã
>>> a = torch.Tensor(3, 3) >>> a.dim() 2 >>> a.size() torch.Size([3, 3]) >>> a.type() 'torch.FloatTensor' >>> a.data_ptr() 94124953185440
ãã³ãœã«æäœ
PyTorchã®åœåèŠåã§ã¯ã xxx圢åŒã®é¢æ°ã¯æ°ãããã³ãœã«ãè¿ããŸãã äžå€ã®é¢æ°ã§ãã 察ç
§çã«ã圢åŒxxx_ã®é¢æ°ã¯ãåæãã³ãœã«ã倿ŽããŸãã 倿Žå¯èœãªé¢æ°ã§ãã åŸè
ã¯ã€ã³ãã¬ãŒã¹é¢æ°ãšãåŒã°ããŸãã
PyTorchã®ã»ãšãã©ãã¹ãŠã®äžå€ã®é¢æ°ã«ã¯ãããã»ã©çŽç²ã§ã¯ãªã颿°ãååšããŸãã ãã ãã颿°ã¯1ã€ã®ããªã¢ã³ãã«ã®ã¿ååšããããšããããŸãã æãããªçç±ã«ããããã³ãœã«ã®ãµã€ãºå€æŽé¢æ°ã¯åžžã«äžå€ã§ãã

ãã³ãœã«ã§å©çšå¯èœãªãã¹ãŠã®æäœããªã¹ãããã®ã§ã¯ãªããæãéèŠãªãã®ã ããåãäžããããããã«ããŽãªã«åé¡ããŸãã
åæå颿°
ååãšããŠãç¹å®ã®ãµã€ãºã®æ°ãããã³ãœã«ãäœæãããšãã®åæåã«äœ¿çšãããŸã
x = torch.FloatTensor(3, 4)
å¯å€é¢æ°ã¯ãªããžã§ã¯ããžã®åç
§ãè¿ãããã宣èšãšåæåã1è¡ã§èšè¿°ããæ¹ã䟿å©ã§ãã
x = torch.FloatTensor(3, 4).zero_()
x.zero_()
ãã³ãœã«ããŒãã§åæåããŸãã äžå€ã®ãªãã·ã§ã³ã¯ãããŸãããx.fill_(n)
ãã³ãœã«ã宿°nã§åããŸãã åæ§ã«ãäžå€ã®ãªãã·ã§ã³ã¯ãããŸãããx.random_(from, to)
ãã³ãœã«ã颿£ ïŒå®æ°å€ãã³ãœã«ã§ãïŒåäžååžããã®ãµã³ãã«ã§æºãããŸãã
from
ãšto
æå®ãto
ããªãå Žåfrom
䜿çšãããããŒã¿åã®äžéãšäžéã«ããããçãããªããŸãã
x.uniform_(from=0, to=1)
ãŸããåäžãªååžã§ããããã§ã«é£ç¶ããŠããããã銎æã¿ã®ããããã©ã«ãã®å¢çç·ããããŸãã 宿°å€ã®ãã³ãœã«ã§ã®ã¿å©çšå¯èœã§ããx.normal_(mean=0, std=1)
æ£èŠååžã 宿°å€ã®ãã³ãœã«ã§ã®ã¿å©çšå¯èœã§ããx.bernoulli_(p=0.5)
ãã«ããŒã€ååžã p
ãšããŠãå€0 <= p <= 1
ã®åãæ¬¡å
ã®ã¹ã«ã©ãŒãŸãã¯ãã³ãœã«ã䜿çšã§ããŸãã ãã®ããŒãžã§ã³ã¯ãã»ãã³ãã£ã¯ã¹ãç°ãªããããäžå€ã®ãªãã·ã§ã³ãšåºå¥ããããšãéèŠã§ãã åŒã³åºãy = x.bernoulli()
y.bernoulli_(x)
y = x.bernoulli()
åçã§ãã ããã®x
ã¯ãååžãã©ã¡ãŒã¿ã®ãã³ãœã«ãšããŠäœ¿çšãããŸããtorch.eye(n, m)
nxm
åäœè¡åãäœæããŸãã ããã§ã¯ãç§ã«ã¯äžæãªçç±ã§ãã€ã³ãã¬ãŒã¹ãªãã·ã§ã³ã¯ããååšããŸããã
ææ°ååžããã³å¹Ÿäœååžãã³ãŒã·ãŒååžãæ£èŠååžã®å¯Ÿæ°ãããã³ãã³ãœã«ãåæåããããã®ããã€ãã®ããè€éãªãªãã·ã§ã³ãå©çšã§ããŸãã ããã¥ã¡ã³ããã芧ãã ããã
æ°åŠæŒç®
æãé »ç¹ã«äœ¿çšãããã°ã«ãŒãã ããã§ã®æäœããã³ãœã«ã®ãµã€ãºãšã¿ã€ãã倿Žããªãå Žåãã€ã³ãã¬ãŒã¹ãªãã·ã§ã³ããããŸãã
z = x.add(y)
z = torch.add(x, y)
x.add_(y)
远å ãz = x.sub(y)
z = torch.sub(x, y)
x.sub_(y)
æžç®z = x.mul(y)
z = torch.mul(x, y)
x.mul_(y)
ä¹ç®z = x.div(y)
z = torch.div(x, y)
x.div_(y)
éšéã æŽæ°åã®å Žåãé€ç®ã¯æŽæ°ã§ããz = x.exp()
z = torch.exp(x)
x.exp_()
åºå±è
ãz = x.log()
z = torch.log(x)
x.log_()
èªç¶å¯Ÿæ°ãz = x.log1p()
z = torch.log1p(x)
x.log1p_()
x + 1
ã®èªç¶å¯Ÿæ°ã ãã®é¢æ°ã¯ãå°ããªx
ã®èšç®ã®ç²ŸåºŠã«å¯ŸããŠæé©åãããŠããŸããz = x.abs()
z = torch.abs(x)
x.abs_()
ã¢ãžã¥ãŒã«
åœç¶ã®ããšãªããããã¹ãŠã®åºæ¬çãªäžè§é¢æ°æŒç®ã¯ãããããæåŸ
ããã圢ã§ååšããŸãã ããã§ãããããªé¢æ°ã«ç®ãåããŸãã
z = xt()
z = torch.t(x)
x.t_()
転眮ã ãã³ãœã«ã®ãµã€ãºãå€åãããšããäºå®ã«ãããããããã¡ã¢ãªå
ã®ããŒã¿ã®ãµã€ãºã¯åããŸãŸãªã®ã§ã颿°ã®ã€ã³ãã¬ãŒã¹ããŒãžã§ã³ããããŸããz = x.mm(y)
z = torch.mm(x, y)
è¡åã®ä¹ç®ãz = x.mv(v)
z = torch.mv(x, v)
è¡åãšãã¯ãã«ã®ä¹ç®ãz = x.dot(y)
z = torch.dot(x, y)
ãã³ãœã«ã®ã¹ã«ã©ãŒä¹ç®ãbz = bx.bmm(by)
bz = torch.bmm(bx, by)
ãããªãã¯ã¹ãšãããå
šäœãä¹ç®ããŸãã
>>> bx = torch.randn(10, 3, 4) >>> by = torch.randn(10, 4, 5) >>> bz = bx.bmm(bz) >>> bz.size() torch.Size([10, 3, 5])
addbmm
ã addmm
ã addmv
ã addr
ã baddbmm
ã btrifact
ã btrisolve
ã eig
ã btrisolve
ãªã©ãè€éãªã·ã°ããã£ãæã€BLAS颿°ã®å®å
šãªé¡äŒŒç©ããããŸãã
åæžæäœã¯ã眲åãäºãã«äŒŒãŠããŸãã ãããã®ã»ãšãã©ãã¹ãŠããæåŸã®ãªãã·ã§ã³åŒæ°ãšãšãã«ã dim
çž®å°ãå®è¡ãããæ¬¡å
ãåãå
¥ããŸãã åŒæ°ãæå®ãããŠããªãå ŽåãæŒç®ã¯ãã³ãœã«å
šäœã«äœçšããŸãã
s = x.mean(dim)
s = torch.mean(x, dim)
ãµã³ãã«å¹³åã 宿°å€ã®ãã³ãœã«ã«å¯ŸããŠã®ã¿å®çŸ©ãããŸããs = x.std(dim)
s = torch.std(x, dim)
éžæçãªæšæºåå·®ã 宿°å€ã®ãã³ãœã«ã«å¯ŸããŠã®ã¿å®çŸ©ãããŸããs = x.var(dim)
s = torch.var(x, dim)
éžæç忣ã 宿°å€ã®ãã³ãœã«ã«å¯ŸããŠã®ã¿å®çŸ©ãããŸããs = x.median(dim)
s = torch.median(x, dim)
äžå€®å€s = x.sum(dim)
s = torch.sum(x, dim)
éãs = x.prod(dim)
s = torch.prod(x, dim)
ä»äºãs = x.max(dim)
s = torch.max(x, dim)
æå€§ãs = x.min(dim)
s = torch.min(x, dim)
æäœéã
ãã¹ãŠã®çš®é¡ã®æ¯èŒæŒç®ïŒ eq
ã ne
ã gt
ã lt
ã ge
ã le
ïŒãå®çŸ©ãããŠãããäœæ¥ã®çµæãšããŠByteTensor
ãã¹ã¯ãè¿ããŸãã
+
ã +=
ã -
ã -=
ã *
ã *=
ã /
ã /=
ã @
æŒç®åã¯ãäžèšã®å¯Ÿå¿ãã颿°ãåŒã³åºãããšã§ãæåŸ
ã©ããã«æ©èœããŸãã ãã ããAPIã®è€éããšäžå®å
šãªèªææ§ã®ãããæŒç®åã®äœ¿çšã¯ãå§ãããŸãããã代ããã«å¿
èŠãªé¢æ°ã®æç€ºçãªåŒã³åºãã䜿çšããŸãã å°ãªããšã2ã€ã®ã¹ã¿ã€ã«ãæ··åšãããªãã§ãã ãããããã«ããã x += x.mul_(2)
ãããªãšã©ãŒãåé¿ã§ããŸãã
PyTorchã«ã¯ããœãŒãã颿°ã®èŠçŽ ããšã®é©çšãªã©ãå€ãã®è峿·±ã颿°ããŸã ã¹ããã¯ãããŠããŸããããããã®ãã¹ãŠããã£ãŒãã©ãŒãã³ã°ã§äœ¿çšãããããšã¯ã»ãšãã©ãããŸããã PyTorchããã³ãœã«èšç®ã®ã©ã€ãã©ãªãšããŠäœ¿çšããå Žåã¯ããããè¡ãåã«ããã¥ã¡ã³ããåç
§ããããšãå¿ããªãã§ãã ããã
æŸéæŸé
æŸéã¯è€éãªãããã¯ã§ãã ç§ã®æèŠã§ã¯ãããã§ãªããã°è¯ããšæããŸãã ããããåœŒã¯ææ°ã®ãªãªãŒã¹ã®1ã€ã«ããç»å ŽããŸããã§ããã PyTorchã®å€ãã®æäœã¯ãä»ã§ã¯äœ¿ãæ
£ããNumPyã¹ã¿ã€ã«ã§ã®ãããŒããã£ã¹ãããµããŒãããŠããŸãã
äžè¬çã«ã2ã€ã®ç©ºã§ãªããã³ãœã«ã¯ãæåŸã®æž¬å®ããéå§ããŠããã®æ¬¡å
ã®äž¡æ¹ã®ãã³ãœã«ã®ãµã€ãºãçããããã©ã¡ããäžæ¹ã®ãµã€ãºã1ã«çãããããã³ãœã«ã®æž¬å®å€ããã¯ãååšããªãå Žåã ãããŒããã£ã¹ãå¯èœãšåŒã°ããŸãã äŸã§çè§£ãããããªããŸããã
>>> x = torch.FloatTensor(5, 7, 3) >>> y = torch.FloatTensor(5, 7, 3)
>>> x = torch.FloatTensor(5, 3, 4, 1) >>> y = torch.FloatTensor( 3, 1, 1)
>>> x = torch.FloatTensor(5, 2, 4, 1) >>> y = torch.FloatTensor( 3, 1, 1)
>>> x = torch.FloatTensor() >>> y = torch.FloatTensor(2, 2)
次å
ãã³ãœã«torch.Size([1])
ã¯ã¹ã«ã©ãŒã§ãããæããã«ä»ã®ãã³ãœã«ã§ãããŒããã£ã¹ãå¯èœã§ãã
ãããŒããã£ã¹ãããçãããã³ãœã«ã®ãµã€ãºã¯ã次ã®ããã«èšç®ãããŸãã
- ãã³ãœã«ã®æž¬å®æ°ãçãããªãå Žåãå¿
èŠã«å¿ããŠåäœã远å ãããŸãã
- 次ã«ãçµæã®ãã³ãœã«ã®ãµã€ãºãåæãã³ãœã«ã®èŠçŽ ããšã®æå€§å€ãšããŠèšç®ãããŸãã
>>> x = torch.FloatTensor(5, 1, 4, 1) >>> y = torch.FloatTensor( 3, 1, 1) >>> (x+y).size() torch.Size([5, 3, 4, 1])
ãã®äŸã§ã¯ã2çªç®ã®ãã³ãœã«ã®æ¬¡å
ã«æåã«åäœã远å ããããã®åŸãèŠçŽ ããšã®æå€§å€ãçµæã®ãã³ãœã«ã®æ¬¡å
ãæ±ºå®ããŸããã
ãã£ããã¯ã€ã³ãã¬ãŒã¹æäœã§ãã åæãã³ãœã«ã®ãµã€ãºãå€ãããªãå Žåã«ã®ã¿ããããŒããã£ã¹ããèš±å¯ãããŸãã
>>> x = torch.FloatTensor(5, 3, 4, 1) >>> y = torch.FloatTensor( 3, 1, 1) >>> (x.add_(y)).size() torch.Size([5, 3, 4, 1])
>>> x=torch.FloatTensor(1, 3, 1) >>> y=torch.FloatTensor(3, 1, 7) >>> (x.add_(y)).size()
RuntimeError: The expanded size of the tensor (1) must match the existing size (7) at non-singleton dimension 2.
2çªç®ã®ã±ãŒã¹ã§ã¯ããã³ãœã«ã¯æããã«ãããŒããã£ã¹ãå¯èœã§ãããã€ã³ãã¬ãŒã¹æäœã¯èš±å¯ãããŸãããããã¯ããã®éã«x
ããµã€ãºå€æŽãããããã§ãã
Numpyããæ»ã£ãŠ
torch.from_numpy(n)
ããã³x.numpy()
ã䜿çšããŠãããã©ã€ãã©ãªã®ãã³ãœã«ãå¥ã®ã©ã€ãã©ãªã®ãã³ãœã«ã«å€æã§ããŸãã
ãã®å Žåããã³ãœã«ã¯åãå
éšã¹ãã¬ãŒãžã䜿çšãããããããŒã¿ã®ã³ããŒã¯è¡ãããŸããã
>>> import torch >>> import numpy as np >>> a = np.random.rand(3, 3) >>> a array([[ 0.3191423 , 0.75283128, 0.31874139], [ 0.0077988 , 0.66912423, 0.3410516 ], [ 0.43789109, 0.39015864, 0.45677317]]) >>> b = torch.from_numpy(a) >>> b 0.3191 0.7528 0.3187 0.0078 0.6691 0.3411 0.4379 0.3902 0.4568 [torch.DoubleTensor of size 3x3] >>> b.sub_(b) 0 0 0 0 0 0 0 0 0 [torch.DoubleTensor of size 3x3] >>> a array([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]])
ããã«é¢ããŠãç§ã¯èæ
®ããããã³ãœã«ã©ã€ãã©ãªPyTorchã®ãã¹ãŠã®äž»èŠãªç¹ãèæ
®ããããšãææ¡ããŸãã èªè
ããPyTorchã§ä»»æã®é¢æ°ã®çŽæ¥ãã¹ãå®è£
ããããšã¯ãNumPyã§ãããè¡ãããšããé£ãããªãããšãçè§£ããããšãé¡ã£ãŠããŸãã æäœãã€ã³ãã¬ãŒã¹ããäž»èŠãªé¢æ°ã®ååãèŠããŠããå¿
èŠããããŸãã ããšãã°ãsoftmaxã¢ã¯ãã£ããŒã·ã§ã³æ©èœãåããã©ã€ã³ã¬ã€ã€ãŒïŒ
def LinearSoftmax(x, w, b): s = x.mm(w).add_(b) s.exp_() s.div_(s.sum(1)) return s
ã¯ãŒã

ããã§ã¯ãã¹ãŠãåçŽã§ãããã³ãœã«ã¯ããããã»ããµäžããŸãã¯ããããªã«ãŒãäžãã®ã©ã¡ãã§ã䜿çšã§ããŸãã 確ãã«ã圌ãã¯éåžžã«çްå¿ã®æ³šæãæã£ãŠãããNvidiaã®ãããªã«ãŒãã§ã®ã¿ã©ã€ãããæãå€ããã®ã§ã¯ãããŸããã ããã©ã«ãã§ã¯ããã³ãœã«ã¯CPUäžã«äœæãããŸãã
x = torch.FloatTensor(1024, 1024).uniform_()
ãããªã«ãŒãã®ã¡ã¢ãªã空ã§ãã
0MiB / 4036MiB
1åã®åŒã³åºãã§ããã³ãœã«ãGPUã«ç§»åã§ããŸãã
x = x.cuda()
åæã«ã nvidia-smi
ã¯ã python
ããã»ã¹ããããªã¡ã¢ãªã®äžéšãnvidia-smi
ããšã瀺ããŸãã
205MiB / 4036MiB
x.is_cuda
ããããã£ã¯ããã³ãœã«x
ãçŸåšã©ãã«ããããçè§£ããã®ã«åœ¹ç«ã¡ãŸãã
>>> x.is_cuda True
å®éã«ã¯ã x.cuda()
ã¯ãã³ãœã«ã®ã³ããŒãè¿ããŸãããç§»åããŸããã
ãããªã¡ã¢ãªå
ã®ãã³ãœã«ãžã®ãã¹ãŠã®åç
§ãæ¶ãããšãPyTorchã¯ãããå³åº§ã«åé€ããŸããã 代ããã«ã次ã«å²ãåœãŠããããšãã«ããããªã¡ã¢ãªã®ãã®ã»ã¯ã·ã§ã³ãåå©çšããããã¯ãªã¢ããŸãã
è€æ°ã®ãããªã«ãŒããããå Žåã x.cuda(device=None)
颿°x.cuda(device=None)
ã¯ããã³ãœã«ããªãã·ã§ã³ã®åŒæ°ãšããŠé
眮ãããããªã«ãŒãã®çªå·ãåãã§åãå
¥ãã x.get_device()
颿°ã¯x
ãã³ãœã«ãé
眮ãããŠããããã€ã¹ã衚瀺ããŸãã x.cpu()
颿°ã¯ããããªã«ãŒãããããã»ããµã«ãã³ãœã«ãã³ããŒããŸãã
åœç¶ãç°ãªãããã€ã¹ã«ãããã³ãœã«ã䜿çšããŠæäœãå®è¡ããããšã¯ã§ããŸããã
ããã§ã¯ãããšãã°ããããªã«ãŒãã§2ã€ã®ãã³ãœã«ãä¹ç®ããçµæãRAMã«æ»ãæ¹æ³ã瀺ããŸãã
>>> import torch >>> a = torch.FloatTensor(10000, 10000).uniform_() >>> b = torch.FloatTensor(10000, 10000).uniform_() >>> c = a.cuda().mul_(b.cuda()).cpu()
ãããŠããããã¯ãã¹ãŠã€ã³ã¿ãŒããªã¿ãŒããçŽæ¥å©çšã§ããŸãïŒ åãTensorFlowã³ãŒããæ³åããŠãã ãããããã§ã¯ãã°ã©ããã»ãã·ã§ã³ãäœæããã°ã©ããã³ã³ãã€ã«ãã倿°ãåæåããã»ãã·ã§ã³ã§ã°ã©ããå®è¡ããå¿
èŠããããŸãã PyTorchã䜿çšãããšã1è¡ã®ã³ãŒãã§ãããªã«ãŒãã®ãã³ãœã«ãäžŠã¹æ¿ããããšãã§ããŸãã
ãã³ãœã«ã¯ãããªã«ãŒãã«ã³ããŒã§ããã ãã§ãªããçŽæ¥äœæããããšãã§ããŸãã ãããè¡ãã«ã¯ã torch.cuda
ã¢ãžã¥ãŒã«ã䜿çšããŸãã
Tensor = FloatTensor
ãšããçç¥åœ¢torch.cuda
ãŸããã
torch.cuda.device(device)
ã³ã³ããã¹ããããŒãžã£ãŒã䜿çšãããšãæå®ããããããªã«ãŒãã§å®çŸ©ããããã¹ãŠã®ãã³ãœã«ãäœæã§ããŸãã ä»ã®ããã€ã¹ããã®ãã³ãœã«ã«å¯Ÿããæäœã®çµæã¯ãæ¬æ¥ããã¹ãå Žæã«æ®ããŸãã x.cuda(device=None)
ããx.cuda(device=None)
ãã³ã³ããã¹ããããŒãžã£ãŒãæç€ºããå€ãããé«ããªã£ãŠããŸãã
x = torch.cuda.FloatTensor(1)
CPUã®ãã³ãœã«ã§ã®ã¿äœ¿çšå¯èœãªx.pin_memory()
颿°ã¯ããã³ãœã«ãããŒãžããã¯ãããã¡ã¢ãªé åã«ã³ããŒããŸãã ãã®ç¹åŸŽã¯ãããã»ããµãŒã®é¢äžãªãã«ãGPUããã®ããŒã¿ãGPUã«è¿
éã«ã³ããŒã§ããããšã§ãã x.is_pinned()
ã¡ãœããã¯ããã³ãœã«ã®çŸåšã®ã¹ããŒã¿ã¹ã衚瀺ããŸãã ãã³ãœã«ãããŒãžããã¯ã¡ã¢ãªã«æ ŒçŽããx.cuda(device=None, async=False)
ãååä»ããã©ã¡ãŒã¿ãŒasync=True
ãx.cuda(device=None, async=False)
颿°ã«x.cuda(device=None, async=False)
ããããªã«ãŒãã«éåæã§ãã³ãœã«ãããŒãããããã«èŠæ±ã§ããŸãã ãã®ãããã³ãŒãã¯ã³ããŒãå®äºããã®ãåŸ
ããã«ããã®éã«äœã圹ã«ç«ã€ããšããããããããŸããã
x.is_pinned() == False
å Žåã async
ãã©ã¡ãŒã¿ãŒã¯å¹æããããŸããã ããã«ãããšã©ãŒãçºçããŸããã
ã芧ã®ãšããããããªã«ãŒãã§ã®ã³ã³ãã¥ãŒãã£ã³ã°ã«ä»»æã®ã³ãŒããé©å¿ãããã«ã¯ããã¹ãŠã®ãã³ãœã«ããããªã¡ã¢ãªã«ã³ããŒããã ãã§ãã ãã³ãœã«ãåãããã€ã¹äžã«ããå Žåãã»ãšãã©ã®æäœã¯ãã³ãœã«ã®äœçœ®ãæ°ã«ããŸããã
èªåå·®å¥å

torch.autograd
ã¢ãžã¥ãŒã«ã«å«ãŸããèªåå·®å¥åã¡ã«ããºã ã¯ãã¡ã€ã³ã§ã¯ãããŸããããééããªãã©ã€ãã©ãªã®æãéèŠãªã³ã³ããŒãã³ãã§ããããããªãã§ã¯ãã¹ãŠã®æå³ã倱ããŸãã
ç¹å®ã®ãã€ã³ãã§ã®é¢æ°ã®åŸé
ã®èšç®ã¯ãæé©åææ³ã®äžå¿çãªæäœã§ãããæé©åææ³ã¯ãã¹ãŠã®ãã£ãŒãã©ãŒãã³ã°ã«åºã¥ããŠããŸãã ããã§åŠã¶ããšã¯æé©åãšå矩ã§ãã ãã€ã³ãã§é¢æ°ã®åŸé
ãèšç®ããäž»ãªæ¹æ³ã¯3ã€ãããŸãã
- æé差忳ã«ããæ°å€ã
- 象城çã«ã
- èªå埮åã®ææ³ã䜿çšããŸãã
æåã®æ¹æ³ã¯ã粟床ãäœããããçµæãæ€èšŒããããã«ã®ã¿äœ¿çšãããŸãã å°é¢æ°ã®èšå·èšç®ã¯ãçŽãšéçã䜿çšããŠæåã§è¡ãã®ãšåçã§ãããèŠåã®ãªã¹ããèšå·ããªãŒã«é©çšããããšã«ãããŸãã èªåå·®å¥åã«ã€ããŠã¯ãæ¬¡ã®æ®µèœã§èª¬æããŸãã CaffeãCNTKãªã©ã®ã©ã€ãã©ãªã¯ãäºåã«èšç®ããã颿°ã®ã·ã³ããªãã¯å°é¢æ°ã䜿çšããŸãã TheanoãšTensorFlowã¯ãæ¹æ³2ãš3ã®çµã¿åããã䜿çšããŸãã
èªå埮åïŒADïŒã¯ã颿°ã®åŸé
ãèšç®ããããã®ããªãåçŽã§éåžžã«æçœãªææ³ã§ãã ã€ã³ã¿ãŒãããã䜿çšããã«ãç¹å®ã®æç¹ã§æ©èœãå·®å¥åããåé¡ã解決ããããšãããšãééããªãADã«ãªããŸãã
ãããADã®ä»çµã¿ã§ãã ç§ãã¡ã«ãšã£ãŠèå³ã®ãã颿°ã¯ãããã€ãã®åºæ¬é¢æ°ã®åæãšããŠè¡šçŸããããšãã§ãããã®æŽŸç颿°ã¯ç§ãã¡ã«ç¥ãããŠããŸãã æ¬¡ã«ãè€éãªé¢æ°ã®åŸ®åã®ã«ãŒã«ã䜿çšããŠãç®çã®å°é¢æ°ã«å°éãããŸã§æ¬¡ç¬¬ã«é«ããªããŸãã ããšãã°ã2ã€ã®å€æ°ã®é¢æ°ãèããŸã
fïŒx1ãx2ïŒ=x1x2+x21.
åæå®
w1=x1ã
w2=x2ã
w3=w1w2ã
w4=w21ã
w5=w3+w4
â .
,
âf(xâ1,xâ2)âx1.
âfâx1=âfâw5âw5âx1=âfâw5[âw5âw4âw4âx1+âw5âw3âw3âx1]=â¯
â â . . , â .
âw1(xâ1,xâ2)âx1=1
âw2(xâ1,xâ2)âx1=0
âw3(xâ1,xâ2)âx1=âw1(xâ1,xâ2)âx1w2+âw2(xâ1,xâ2)âx1w1=xâ2
âw4(xâ1,xâ2)âx1=2w1âw1(xâ1,xâ2)âx1=2xâ1
âw5(xâ1,xâ2)âx1=âw3(xâ1,xâ2)âx1+âw4(xâ1,xâ2)âx1=xâ2+2xâ1
âf(xâ1,xâ2)âx1=âf(xâ1,xâ2)âw5âw5(xâ1,xâ2)âx1=xâ2+2xâ1
. , . , â , . , â .
AD, 20 Python! . .
class Varaible: def __init__(self, value, derivative): self.value = value self.derivative = derivative
, , .
def __add__(self, other): return Varaible( self.value + other.value, self.derivative + other.derivative )
def __mul__(self, other): return Varaible( self.value * other.value, self.derivative * other.value + self.value * other.derivative ) def __pow__(self, other): return Varaible( self.value ** other, other * self.value ** (other - 1) )
x1
.
def f(x1, x2): vx1 = Varaible(x1, 1) vx2 = Varaible(x2, 0) vf = vx1 * vx2 + vx1 ** 2 return vf.value, vf.derivative print(f(2, 3))
Variable
torch.autograd
. , , , PyTorch . , , . äŸãèŠãŠã¿ãŸãããã
>>> from torch.autograd import Variable >>> x = torch.FloatTensor(3, 1).uniform_() >>> w = torch.FloatTensor(3, 3).uniform_() >>> b = torch.FloatTensor(3, 1).uniform_() >>> x = Variable(x, requires_grad=True) >>> w = Variable(w) >>> b = Variable(b) >>> y = w.mv(x).add_(b) >>> y Variable containing: 0.7737 0.6839 1.1542 [torch.FloatTensor of size 3] >>> loss = y.sum() >>> loss Variable containing: 2.6118 [torch.FloatTensor of size 1] >>> loss.backward() >>> x.grad Variable containing: 0.2743 1.0872 1.6053 [torch.FloatTensor of size 3]
: Variable
, . x.backward()
, requires_grad=True
. x.grad
. x.data
.
, Variable
.
x.requires_grad
, . : , .
, inplace . , , Variable
, . : , immutable . mutable . : PyTorch -, .
äŸ

FaceResNet-1337
. PyTorch, , , . , .
, Deep Function Machines: Generalized Neural Networks for Topological Layer Expression . . , . , , , . :
Vn(v)=â«n+1n(uân)wl(u,v)dÎŒ(u)
Qn(v)=â«n+1nwl(u,v)dÎŒ(u)
Wn,j=Qn(j)âVn(j)+Vnâ1(j)
WN,j=VNâ1(j)
W1,j=Q1(j)âV1(j)
. w
â , W
â , . W
, - , , w
. ? PyTorch â . .
import numpy as np import torch from torch.autograd import Variable def kernel(u, v, s, w, p): uv = Variable(torch.FloatTensor([u, v])) return s[0] + w.mv(uv).sub_(p).cos().dot(s[1:])
.
def integrate(fun, a, b, N=100): res = 0 h = (b - a) / N for i in np.linspace(a, b, N): res += fun(a + i) * h return res
.
def V(v, n, s, w, p): fun = lambda u: kernel(u, v, s, w, p).mul_(u - n) return integrate(fun, n, n+1) def Q(v, n, s, w, p): fun = lambda u: kernel(u, v, s, w, p) return integrate(fun, n, n+1) def W(N, s, w, p): Qp = lambda v, n: Q(v, n, s, w, p) Vp = lambda v, n: V(v, n, s, w, p) W = [None] * N W[0] = torch.cat([Qp(v, 1) - Vp(v, 1) for v in range(1, N + 1)]) for j in range(2, N): W[j-1] = torch.cat([Qp(v, j) - Vp(v, j) + Vp(v, j - 1) for v in range(1, N + 1)]) W[N-1] = torch.cat([ Vp(v, N-1) for v in range(1, N + 1)]) W = torch.cat(W) return W.view(N, N).t()
.
s = Variable(torch.FloatTensor([1e-5, 1, 1]), requires_grad=True) w = Variable(torch.FloatTensor(2, 2).uniform_(-1e-5, 1e-5), requires_grad=True) p = Variable(torch.FloatTensor(2).uniform_(-1e-5, 1e-5), requires_grad=True)
.
data_x_t = torch.FloatTensor(100, 3).uniform_() data_y_t = data_x_t.mm(torch.FloatTensor([[1, 2, 3]]).t_()).view(-1)
.
alpha = -1e-3 for i in range(1000): data_x, data_y = Variable(data_x_t), Variable(data_y_t) Wc = W(3, s, w, p) y = data_x.mm(Wc).sum(1) loss = data_y.sub(y).pow(2).mean() print(loss.data[0]) loss.backward() s.data.add_(s.grad.data.mul(alpha)) s.grad.data.zero_() w.data.add_(w.grad.data.mul(alpha)) w.grad.data.zero_() p.data.add_(p.grad.data.mul(alpha)) p.grad.data.zero_()
. .

. 3d matplotlib , . , , , 15 . . TensorFlow⊠, TensorFlow. PyTorch . , PyTorch . , PyTorch , .
.
data_x, data_y = Variable(data_x_t), Variable(data_y_t)
, . - , , : .
loss.backward()
, , .
s.data.add_(s.grad.data.mul(alpha))
(), . .
s.grad.data.zero_()
backward()
, .
, : PyTorch , , , Keras.
ãããã«

PyTorch: , cuda . PyTorch .
, PyTorch . , . : PyTorch , . , Caffe, DSL TensorFlow. PyTorch , , .
, , torch.nn
torch.optim
. torch.utils.data
. torchvision
. .
PyTorch . . - . , . .
èªãã§ãããŠããããšãïŒ , , , . .