ããã«ã¡ã¯ãHabrïŒ
5ææ«ãŸã§ã«ãFrancoisScholléã®èæžã
Deep Learning in Python ãã®ç¿»èš³çïŒKerasããã³Tensorflowã©ã€ãã©ãªã䜿çšããäŸïŒããããŸãã ãèŠéããªãïŒ

ãããããã¡ãããç§ãã¡ã¯å·®ãè¿«ã£ãæªæ¥ã«ç®ãåããããã«é©æ°çãª
PyTorchã©ã€ãã©ãªã詳ãã
調ã¹å§ããŸãã ä»æ¥ãããŒã¿ãŒã»ãŽãŒã«ãºããã®èšäºã翻蚳ããããã«æ³šæãä¿ããŸããããŒã¿ãŒã»ãŽãŒã«ãºããã¯ããã®ã©ã€ãã©ãªã®æ
£ã芪ããã ãã¢ãŒã«
é·ãæéããããæºåãã§ããŠããŸãã ã«ããã®äžã§ããããé¢çœãã
éå»2幎éãç§ã¯
TensorFlowã«çå£ã«åãçµãã§ã
ãŸãããã®ã©ã€ãã©ãª
ã«é¢ããèšäºã
æžããã ãããã¯ãšã³ãã®æ¡åŒµ
ã«é¢ããè¬çŸ©ãè¡ã£ããããã£ãŒãã©ãŒãã³ã°ã«é¢é£ãã
èªåã®ç 究ã§ããã䜿çšããã
ããŸãã ã ãã®äœæ¥äžã«ãTensorFlowã®é·æãšçæãããç解ããŸããããŸãã競äºã®äœå°ãæ®ãç¹å®ã®ã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã«ã€ããŠãç¥ããŸããã ãã®è·ç©ã§ãç§ã¯æè¿FacebookïŒFAIRïŒã®
人工ç¥èœç 究éšéã®PyTorchããŒã ã«åå ããŸãããããã¯ããããçŸåšTensorFlowã®æ匷ã®ã©ã€ãã«ã§ãã çŸåšãPyTorchã¯ç 究ã³ãã¥ããã£ã§éåžžã«äººæ°ããããŸãã çç±-次ã®æ®µèœã§èª¬æããŸãã
ãã®èšäºã§ã¯ãPyTorchã©ã€ãã©ãªãŒã®æŠèŠãæ瀺ãããã®äœæç®çã説æãããã®APIã玹ä»ããŸãã
å
šäœåãšå²åŠãŸããåºæ¬çãªèŠ³ç¹ããPyTorchãäœã§ããããPyTorchãæäœããéã«é©çšããå¿
èŠãããããã°ã©ãã³ã°ã¢ãã«ãããã³çŸä»£ã®ãã£ãŒãã©ãŒãã³ã°ããŒã«ã®ãšã³ã·ã¹ãã ã«ã©ã®ããã«é©åããããæ€èšããŸãã
æ¬è³ªçã«ãPyTorchã¯NumPyã®ãããªGPUå éãã³ãœã«èšç®ãæäŸããPythonã©ã€ãã©ãªã§ãã ããã«ãPyTorchã¯ããã¥ãŒã©ã«ãããã¯ãŒã¯ã«é¢é£ããã¢ããªã±ãŒã·ã§ã³ã解決ããããã®è±å¯ãªAPIãæäŸããŸãã
PyTorchã¯ä»ã®æ©æ¢°åŠç¿ãã¬ãŒã ã¯ãŒã¯ãšã¯ç°ãªããTensorFlowã
Caffe2ããŸãã¯
MXNetã®ããã«ãäºåã«å³åº§ã«ãã€æ確ã«å®çŸ©ãããéçãªèšç®ã°ã©ãã䜿çšããŸããã 察ç
§çã«ãPyTorchã§èšç®ãããã°ã©ãã¯åçã§ããããã®å Žã§æ±ºå®ãããŸãã ãããã£ãŠãPyTorchã¢ãã«ã§ã¬ã€ã€ãŒãåŒã³åºããã³ã«ãæ°ããèšç®ã°ã©ããåçã«æ±ºå®ãããŸãã ãã®ã°ã©ãã¯æé»çã«äœæãããŸããã€ãŸããã©ã€ãã©ãªèªäœãããã°ã©ã ãééããããŒã¿ã®æµããèšé²ããé¢æ°åŒã³åºãïŒããŒãïŒãïŒãšããžãä»ããŠïŒèšç®ã°ã©ãã«ãªã³ã¯ããŸãã
åçã°ã©ããšéçã°ã©ãã®æ¯èŒéçã°ã©ããšåçã°ã©ãã®éãã詳ããèŠãŠã¿ãŸãããã äžè¬ã«ãã»ãšãã©ã®ããã°ã©ãã³ã°ç°å¢ã§ã¯ãæ°å€ãè¡šã2ã€ã®å€æ°xãšyãå ç®ãããšããããã®åèšå€ãåŸãããŸãïŒå ç®ã®çµæïŒã ããšãã°ãPythonã®å ŽåïŒ
In [1]: x = 4 In [2]: y = 2 In [3]: x + y Out[3]: 6
ããããTensorFlowã§ã¯ããã§ã¯ãããŸããã TensorFlowã§ã¯ãxãšyã¯ãã®ãããªæ°å€ã§ã¯ãªãããããã®å€ãè¡šããæ瀺çã«å«ãŸããŠããªãã°ã©ãããŒãã®èšè¿°åã§ãã ããã«ïŒããã«éèŠã§ãïŒã
x
ãš
y
è¿œå ãããšããããã®æ°å€ã®åèšã§ã¯ãªããèšç®ãããã°ã©ãã®èšè¿°åãååŸããŸããããã«ãããå®è¡åŸã«ã®ã¿ç®çã®å€ãåŸãããŸãã
In [1]: import tensorflow as tf In [2]: x = tf.constant(4) In [3]: y = tf.constant(2) In [4]: x + y Out[4]: <tf.Tensor 'add:0' shape=() dtype=int32>
åºæ¬çã«ãTensorFlowã³ãŒããèšè¿°ãããšããããã¯å®éã«ã¯ããã°ã©ãã³ã°ã§ã¯ãªãã
ã¡ã¿ããã°ã©ãã³ã°ã§ãã ç§ãã¡ã¯ããã°ã©ã ïŒç§ãã¡ã®ã³ãŒãïŒãæžããããã¯å¥ã®ããã°ã©ã ïŒèšç®ãããTensorFlowã°ã©ãïŒãäœæããŸãã åœç¶ãæåã®ããã°ã©ãã³ã°ã¢ãã«ã¯2çªç®ã®ããã°ã©ãã³ã°ã¢ãã«ãããã¯ããã«åçŽã§ãã ãããã®
è¡šçŸããããã
å®éã®çŸè±¡ã®æèã§è©±ããŠãæšè«ããã®ã¯ã¯ããã«äŸ¿å©ã§ãã
PyTorchã®æãéèŠãªå©ç¹ã¯ããã®å®è¡ã¢ãã«ã2çªç®ã®ãã©ãã€ã ãããæåã®ãã©ãã€ã ã«ã¯ããã«è¿ãããšã§ãã ã³ã¢ã§ã¯ãPyTorchã¯ãã³ãœã«ã³ã³ãã¥ãŒãã£ã³ã°ïŒNumPyãªã©ïŒããµããŒãããæãäžè¬çãªPythonã§ãããGPUã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ãã³ãœã«æäœãåããŠãããæãéèŠãªããšãšããŠãçµã¿èŸŒã¿ã®
èªå埮å ïŒADïŒãåããŠããŸãã ææ°ã®æ©æ¢°åŠç¿ã¢ã«ãŽãªãºã ã®ã»ãšãã©ã¯ç·åœ¢ä»£æ°ïŒè¡åãšãã¯ãã«ïŒã®ããŒã¿åã«å€§ããäŸåããŠãããåŸé
æ
å ±ã䜿çšããŠæšå®å€ã調æŽãããããããã2ã€ã®PyTorchæ±ã¯ä»»æã®å€§èŠæš¡ãªæ©æ¢°åŠç¿åé¡ã«å¯ŸåŠããã®ã«ååã§ãã
äžèšã®åçŽãªã±ãŒã¹ã®åæã«æ»ããšãPyTorchã䜿çšããããã°ã©ãã³ã°ããèªç¶ãªãPythonã®ããã«æããããšã確èªã§ããŸãã
In [1]: import torch In [2]: x = torch.ones(1) * 4 In [3]: y = torch.ones(1) * 2 In [4]: x + y Out[4]: 6 [torch.FloatTensor of size 1]
PyTorchã¯ãç¹å®ã®1ã€ã®åŽé¢ã§Pythonã®åºæ¬çãªããã°ã©ãã³ã°ããžãã¯ãšãããã«ç°ãªããŸããã©ã€ãã©ãªã¯å®è¡äžã®ããã°ã©ã ã®å®è¡ãèšé²ããŸãã ã€ãŸããPyTorchã¯ããã®ããŒã¿åã«å¯ŸããŠããããŠèå°è£ã§ãããªããå®è¡ããæäœãéãã«ã远跡ãããŠããŸãã -決æžã°ã©ããåéããŸãã ãã®ãããªèšç®ã°ã©ãã¯ã埮åãèšç®ããããã«çµæã®å€ãçæããäžé£ã®æäœã«æ²¿ã£ãŠå察æ¹åã«é²ãå¿
èŠããããããèªå埮åã«å¿
èŠã§ãïŒéèªå埮åã®å ŽåïŒã TensorFlowãŸãã¯MXNetã®ããŒãžã§ã³ãšãã®èšç®ã°ã©ãïŒãŸãã¯ãããããã®èšç®ã°ã©ããçµã¿ç«ãŠãæ¹æ³ïŒã®é倧ãªéãã¯ãåã³ãŒããã©ã°ã¡ã³ãã解éãããšãã«ãæ°ããã°ã©ããã貪欲ã«ããªã³ã¶ââãã©ã€ã§åéãããããšã§ãã
ããã©ããããTensorflowã§ã¯ãèšç®ãããã°ã©ãã¯äžåºŠã ãæ§ç¯ãããã¡ã¿ããã°ã©ã ïŒã³ãŒãïŒããããæ
åœããŸãã ããã«ãå€ã®å°é¢æ°ãèŠæ±ãããã³ã«PyTorchã¯ã°ã©ããå察æ¹åã«åçã«ãã©ããŒã¹ããŸãããTensorFlowã¯ã°ã©ãã«è¿œå ããŒããæ¿å
¥ãããããã®å°é¢æ°ãïŒæé»çã«ïŒèšç®ããä»ã®ãã¹ãŠã®ããŒããšãŸã£ããåãããã«è§£éããŸãã ããã§ã¯ãåçã°ã©ããšéçã°ã©ãã®éããç¹ã«é¡èã§ãã
ã©ã®èšç®ã°ã©ãã䜿çšãããïŒéçãŸãã¯åçïŒãéžæãããšããããã®ç°å¢ã®ããããã§ã®ããã°ã©ãã³ã°ããã»ã¹ã倧å¹
ã«ç°¡çŽ åãããŸãã å¶åŸ¡ã®æµãã¯ããã®éžæã«ãã£ãŠç¹ã«åœ±é¿ãåããåŽé¢ã§ãã éçã°ã©ãã䜿çšããç°å¢ã§ã¯ãå¶åŸ¡ãããŒã¯ã°ã©ãã¬ãã«ã§ç¹æ®ãªããŒãã®åœ¢åŒã§è¡šãå¿
èŠããããŸãã ããšãã°ã
tf.cond()
ã§ã¯ãåå²ã確å®ã«ããããã«ã3ã€ã®ãµãã°ã©ããå
¥åãšããŠåã
tf.cond()
æäœããããŸããæ¡ä»¶ä»ããµãã°ã©ããšã2ã€ã®æ¡ä»¶éçºãã©ã³ãïŒ
if
ããã³
else
2ã€ã®ãµãã°ã©ã
else
ã åæ§ã«ãTernsorflowã°ã©ãã®ã«ãŒãã¯tf.while
tf.while()
æäœãšããŠè¡šãå¿
èŠããããŸããããã¯ã
condition
ãšããŠ
body
ãµãã°ã©ããå
¥åãšããŠåãå
¥ããŸãã åçãªã°ã©ããããç¶æ³ã§ã¯ãããã¯ãã¹ãŠåçŽåãããŸãã ã°ã©ãã¯Pythonã³ãŒããããã®ãŸãŸè¡šç€ºãããããã解éããšã«ãä»ã®ããã°ã©ã ãšåæ§ã«ã
if
æ¡ä»¶ãš
while
ã«ãŒãã䜿çšããŠãããŒå¶åŸ¡ãèšèªã«ãã€ãã£ãã«å®è£
ã§ããŸãã ãããã£ãŠãäžåšçšã§æ··ä¹±ãæãTensorflowã³ãŒãïŒ
import tensorflow as tf x = tf.constant(2, shape=[2, 2]) w = tf.while_loop( lambda x: tf.reduce_sum(x) < 100, lambda x: tf.nn.relu(tf.square(x)), [x])
èªç¶ã§ç解å¯èœãªPyTorchã³ãŒãã«å€ãããŸãïŒ
import torch.nn from torch.autograd import Variable x = Variable(torch.ones([2, 2]) * 2) while x.sum() < 100: x = torch.nn.ReLU()(x**2)
åœç¶ãããã°ã©ãã³ã°ã®å®¹æãã®èŠ³ç¹ãããåçã°ã©ãã®äœ¿çšã¯ãããã¯ããã«è¶
ããŠããŸãã ïŒ
tf.Print()
ããŒãã䜿çšããã®ã§ã¯ãªãïŒ
print
ã¹ããŒãã¡ã³ãã䜿çšããŠããŸãã¯ãããã¬ãŒã§äžéå€ããã§ãã¯ã§ããããšã¯ããã§ã«å€§ããªãã©ã¹ã§ãã ãã¡ããããã€ãããºã ã¯ããã°ã©ãããªãã£ãæé©åããããã©ãŒãã³ã¹ãäœäžãããå¯èœæ§ããããŸããã€ãŸãããã®ãããªã°ã©ããæé©åããããšã¯ããå°é£ã§ãã ãããã£ãŠãPyTorchãšTensorFlowã®éããšãã¬ãŒããªãã¯ãPythonãªã©ã®åçãªè§£éèšèªãšãCãŸãã¯C ++ãªã©ã®éçãªã³ã³ãã€ã«èšèªãšã®éãšã»ãŒåãã§ãã åè
ã¯äœæ¥ãããç°¡åã§é«éã§ããã2çªç®ãš3çªç®ããéåžžã«æé©åå¯èœãªãšã³ãã£ãã£ãçµã¿ç«ãŠãæ¹ã䟿å©ã§ãã ããã¯ãæè»æ§ãšããã©ãŒãã³ã¹ã®ãã¬ãŒããªãã§ãã
PyTorch APIããŒãPyTorch APIã«ã€ããŠãç¹ã«TensorFlowãMXNetãªã©ã®ä»ã®ã©ã€ãã©ãªãšæ¯èŒãããã¥ãŒã©ã«ãããã¯ãŒã¯ã®èšç®ã«é¢ããŠãäžè¬çãªçºèšãããããšæããŸã-ãã®APIã¯å€ãã®ã¢ãžã¥ãŒã«ïŒãããããããããªãŒä»å±ãïŒã«ãã³ã°ã¢ããããŸãã ååã®äžäººãææããããã«ãTensorflow APIã¯å®éã«ã¯ãã¢ã»ã³ããªãã¬ãã«ãè¶
ããŠããŸããã§ããããšããã®ã¯ããã®APIã¯èšç®ã°ã©ãïŒå ç®ãä¹ç®ãç¹ããšã®é¢æ°ãªã©ïŒã®äœæã«å¿
èŠãªæãåçŽãªã¢ã»ã³ããªåœä»€ã®ã¿ãæäŸãããšããæå³ã§ã§ãã dãïŒã ããããããã°ã©ããŒãæäœäžã«äœååãåçŸããªããã°ãªããªãæãäžè¬çãªããã°ã©ã ãã©ã°ã¡ã³ãçšã®ãæšæºã©ã€ãã©ãªããæ¬ ããŠããŸãã ãããã£ãŠãTensorflowã®äžã«é«ã¬ãã«ã®APIãæ§ç¯ããã«ã¯ãã³ãã¥ããã£ã®å©ãã«é Œãå¿
èŠããããŸãã
å®éãã³ãã¥ããã£ã¯ãã®ãããªé«ã¬ãã«ã®APIãäœæããŸããã çå®ãæ®å¿µãªããã1ã€ã§ã¯ãªãã1ããŒã¹-ã©ã€ãã«é¢ä¿ã§ã ãããã£ãŠãæªãæ¥ã«ã¯ãå°éåéã«é¢ãã5ã€ã®èšäºãèªãããšãã§ããŸãã5ã€ãã¹ãŠã§ãTensorFlowã®ããŸããŸãªãããã³ããšã³ãããèŠã€ããããšãã§ããŸãã ååãšããŠããããã®APIã«ã¯ã»ãšãã©å
±éç¹ããªããããå®éã«ã¯TensorFlowã ãã§ãªã5ã€ã®ç°ãªããã¬ãŒã ã¯ãŒã¯ãåŠç¿ããå¿
èŠããããŸãã ãããã®APIã®äžã§æã人æ°ã®ãããã®ã以äžã«ç€ºããŸãã
PyTorchã¯ããã£ãŒãã©ãŒãã³ã°ã®åéã§ã®æ¥ã
ã®ç 究ã«å¿
èŠãªæãäžè¬çãªèŠçŽ ããã§ã«åããŠããŸãã ååãšããŠãtorch.nnããã±ãŒãžã«Kerasã®ãããªããã€ãã£ããAPIãããããã¥ãŒã©ã«ãããã¯ãŒã¯ã®é«ã¬ãã«ã¢ãžã¥ãŒã«ã®çµåãæäŸããŸãã
å
񂇑
ç³»ã«ãããPyTorchã®äœçœ®ãããã£ãŠãPyTorchãMXNetãTensorFlowãTheanoãªã©ã®éçã°ã©ããã¬ãŒã ã¯ãŒã¯ãšã©ã®ããã«ç°ãªããã説æãããšãå®éãPyTorchã¯ãã¥ãŒã©ã«ãããã¯ãŒã¯ãèšç®ããã¢ãããŒãã«ãããŠãŠããŒã¯ã§ã¯ãªãããšèšããããåŸãŸããã PyTorchããåã«ã¯ã
Chainerã
DyNetãªã©ãåæ§ã®åçAPIãæäŸããä»ã®ã©ã€ãã©ãªããã§ã«ååšããŠããŸããã ããããä»æ¥ãPyTorchã¯ãããã®éžæè¢ããã人æ°ããããŸãã
ããã«ãFacebookã§äœ¿çšããããã¬ãŒã ã¯ãŒã¯ã¯PyTorchã ãã§ã¯ãããŸããã çŸåšãæ¬çª
ç°å¢ã®äž»ãªã¯ãŒã¯ããŒãã¯
Caffe2ã«åœãŠã¯ãŸããŸããããã¯ã
Caffeã«åºã¥ããŠæ§ç¯ãããéçãªã°ã©ããã¬ãŒã ã¯ãŒã¯ã§ãã PyTorchã®ç 究è
ãçç£æé©åã®åéã§éçã°ã©ãã®å©ç¹ãæäŸããæè»æ§ãå人ã«æäŸããããã«ãFacebookã¯
ONNXãéçºããŠããŸãã
æåŸã«ãå°ããªæŽå²çäœè«ïŒPyTorchã®åã«ã
TorchããããŸãã-Lua
èšèªã§æžãããç§åŠèšç®çšã®éåžžã«å€ãïŒ2000幎代åæã®ãµã³ãã«ïŒã©ã€ãã©ãªã§ãã Torchã¯ãCã§èšè¿°ãããã³ãŒãããŒã¹ãã©ãããããããé«éãã€å¹ççã«ãªããŸãã ååãšããŠãPyTorchã¯ãŸã£ããåãããŒã¹ã®Cã³ãŒããã©ããããŸãïŒãã ã
ãæœè±¡åã®äžéã¬ãã«ãè¿œå ãããŸã ïŒãPythonã§ãŠãŒã¶ãŒAPIãå
¬éããŸãã 次ã«ããã®APIã«ã€ããŠPythonã§è©±ããŸãããã
PyTorchã䜿çšãã次ã«ãPyTorchã©ã€ãã©ãªã®åºæ¬æŠå¿µãšäž»èŠã³ã³ããŒãã³ãã«ã€ããŠèª¬æãããã®åºæ¬ããŒã¿åãèªåå·®å¥åã¡ã«ããºã ããã¥ãŒã©ã«ãããã¯ãŒã¯ã«é¢é£ããç¹å®ã®æ©èœãããã³ããŒã¿ã®ããŒããšåŠçã®ããã®ãŠãŒãã£ãªãã£ã調ã¹ãŸãã
ãã³ãœã«PyTorchã§æãåºæ¬çãªããŒã¿åã¯
tensor
ã§ãã ãã³ãœã«ããŒã¿åã®å€ãšæ©èœã¯ãNumPyã®
ndarray
ãšéåžžã«äŒŒãŠããŸãã ããã«ãPyTorchã¯NumPyãšã®åççãªçžäºéçšæ§ãç®æããŠããããã
tensor
APIã
ndarray
APIã«äŒŒãŠ
ndarray
ãŸãïŒãã ãããããšåäžã§ã¯ãããŸããïŒã PyTorchãã³ãœã«ã¯
torch.Tensor
ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠäœæã§ããŸãããã®
torch.Tensor
ã¿ãŒã¯ãå
¥åãšããŠãã³ãœã«æ¬¡å
ãåãã
åæåãããŠããªãã¡ã¢ãªé åãå ãããã³ãœã«ãè¿ããŸãã
import torch x = torch.Tensor(4, 4)
å®éã«ã¯ãå€ãã®å Žåãäœããã®æ¹æ³ã§åæåããããã³ãœã«ãè¿ã次ã®PyTorché¢æ°ã®ããããã䜿çšããå¿
èŠããããŸãã
torch.rand
ïŒå€ã¯ã©ã³ãã ãªäžæ§ååžããåæåãããtorch.randn
ïŒå€ã¯ã©ã³ãã ãªæ£èŠååžããåæåãããtorch.eye(n)
ïŒ nÃnnÃn
圢åŒã®åäœè¡åtorch.from_numpy(ndarray)
ïŒNumPyã®ndarray
åºã¥ãPyTorchãã³ãœã«torch.linspace(start, end, steps)
ïŒ start
ãšend
éã§åçã«ååžããsteps
å€ãæã€1次å
ãã³ãœã«ãtorch.ones
ïŒ1ã€ã®åäœãã³ãœã«ãtorch.zeros_like(other)
ïŒ other
ãšåã圢ç¶ã§ãåããŒããæã€ãã³ãœã«ãtorch.arange(start, end, step)
ïŒå€ãç¯å²å€ã«åãããã1次å
ãã³ãœã«ã
NumPyã®
ndarray
ãšåæ§ã«ãPyTorchãã³ãœã«ã¯ãç¶æ³ã®å€åã ãã§ãªããä»ã®ãã³ãœã«ãšçµã¿åãããããã®éåžžã«è±å¯ãªAPIãæäŸããŸãã NumPyã®å Žåãšåæ§ã«ãåé
æŒç®ãšäºé
æŒç®ã¯éåžžã
torch
ã¢ãžã¥ãŒã«ã®é¢æ°
torch.add(x, y)
ãªã©
torch.add(x, y)
ã䜿çšãããããã³ãœã«ãªããžã§ã¯ãã®ã¡ãœãã
torch.add(x, y)
ãªã©
torch.add(x, y)
çŽæ¥äœ¿çšããŠå®è¡ã§ããŸãã æãäžè¬çãªå Žæã«ã¯ãããšãã°
x + y
ãããªãªãŒããŒããŒãæŒç®åããããŸãã ããã«ãå€ãã®é¢æ°ã«ã¯ãæ°ãããã³ãœã«ãäœæãããåä¿¡è
ã€ã³ã¹ã¿ã³ã¹ãå€æŽããç¶æ³ç代æ¿æ段ããããŸãã ãããã®é¢æ°ã¯æšæºã®ããªã¢ã³ããšåãããã«åŒã³åºãããŸãããååã«ã¢ã³ããŒã¹ã³ã¢ãå«ãŸããŸã
x.add_(y)
äŸïŒ
x.add_(y)
ã
éžæãããæäœïŒ
torch.add(x, y)
ïŒèŠçŽ ããšã®å ç®
torch.mm(x, y)
ïŒè¡åã®ä¹ç®ïŒ
matmul
ãŸãã¯
dot
ã¯ãªãïŒã
torch.mul(x, y)
ïŒèŠçŽ ããšã®ä¹ç®
torch.exp(x)
ïŒ
torch.exp(x)
ããšã®ææ°
torch.pow(x, power)
ïŒæ®µéçãªã¹ãä¹
torch.sqrt(x)
ïŒèŠçŽ ããšã®äºä¹
torch.sqrt_(x)
ïŒç¶æ³ã«
torch.sqrt_(x)
ããšã®äºä¹
torch.sigmoid(x)
ïŒèŠçŽ åäœã®ã·ã°ã¢ã€ã
torch.cumprod(x)
ïŒãã¹ãŠã®å€ã®ç©
torch.sum(x)
ïŒãã¹ãŠã®å€ã®åèš
torch.std(x)
ïŒãã¹ãŠã®å€ã®æšæºåå·®
torch.mean(x)
ïŒãã¹ãŠã®å€ã®å¹³å
ãã³ãœã«ã¯ã翻蚳ãè€éãªïŒæ°ãŸãããªïŒã€ã³ããã¯ã¹ïŒ
x[x > 5]
ïŒãèŠçŽ ããšã®é¢ä¿æŒç®åïŒ
x > y
ïŒãªã©ãNumPyã®ndarrayã§ããç¥ãããŠããã»ãã³ãã£ã¯ã¹ã倧å¹
ã«ãµããŒãããŠããŸãã PyTorchãã³ãœã«ã¯ã
torch.Tensor.numpy()
é¢æ°ã䜿çšããŠ
ndarray
NumPyã«çŽæ¥å€æããããšãã§ããŸãã æåŸã«ãndarray NumPyãšæ¯èŒããPyTorchãã³ãœã«ã®äž»ãªå©ç¹ã¯GPUã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã§ãããããCUDA察å¿ã®GPUã«ãã³ãœã«ã¡ã¢ãªãã³ããŒãã
torch.Tensor.cuda()
é¢æ°ããããŸãã
ãªãŒãã°ã©ããææ°ã®æ©æ¢°åŠç¿æè¡ã®äžå¿ã«ããã®ã¯ãåŸé
ã®èšç®ã§ãã ããã¯ç¹ã«ãéã¿ãæŽæ°ããããã«éäŒæã¢ã«ãŽãªãºã ã䜿çšããããã¥ãŒã©ã«ãããã¯ãŒã¯ã«åœãŠã¯ãŸããŸãã ããããPytorchããã¬ãŒã ã¯ãŒã¯å
ã§å®çŸ©ãããé¢æ°ãšå€æ°ã®åŸé
èšç®ã匷åã«ãã€ãã£ãã«ãµããŒãããŠããçç±ã§ãã åŸé
ãä»»æã®èšç®ã®ããã«èªåçã«èšç®ããããã®ææ³ã¯ãèªåïŒå Žåã«ãã£ãŠã¯
ã¢ã«ãŽãªãºã ïŒåŸ®åãšåŒã°ããŸãã
ã°ã©ãã®èšç®ã«éçã¢ãã«ã䜿çšãããã¬ãŒã ã¯ãŒã¯ã§ã¯ãã°ã©ããåæããŠè¿œå ã®èšç®ããŒããè¿œå ããããšã«ãããèªå埮åãå®çŸãããŸããããã§ãå¥ã®å€ã«å¯Ÿãã1ã€ã®å€ã®åŸé
ã段éçã«èšç®ããããããã®è¿œå ã®åŸé
ããŒãããšããžã§æ¥ç¶ãããã§ãŒã³ã«ãŒã«ãéšåçã«æ¥ç¶ãããŸãã
ãã ããPyTorchã«ã¯éçã«èšç®ãããã°ã©ãã¯ãªããããä»ã®èšç®ãå®çŸ©ãããåŸã«åŸé
ããŒããè¿œå ããäœè£ã¯ãããŸããã 代ããã«ãPyTorchã¯ãããã°ã©ã ãå°çãããšãã«ããã°ã©ã ãééããå€ã®ãããŒãèšé²ãŸãã¯è¿œè·¡ããå¿
èŠããããŸããã€ãŸããèšç®ã°ã©ããåçã«æ§ç¯ããŸãã ãã®ãããªã°ã©ããäœæããããšããã«ãPyTorchã¯ãã®èšç®ãããŒããã€ãã¹ããå
¥åã«åºã¥ããŠåºåå€ã®åŸé
ãèšç®ããããã«å¿
èŠãªæ
å ±ãååŸããŸãã
PyTorchã®
Tensor
ã¯ãèªåååã«åå ããããã®å®å
šãªã¡ã«ããºã ããŸã ãããŸããã ãã³ãœã«ãæžãã«ã¯ã
torch.autograd.Variable
ã§ã©ããããå¿
èŠããããŸãã
Variable
ã¯ã©ã¹ã¯
Tensor
ãšã»ãŒåãAPIãæäŸããŸãããèªåå·®å¥åã®ããã«
torch.autograd.Function
æ£ç¢ºã«å¯Ÿè©±ããæ©èœã§è£å®ããŸãã ããæ£ç¢ºã«ã¯ã
Variable
ã¯
Tensor
ã§ã®æäœã®å±¥æŽãèšé²ããŸãã
torch.autograd.Variable
䜿çš
torch.autograd.Variable
éåžžã«ç°¡åã§ãã
Tensor
ãæž¡ããŠããã®å€æ°ã«åŸé
ãæžã蟌ãå¿
èŠããããã©ããã
torch
äŒããã ãã§ãã
x = torch.autograd.Variable(torch.ones(4, 4), requires_grad=True)
requires_grad
é¢æ°ã¯ãããŒã¿ã®å
¥åæãã©ãã«ã®æäœæãªã©ãéåžžã¯ãã®ãããªæ
å ±ãåºå¥ãããªãããã
False
requires_grad
ããå ŽåããããŸãã ãã ããèªåèå¥ã«é©ãããã®ã«ããããã«ã¯ã
Variables
ã§ãªããã°ãªããŸããã 泚æïŒrequire_gradã®ããã©ã«ãã¯
False
ã§ããããããã¬ãŒãã³ã°ããããã©ã¡ãŒã¿ãŒã®å Žåã¯
True
ã«èšå®ããå¿
èŠããããŸãã
åŸé
ãèšç®ããŠèªå埮åãå®è¡ããã«ã¯ã
backward()
é¢æ°ã
Variable
é©çšãããŸãã ãããã£ãŠãèšç®ãããã°ã©ãã®èïŒãã®ã°ã©ãã«åœ±é¿ãäžãããã¹ãŠã®å
¥åå€ïŒã«å¯Ÿãããã®ãã³ãœã«ã®åŸé
ãèšç®ãããŸãã 次ã«ããããã®ã°ã©ããŒã·ã§ã³ã
Variable
ã¯ã©ã¹ã®
grad
ã¯ã©ã¹ã®ã¡ã³ããŒã«åéãããŸãã
In [1]: import torch In [2]: from torch.autograd import Variable In [3]: x = Variable(torch.ones(1, 5)) In [4]: w = Variable(torch.randn(5, 1), requires_grad=True) In [5]: b = Variable(torch.randn(1), requires_grad=True) In [6]: y = x.mm(w) + b
å
¥åå€ãé€ããã¹ãŠã®
Variable
ã¯æŒç®ã®çµæã§ããããã
grad_fn
åå€æ°ã«é¢é£ä»ããããŠããŸããããã¯ãéã¹ããããèšç®ããããã®
torch.autograd.Function
é¢æ°ã§ãã å
¥åå€ã®å Žåã
None
ã§ãã
In [11]: y.grad_fn Out[11]: <AddBackward1 at 0x1077cef60> In [12]: x.grad_fn None torch.nn
torch.nn
ã¢ãžã¥ãŒã«ã¯ã
torch.nn
ãŠãŒã¶ãŒã«ãã¥ãŒã©ã«ãããã¯ãŒã¯åºæã®æ©èœãæäŸããŸãã ãã®æãéèŠãªã¡ã³ããŒã®1ã€ã¯
torch.nn.Module
ãããã¯ããã¥ãŒã©ã«ãããã¯ãŒã¯ã®ã¬ã€ã€ãŒã§æããã䜿çšããããåå©çšå¯èœãªæäœã®åäœã§ãããé¢é£ããïŒãã¬ãŒãã³ã°ãããïŒãã©ã¡ãŒã¿ãŒã§ãã ã¢ãžã¥ãŒã«ã«ã¯ä»ã®ã¢ãžã¥ãŒã«ãå«ããããšãã§ããããã¯ãã£ã¹ããªãã¥ãŒã·ã§ã³ã®
backward()
é¢æ°ãæé»çã«åãåããŸãã ã¢ãžã¥ãŒã«ã®äŸã¯
torch.nn.Linear()
ãããã¯ãç·åœ¢ïŒå¯/å®å
šã«æ¥ç¶ãããïŒã¬ã€ã€ãŒïŒã€ãŸããã¢ãã£ã³å€æ
Wx+bWx+b
ïŒã
Wx+bWx+b
ãŸãã
In [1]: import torch In [2]: from torch import nn In [3]: from torch.autograd import Variable In [4]: x = Variable(torch.ones(5, 5)) In [5]: x Out[5]: Variable containing: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 [torch.FloatTensor of size (5,5)] In [6]: linear = nn.Linear(5, 1) In [7]: linear(x) Out[7]: Variable containing: 0.3324 0.3324 0.3324 0.3324 0.3324 [torch.FloatTensor of size (5,1)]
ãã¬ãŒãã³ã°äžãå€ãã®å Žåãã¢ãžã¥ãŒã«ã®
backward()
é¢æ°ãåŒã³åºããŠãå€æ°ã®åŸé
ãèšç®ããå¿
èŠããããŸãã
Variables
ã®
grad
ã¡ã³ããŒ
Variables
ãã
backward()
åŒã³åºããšããã¹ãŠã®
Variable
grad
ã¡ã³ããŒããŒãã«ãªã»ãããã
nn.Module.zero_grad()
ã¡ãœããããããŸãã ãã¬ãŒãã³ã°ã«ãŒãã¯éåžžã
zero_grad()
ãåŒã³åºããã
backward()
ãåŒã³åºãçŽåã«åŒã³åºããŠã次ã®æé©åã¹ãããã®åŸé
ããªã»ããããŸãã
ãã¥ãŒã©ã«ãããã¯ãŒã¯çšã®ç¬èªã®ã¢ãã«ãäœæããå ŽåãPyTorchãšçµ±åããäžè¬çãªæ©èœãã«ãã»ã«åããããã«ãã¢ãžã¥ãŒã«ã®ç¬èªã®ãµãã¯ã©ã¹ãäœæããå¿
èŠããããŸãã ããã¯éåžžã«ç°¡åã«è¡ãããŸã
torch.nn.Module
ããã¯ã©ã¹ãç¶æ¿ãã
forward
ã¡ãœãããäžããŸãã ããšãã°ãããã«ç§ã®ã¢ãã«ã®1ã€ã®ããã«æžããã¢ãžã¥ãŒã«ããããŸãïŒå
¥åæ
å ±ã«ã¬ãŠã¹ãã€ãºãè¿œå ãããŸãïŒã
class AddNoise(torch.nn.Module): def __init__(self, mean=0.0, stddev=0.1): super(AddNoise, self).__init__() self.mean = mean self.stddev = stddev def forward(self, input): noise = input.clone().normal_(self.mean, self.stddev) return input + noise
ã¢ãžã¥ãŒã«ãå®å
šã«æ©èœããã¢ãã«ã«æ¥ç¶ãŸãã¯
çµåããã«ã¯ã
torch.nn.Sequential()
ã³ã³ãããŒã䜿çšã§ããŸãããã®ã³ã³ãããŒã«ã¯ãäžé£ã®ã¢ãžã¥ãŒã«ãæž¡ãããŸã-ãããŠãããã¯ãç¬ç«ããã¢ãžã¥ãŒã«ãšããŠæ©èœãå§ããåŒã³åºããããã³ã«ãæž¡ãããã¢ãžã¥ãŒã«ãèšç®ããŸã äŸïŒ
In [1]: import torch In [2]: from torch import nn In [3]: from torch.autograd import Variable In [4]: model = nn.Sequential( ...: nn.Conv2d(1, 20, 5), ...: nn.ReLU(), ...: nn.Conv2d(20, 64, 5), ...: nn.ReLU()) ...: In [5]: image = Variable(torch.rand(1, 1, 32, 32)) In [6]: model(image) Out[6]: Variable containing: (0 ,0 ,.,.) = 0.0026 0.0685 0.0000 ... 0.0000 0.1864 0.0413 0.0000 0.0979 0.0119 ... 0.1637 0.0618 0.0000 0.0000 0.0000 0.0000 ... 0.1289 0.1293 0.0000 ... â± ... 0.1006 0.1270 0.0723 ... 0.0000 0.1026 0.0000 0.0000 0.0000 0.0574 ... 0.1491 0.0000 0.0191 0.0150 0.0321 0.0000 ... 0.0204 0.0146 0.1724
æ倱torch.nn
ã¯ãæ©æ¢°åŠç¿ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠåœç¶éèŠãªå€ãã®æ倱é¢æ°ãæäŸããŸãã ãã®ãããªæ©èœã®äŸïŒ
torch.nn.MSELoss
ïŒ torch.nn.MSELoss
å¹³åå¹³æ¹æ ¹æ倱é¢æ°torch.nn.BCELoss
ïŒãã€ããªçžäºãšã³ããããŒæ倱é¢æ°ãtorch.nn.KLDivLoss
ïŒ torch.nn.KLDivLoss
-Leibleræ
å ±çºæ£ã®æ倱é¢æ°
PyTorchã®ã³ã³ããã¹ãã§ã¯ãæ倱é¢æ°ã¯ãã°ãã°
åºæºãšåŒã°ã
ãŸã ã åºæ¬çã«ãåºæºã¯äœæåŸããã«ãã©ã¡ãŒã¿ãŒåã§ããéåžžã«åçŽãªã¢ãžã¥ãŒã«ã§ããããã以éã¯éåžžã®é¢æ°ãšããŠäœ¿çšã§ããŸãã
In [1]: import torch In [2]: import torch.nn In [3]: from torch.autograd import Variable In [4]: x = Variable(torch.randn(10, 3)) In [5]: y = Variable(torch.ones(10).type(torch.LongTensor)) In [6]: weights = Variable(torch.Tensor([0.2, 0.2, 0.6])) In [7]: loss_function = torch.nn.CrossEntropyLoss(weight=weights) In [8]: loss_value = loss_function(x, y) Out [8]: Variable containing: 1.2380 [torch.FloatTensor of size (1,)]
ãªããã£ãã€ã¶ãŒãã¥ãŒã©ã«ãããã¯ãŒã¯ïŒ
nn.Module
ïŒããã³æ倱é¢æ°ã®ããã©ã€ããªãšã¬ã¡ã³ããã®åŸã確ççåŸé
éäžïŒãªãã·ã§ã³ïŒãéå§ãããªããã£ãã€ã¶ãŒã®ã¿ãèæ
®ããå¿
èŠããããŸãã PyTorch
torch.optim
, , :
torch.optim.SGD
: ,torch.optim.Adam
: ,torch.optim.RMSprop
: , Coursera,torch.optim.LBFGS
: ---
-,
parameters()
nn.Module
, , . , . äŸïŒ
In [1]: import torch In [2]: import torch.optim In [3]: from torch.autograd import Variable In [4]: x = Variable(torch.randn(5, 5)) In [5]: y = Variable(torch.randn(5, 5), requires_grad=True) In [6]: z = x.mm(y).mean()
PyTorch , .
torch.utils.data module
. :
Dataset
, ,DataLoader
, , , .
torch.utils.data.Dataset
__len__
, , ,
__getitem__
. , , :
import math class RangeDataset(torch.utils.data.Dataset): def __init__(self, start, end, step=1): self.start = start self.end = end self.step = step def __len__(self, length): return math.ceil((self.end - self.start) / self.step) def __getitem__(self, index): value = self.start + index * self.step assert value < self.end return value
__init__
- .
__len__
,
__getitem__
,
__getitem__
, , .
, , ,
for i in range
__getitem__
. , , ,
for sample in dataset
. ,
DataLoader
.
DataLoader
, . , , .
DataLoader
num_workers
. :
DataLoader
,
batch_size
. ç°¡åãªäŸïŒ
dataset = RangeDataset(0, 10) data_loader = torch.utils.data.DataLoader( dataset, batch_size=4, shuffle=True, num_workers=2, drop_last=True) for i, batch in enumerate(data_loader): print(i, batch)
batch_size
4, .
shuffle=True
, , .
drop_last=True
, , ,
batch_size
, . ,
num_workers
«», , . ,
DataLoader
, , , , .
, :
DataLoader
, ,
,
__getitem__
, ,
DataLoader
. ,
__getitem__
,
DataLoader
, , . , ,
__getitem__
dict(example=example, label=label)
, ,
DataLoader
,
dict(example=[example1, example2, ...], label=[label1, label2, ...])
, , , . ,
collate_fn
DataLoader
.
:
torchvision
, ,
torchvision.datasets.CIFAR10
.
torchaudio
torchtext
.
ãããã«, PyTorch, API, , PyTorch. PyTorch, , PyTorch. , PyTorch
LSGAN, TensorFlow , . ,
.