ããã«ã¡ã¯ãHabrïŒ
ãªãŒãã³ãã·ã³ã©ãŒãã³ã°ã³ãŒã¹ã«é¢ããèšäºã®å
¬éãšäžŠè¡ããŠããã¥ãŒã©ã«ãããã¯ãŒã¯ãšãã£ãŒãã©ãŒãã³ã°ã®äžè¬çãªãã¬ãŒã ã¯ãŒã¯ã®äœ¿çšã«é¢ããå¥ã®ã·ãªãŒãºãéå§ããããšã«ããŸããã
ãã®ã·ãªãŒãºã¯ãæ©æ¢°åŠç¿ã·ã¹ãã ã®éçºã«äœ¿çšãããã©ã€ãã©ãªã§ããTheanoã®èšäºã§ã Lasagne ã Keras ã Blocksãªã©ã®é«ã¬ãã«ã©ã€ãã©ãªã®ã³ã³ãã¥ãŒãã£ã³ã°ããã¯ãšã³ããšããŠããã®ã·ãªãŒãºãéããŸãã
Theanoã¯2007幎以æ¥ãäž»ã«ã¢ã³ããªãªãŒã«å€§åŠã®MILAããŒã ã«ãã£ãŠéçºãããŠãããå€ä»£ã®ãªã·ã£ã®å¥³æ§å²åŠè
ã§æ°åŠè
ã®Feanoã«ã¡ãªãã§åä»ããããŸããïŒåçã«åã£ãŠããã¯ãã§ãïŒã äž»ãªååã¯ãnumpyãšã®çµ±åãããŸããŸãªã³ã³ãã¥ãŒãã£ã³ã°ããã€ã¹ïŒäž»ã«GPUïŒã®ééçãªäœ¿çšãæé©åãããCã³ãŒãã®åççæã§ãã
次ã®èšç»ãé å®ããŸãã
- 深局åŠç¿ã©ã€ãã©ãªã«é¢ããåºæãŸãã¯åæ
çãªäœè«
- ã¯ããã«
- åºæ¬
- æåã®ã¹ããã
- å€æ°ãšé¢æ°
- é¢æ°ã«ã€ããŠã®å
±æå€æ°ãªã©
- ãããã°
- Theanoã§ã®æ©æ¢°åŠç¿
- ããžã¹ãã£ãã¯ååž°
- SVM
- éç·åœ¢æ©èœ
- ã©ã¶ãã¢
- å€å±€ããŒã»ãããã³
- ãããã«
ãã®æçš¿ã®ãµã³ãã«ãå«ãã³ãŒãã¯ãã¡ãã«ãããŸã ã
深局åŠç¿ã©ã€ãã©ãªã«é¢ããåºæãŸãã¯åæ
çãªäœè«
çŸåšããã¥ãŒã©ã«ãããã¯ãŒã¯ãæäœããããã®ã©ã€ãã©ãªãå€æ°éçºãããŠããããããã¯ãã¹ãŠå®è£
ã倧å¹
ã«ç°ãªãå ŽåããããŸãããåœä»€åãšã·ã³ããªãã¯åã®2ã€ã®äž»ãªã¢ãããŒããç¹å®ã§ããŸãã 1
ããããã©ã®ããã«ç°ãªããã®äŸãèŠãŠã¿ãŸãããã åçŽãªåŒãèšç®ãããšããŸã
ããã¯ãPythonã®åœä»€åãã¬ãŒã³ããŒã·ã§ã³ã§ã©ã®ããã«èŠãããã§ãïŒ
a = np.ones(10) b = np.ones(10) * 2 c = b * a d = c + 1
ã€ã³ã¿ããªã¿ã¯ã³ãŒãã1è¡ãã€å®è¡ããçµæãå€æ°a
ã b
ã c
ãããã³d
ã«ä¿åããŸãã
ã·ã³ããªãã¯ãã©ãã€ã ã®åãããã°ã©ã ã¯ã次ã®ããã«ãªããŸãã
A = Variable('A') B = Variable('B') C = B * A D = C + Constant(1) # f = compile(D) # d = f(A=np.ones(10), B=np.ones(10)*2)
倧ããªéãã¯ã D
ã宣èšãããšãã«å®è¡ãçºçããªãããšã§ããèšç®ã°ã©ãã®ã¿ãèšå®ãããããã³ã³ãã€ã«ããŠæçµçã«å®è¡ããŸãã
ã©ã¡ãã®ã¢ãããŒãã«ãé·æãšçæããããŸãã ãŸã第äžã«ãåœä»€åããã°ã©ã ã¯ããæè»ã§ãèŠèŠçã§ããããã°ã容æã§ãã 䜿çšããããã°ã©ãã³ã°èšèªã®è±å¯ãªæ©èœããã¹ãŠäœ¿çšã§ããŸããããšãã°ãã«ãŒãããã©ã³ãã¯ããããã°ç®çã§äžéçµæã衚瀺ããŸãã ãã®ãããªæè»æ§ã¯ããŸããã€ã³ã¿ãŒããªã¿ãŒã«èª²ããããå°ããªå¶éã«ãã£ãŠå®çŸãããŸããã€ã³ã¿ãŒããªã¿ãŒã¯ããã®åŸã®å€æ°ã®äœ¿çšã«åããªããã°ãªããŸããã
äžæ¹ãã·ã³ããªãã¯ãã©ãã€ã ã¯ããå€ãã®å¶éã課ããŸãããèšç®ã¯ã¡ã¢ãªãšå®è¡é床ã®äž¡æ¹ã§ããå¹ççã§ãïŒã³ã³ãã€ã«æ®µéã§ã¯ãããã€ãã®æé©åãé©çšããæªäœ¿çšã®å€æ°ãç¹å®ããèšç®ãå®è¡ããã¡ã¢ãªãåå©çšãããªã©ãã§ããŸãã ã·ã³ããªãã¯ããã°ã©ã ã®ç¹åŸŽã¯ãã°ã©ãã®å®£èšãã³ã³ãã€ã«ãå®è¡ã®åã
ã®æ®µéã§ãã
åœä»€åãã©ãã€ã ã¯ã»ãšãã©ã®ããã°ã©ããŒã«éŠŽæã¿ããããã·ã³ããªãã¯ãªãã©ãã€ã ã¯çããããã«èŠãããããããªãã®ã§ãç§ãã¡ã¯ããã«ã€ããŠè©³çŽ°ã«èª¬æããŸãã
ãã®åé¡ããã詳现ã«ç解ããã人ã®ããã«ã MXNetã®ããã¥ã¡ã³ãã®å¯Ÿå¿ããã»ã¯ã·ã§ã³ãèªãããšããå§ãããŸãïŒãã®ã©ã€ãã©ãªã«ã€ããŠã¯å¥ã®æçš¿ãæžããŸãïŒããããã³ã³ãã€ã«ããŠå®è¡ããŸãã
ããããååãªçè«ãäŸã§Theanoã«å¯ŸåŠããŸãããã
èšçœ®
ã€ã³ã¹ããŒã«ã«ã¯ã2.6ãŸãã¯3.3ããå€ãpythonããŒãžã§ã³ïŒããè¯ãéçºããŒãžã§ã³ïŒãC ++ã³ã³ãã€ã©ãŒïŒg ++ for LinuxãŸãã¯Windowsãclang for MacOSïŒã ç·åœ¢ä»£æ°ããªããã£ãã©ã€ãã©ãªãŒ ïŒäŸãã°ATLASãOpenBLASãIntel MKLïŒãNumPyããã³ã·ããŒ
GPUã§èšç®ãå®è¡ããã«ã¯ãCUDAãå¿
èŠã§ãããŸãããã¥ãŒã©ã«ãããã¯ãŒã¯ã§èŠãããå€ãã®æäœã¯ãcuDNNã䜿çšããŠé«éåã§ããŸãã ããŒãžã§ã³0.8.0ãããTheanoéçºè
ã¯libgpuarrayã®äœ¿çšãæšå¥šããŠããŸããããã«ãããè€æ°ã®GPUã䜿çšããããšãå¯èœã«ãªããŸãã
ãã¹ãŠã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããããã pip
Theanoãã€ã³ã¹ããŒã«ã§ããŸãã
# pip install Theano # pip install --upgrade https:
ã«ã¹ã¿ãã€ãº
Theanoã¯3ã€ã®æ¹æ³ã§æ§æã§ããŸãã
theano.config
ãªããžã§ã¯ãtheano.config
å±æ§ãç®çã®å€ã«theano.config
- ç°å¢å€æ°
THEANO_FLAGS
çµç± $HOME/.theanorc
æ§æãã¡ã€ã«ïŒãŸãã¯Windowsã®å Žåã¯$HOME/.theanorc.txt
ïŒã$HOME/.theanorc.txt
ãŠ
éåžžããã®æ§æãã¡ã€ã«ã®ãããªãã®ã䜿çšããŸãã
[global] device = gpu # , - GPU CPU floatX = float32 optimizer_including=cudnn allow_gc = False # , #exception_verbosity=high #optimizer = None # #profile = True #profile_memory = True config.dnn.conv.algo_fwd = time_once # config.dnn.conv.algo_bwd = time_once [lib] Cnmem = 0.95 # CNMeM (https://github.com/NVIDIA/cnmem) - CUDA-
æ§æã®è©³çŽ°ã«ã€ããŠã¯ã ããã¥ã¡ã³ããåç
§ããŠãã ããã
åºæ¬
æåã®ã¹ããã
ãã¹ãŠãã€ã³ã¹ããŒã«ãããæ§æãããã®ã§ãããšãã°ãå€é
åŒã®å€ãèšç®ãããªã©ãããã€ãã®ã³ãŒããæžããŸãããã ãã€ã³ã10ã§ïŒ
import theano import theano.tensor as T
ããã§4ã€ã®ããšãè¡ããŸãããlongåã®ã¹ã«ã©ãŒå€æ°
å®çŸ©ããå€é
åŒãå«ãåŒãäœæããé¢æ°f
å®çŸ©ããã³ã³ã³ãã€ã«ããæ°å€10ãå
¥åã«æž¡ããŠå®è¡ããŸãã
Theanoã®å€æ°ã«ã¯åãä»ããããŠãããå€æ°ã®åã«ã¯ããŒã¿åãšãã®æ¬¡å
ã®äž¡æ¹ã«é¢ããæ
å ±ãå«ãŸããŠãããšããäºå®ã«æ³šæãæããŸãããã äžåºŠã«è€æ°ã®ãã€ã³ãã§å€é
åŒãèšç®ããã«
ãaããã¯ãã«ãšããŠæ±ºå®ããå¿
èŠããããŸãã
a = T.lvector() expression = 1 + 2 * a + a ** 2 f = theano.function( inputs=[a], outputs=expression ) arg = arange(-10, 10) res = f(arg) plot(arg, res, c='m', linewidth=3.)

ãã®å Žåãåæåäžã«å€æ°ã®æ¬¡å
æ°ãæå®ããã ãã§æžã¿ãŸããå次å
ã®ãµã€ãºã¯ãé¢æ°åŒã³åºãã®æ®µéã§èªåçã«èšç®ãããŸãã
UPDïŒç·åœ¢ä»£æ°è£
眮ãæ©æ¢°åŠç¿ã§åºã䜿çšãããŠããããšã¯ç§å¯ã§ã¯ãããŸããïŒäŸã¯ç¹åŸŽãã¯ãã«ã«ãã£ãŠèšè¿°ãããã¢ãã«ãã©ã¡ãŒã¿ãŒã¯è¡åã®åœ¢åŒã§èšè¿°ãããç»åã¯3次å
ãã³ãœã«ã®åœ¢åŒã§è¡šãããŸãã ã¹ã«ã©ãŒéããã¯ãã«ãããã³è¡åã¯ããã³ãœã«ã®ç¹æ®ãªã±ãŒã¹ãšèŠãªãããšãã§ããŸã;ãããã£ãŠãããã¯å°æ¥ãããã®ç·åœ¢ä»£æ°ã®ãªããžã§ã¯ããšåŒã°ãããã®ã§ãã ãã³ãœã«ãšã¯ãæ°å€ã®N
次å
é
åãæå³ããŸãã
theano.tensor
ããã±ãŒãžã«ã¯ãæãäžè¬çã«äœ¿çšãããã¿ã€ãã®ãã³ãœã«ãå«ãŸããŠããŸããã ã¿ã€ããå€å¥ããããšã¯é£ãããããŸããã
ã¿ã€ããäžèŽããªãå ŽåãTheanoã¯äŸå€ãã¹ããŒããŸãã ã¡ãªã¿ã«ãããä¿®æ£ããã«ã¯ãé¢æ°ã®åäœãããã«å€æŽããã ãã§ãªããåŒæ°allow_input_downcast=True
ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããšã§ã§ããŸãã
x = T.dmatrix('x') v = T.fvector('v') z = v + x f = theano.function( inputs=[x, v], outputs=z, allow_input_downcast=True ) f_fail = theano.function( inputs=[x, v], outputs=z ) print(f(ones((3, 4), dtype=float64), ones((4,), dtype=float64)) >>> [[ 2. 2. 2. 2.] >>> [ 2. 2. 2. 2.] >>> [ 2. 2. 2. 2.]] print(f_fail(ones((3, 4), dtype=float64), ones((4,), dtype=float64)) >>> --------------------------------------------------------------------------- >>> TypeError Traceback (most recent call last)
äžåºŠã«è€æ°ã®åŒãèšç®ããããšãã§ããŸãããã®å Žåã®ãªããã£ãã€ã¶ãŒã¯ã亀差ããéšåããã®å Žåã¯åèšãåå©çšã§ããŸã ïŒ
x = T.lscalar('x') y = T.lscalar('y') square = T.square(x + y) sqrt = T.sqrt(x + y) f = theano.function( inputs=[x, y], outputs=[square, sqrt] ) print(f(5, 4)) >>> [array(81), array(3.0)] print(f(2, 2)) >>> [array(16), array(2.0)]
é¢æ°éã§ç¶æ
ã亀æããã«ã¯ãç¹å¥ãªå
±æå€æ°ã䜿çšãããŸãã
state = theano.shared(0) i = T.iscalar('i') inc = theano.function([i], state,
ãã®ãããªå€æ°ã®å€ã¯ããã³ãœã«å€æ°ãšã¯ç°ãªããéåžžã®pythonã³ãŒãããTheanoé¢æ°ã®å€éšã§ååŸããã³å€æŽã§ããŸãã
state.set_value(-15) print(state.get_value()) >>> -15
å
±æå€æ°ã®å€ã¯ããã³ãœã«å€æ°ã§ã眮æãã§ããŸãã
x = T.lscalar('x') y = T.lscalar('y') i = T.lscalar('i') expression = (x - y) ** 2 state = theano.shared(0) f = theano.function( inputs=[x, i], outputs=expression, updates=[(state, state+i)],
ãããã°
Theanoã¯ãã°ã©ãã®èšç®ãšãããã°ã衚瀺ããããã®å€ãã®ããŒã«ãæäŸããŸãã ãã ããã·ã³ããªãã¯åŒã®ãããã°ã¯ãŸã ç°¡åãªäœæ¥ã§ã¯ãããŸããã ããã§ã¯ãæããã䜿çšãããã¢ãããŒããç°¡åã«ãªã¹ãããŸãããããã°ã®è©³çŽ°ã«ã€ããŠã¯ãããã¥ã¡ã³ããåç
§ããŠãã ããïŒ http : //deeplearning.net/software/theano/tutorial/printing_drawing.html
åé¢æ°ã®èšç®ã°ã©ããå°å·ã§ããŸãã
x = T.lscalar('x') y = T.lscalar('y') square = T.square(x + y) sqrt = T.sqrt(x + y) f = theano.function( inputs=[x, y], outputs=[square, sqrt] )
åèšã¯äžåºŠã ãèšç®ãããããšã«æ³šæããŠãã ããã
Elemwise{Sqr}[(0, 0)] [id A] '' 2 |Elemwise{add,no_inplace} [id B] '' 0 |x [id C] |y [id D] Elemwise{sqrt,no_inplace} [id E] '' 1 |Elemwise{add,no_inplace} [id B] '' 0
åŒã¯ãããç°¡æœãªåœ¢åŒã§è¡šç€ºã§ããŸãã
ãŸãã¯ãã°ã©ãã®åœ¢åŒã§ïŒ
theano.printing.pydotprint(pred, outfile='pics/pred_graph.png', var_with_name_simple=True)

æ®å¿µãªããããã®ãããªã°ã©ãã®å¯èªæ§ã¯ãåŒã®è€éããå¢ãã«ã€ããŠæ¥æ¿ã«äœäžããŸãã å®éãäœãã¯ããã¡ãã®äŸã§ããç解ã§ããŸããã
Theanoã§ã®æ©æ¢°åŠç¿
ããžã¹ãã£ãã¯ååž°
ããžã¹ãã£ãã¯ååž°ã®äŸãTheanoã䜿çšããŠæ©æ¢°åŠç¿ã¢ã«ãŽãªãºã ãéçºããæ¹æ³ãèŠãŠã¿ãŸãããã ãã®ã¢ãã«ãã©ã®ããã«æ§æãããŠãããã®è©³çŽ°ã«ã¯æå³çã«å
¥ããŸããïŒããã察å¿ããå
¬éã³ãŒã¹ã®èšäºã«ä»»ããŸãããïŒããã¯ã©ã¹ã®äºåŸç¢ºçã¯æãåºããŠãã ãã 圢ãããŠããŸã
ã¢ãã«ã®ãã©ã¡ãŒã¿ãŒãå®çŸ©ããŠã¿ãŸãããã䟿å®äžããªãã»ããã«å¥ã®ãã©ã¡ãŒã¿ãŒãå°å
¥ããŸãã
W = theano.shared( value=numpy.zeros((2, 1),dtype=theano.config.floatX), name='W') b = theano.shared( value=numpy.zeros((1,), dtype=theano.config.floatX), name='b')
ãããŠãèšå·ãšã¯ã©ã¹ã©ãã«ã®ã·ã³ããªãã¯å€æ°ãååŸããŸãã
X = T.matrix('X') Y = T.imatrix('Y')
äºåŸç¢ºçãšã¢ãã«äºæž¬ã®åŒãå®çŸ©ããŸãããïŒ
linear = T.dot(X, W) + b p_y_given_x = T.nnet.sigmoid(linear) y_pred = p_y_given_x > 0.5
ãããŠã次ã®åœ¢åŒã®æ倱é¢æ°ãå®çŸ©ããŸãã
loss = T.nnet.binary_crossentropy(p_y_given_x, Y).mean()
ã·ã°ã¢ã€ããšã¯ãã¹ãšã³ããããŒã®åŒãæ瀺çã«èšè¿°ããã®ã§ã¯ãªãã theano.tensor.nnet
ããã±ãŒãžã®é¢æ°ã䜿çšããŸãããããã¯ãæ©æ¢°åŠç¿ã§äžè¬çãªå€ãã®é¢æ°ã®æé©åãããå®è£
ãæäŸããŸãã ããã«ããã®ããã±ãŒãžã®æ©èœã«ã¯éåžžãæ°å€å®å®æ§ã®ããã®è¿œå ã®ããªãã¯ãå«ãŸããŠããŸãã
æ倱é¢æ°ãæé©åããã«ã¯ãåŸé
éäžæ³ã䜿çšããŸãããã®æ¹æ³ã®åã¹ãããã¯æ¬¡ã®åŒã§äžããããŸãã
ã³ãŒãã«å€æããŸãããïŒ
g_W = T.grad(loss, W) g_b = T.grad(loss, b) updates = [(W, W - 0.04 * g_W), (b, b - 0.08 * g_b)]
ããã§ã¯ãTheanoã®çŽ æŽãããæ©äŒã掻çšããŸãã-èªå2 å·®å¥åã T.grad
ã®åŒã³åºãã¯ãæåã®åŒæ°ã®2çªç®ã®åŒæ°ã«å¯ŸããåŸé
ãå«ãåŒãè¿ããŸããã ãã®ãããªåçŽãªã±ãŒã¹ã§ã¯ããã¯äžèŠã«æãããããããŸãããã倧èŠæš¡ãªãã«ãã¬ã€ã€ãŒã¢ãã«ãæ§ç¯ããå Žåã«åœ¹ç«ã¡ãŸãã
åŸé
ãååŸããããšãTheanoé¢æ°ã®ã¿ãã³ã³ãã€ã«ã§ããŸãã
train = theano.function( inputs=[X, Y], outputs=loss, updates=updates, allow_input_downcast=True ) predict_proba = theano.function( [X], p_y_given_x, allow_input_downcast=True )
ãããŠãå埩ããã»ã¹ãéå§ããŸãã
sgd_weights = [W.get_value().flatten()] for iter_ in range(4001): loss = train(x, y[:, np.newaxis]) sgd_weights.append(W.get_value().flatten()) if iter_ % 100 == 0: print("[Iteration {:04d}] Train loss: {:.4f}".format(iter_, float(loss)))
çæããããŒã¿ã®å Žåãããã»ã¹ã¯æ¬¡ã®ãããªå¢çç·ã«åæããŸãã

ããããã«èŠããŸããããã®ãããªåçŽãªã¿ã¹ã¯ã®4000åã®å埩ã¯å°ãå€ãããã§ã...æé©åãé«éåããNewtonã¡ãœããã䜿çšããŠã¿ãŸãããã ãã®æ¹æ³ã¯ãæ倱é¢æ°ã®2次å°é¢æ°ã䜿çšãã次ã®ãããªäžé£ã®ã¹ãããã§ãã
ã©ã㧠- ããã»è¡åã
ããã»è¡åãèšç®ããã«ã¯ãã¢ãã«ã®ãã©ã¡ãŒã¿ãŒã®1次å
ããŒãžã§ã³ãäœæããŸãã
W_init = numpy.zeros((2,),dtype=theano.config.floatX) W_flat = theano.shared(W_init, name='W') W = W_flat.reshape((2, 1)) b_init = numpy.zeros((1,), dtype=theano.config.floatX) b_flat = theano.shared(b_init, name='b') b = b_flat.reshape((1,))
ãããŠããªããã£ãã€ã¶ãŒã®ã¹ããããå®çŸ©ããŸãã
h_W = T.nlinalg.matrix_inverse(theano.gradient.hessian(loss, wrt=W_flat)) h_b = T.nlinalg.matrix_inverse(theano.gradient.hessian(loss, wrt=b_flat)) updates_newton = [(W_flat, W_flat - T.dot(h_W , g_W)), (b_flat, b_flat - T.dot(h_b, g_b))]
åãçµæã«éããŸãããã
ã
Newtonã®æ¹æ³ã§ã¯ãå¿
èŠãªã¹ãããã¯30ïŒåŸé
éäžã®å Žåã¯4000ïŒã ãã§ããã
äž¡æ¹ã®æ¹æ³ã®ãã¹ã¯ãã®ã°ã©ãã§èŠãããšãã§ããŸãïŒ

Svc
ãµããŒããã¯ã¿ãŒã¡ãœãããç°¡åã«å®è£
ããããšãã§ããŸãããã®ãããæ倱é¢æ°ã次ã®åœ¢åŒã§è¡šãã ãã§ååã§ãã
Theanoã«é¢ããŠã¯ãããã¯åã®äŸã®ããã€ãã®è¡ã眮ãæããããšã§æžãããšãã§ããŸãïŒ
C = 10. loss = C * T.maximum(0, 1 - linear * (Y * 2 - 1)).mean() + T.square(W).sum() predict = theano.function( [X], linear > 0, allow_input_downcast=True )
ããã¯ãã¢ãã«ãæ£èŠåãããã€ããŒãã©ã¡ãŒã¿ãŒã§ãããåŒ
ã©ãã«ãç¯å²ã«å
¥ããã ãã§ã
\ {-1ã1 \}éžæãããCã®å Žåãåé¡åšã¯æ¬¡ã®ããã«ã¹ããŒã¹ãåå²ããŸãã

éç·åœ¢æ©èœ
ã«ãŒãã¯ãããã°ã©ãã³ã°ã§æããã䜿çšãããæ§é ã®1ã€ã§ãã Theanoã«ãŒãã®ãµããŒãã¯ã ã¹ãã£ã³æ©èœã§è¡šãããŸãã ãããã©ã®ããã«æ©èœããããç¥ããŸãããã èªè
ã«ã¯ãç¹åŸŽã®ç·åœ¢é¢æ°ãçæãããããŒã¿ãåå²ããããã®æè¯ã®åè£ã§ã¯ãªãããšã¯ãã§ã«æããã ãšæããŸãã ãã®æ¬ ç¹ã¯ãå
ã®ãã®ã«å€é
åŒã®ç¹åŸŽãè¿œå ããããšã§ä¿®æ£ã§ããŸãïŒãã®ææ³ã«ã€ããŠã¯ ãããã°ã®å¥ã®èšäºã§è©³ãã説æããŠããŸãïŒã ã ãããç§ã¯ãã©ãŒã ã®å€æãååŸããã \ {x_1ãx_2 \} \ rightarrow \ bigcup \ limits_ {i = 0} ^ {i = K} \ {x_1 ^ iãx_2 ^ i \} ã Pythonã§ã¯ãããšãã°æ¬¡ã®ããã«å®è£
ã§ããŸãã
poly = [] for i in range(K): poly.extend([x**i for x in features])
Theanoã§ã¯ã次ã®ããã«ãªããŸãã
def poly(x, degree=2): result, updates = theano.scan(
scan
ã®æåã®é¢æ°ãæž¡ãããåå埩ã§åŒã³åºãããŸãããã®æåã®åŒæ°ã¯åã®å埩ã®çµæã§ãããåŸç¶ã®non_sequences
ã¯ãã¹ãŠnon_sequences
ã§ãã outputs_info
ã¯ã x
ãšåã次å
ãšã¿ã€ãã®åºåãã³ãœã«ãåæåããåäœã§åããŸãã n_steps
ã¯ãå¿
èŠãªå埩åæ°ã瀺ããŸãã
scan
ã¯ããµã€ãº(n_steps, ) + outputs_info.shape
ãã³ãœã«ã®åœ¢åŒã§çµæãè¿ããããå¿
èŠãªç¬Šå·ãååŸããããã«ãããªãã¯ã¹ã«å€æããŸãã
çµæã®åŒã®æäœãç°¡åãªäŸã§èª¬æããŸãã
[[1, 2], -> [[ 1, 2, 1, 4], [3, 4], -> [ 3, 4, 9, 16], [5, 6]] -> [ 5, 6, 25, 36]]
åªåã掻çšããã«ã¯ãã¢ãã«ã®å®çŸ©ãå€æŽãããã©ã¡ãŒã¿ãŒãè¿œå ããã ãã§ãïŒããå€ãã®å
åãããããïŒã
W = theano.shared( value=numpy.zeros((8, 1),dtype=theano.config.floatX), name='W') linear = T.dot(poly(X, degree=4), W) + b
æ°æ©èœã«ãããã¯ã©ã¹ã倧å¹
ã«åé¢ããããšãã§ããŸãã

ãã¥ãŒã©ã«ãããã¯ãŒã¯ãšã©ã¶ãã¢3
ãã®æç¹ã§ãTheanoã§æ©æ¢°åŠç¿ã·ã¹ãã ãäœæããäž»ãªæ®µéãã€ãŸãå
¥åå€æ°ã®åæåãã¢ãã«ã®å®çŸ©ãTheanoé¢æ°ã®ã³ã³ãã€ã«ããªããã£ãã€ã¶ãŒã®ã¹ããããå«ããµã€ã¯ã«ã«ã€ããŠã¯æ¢ã«èª¬æããŸããã ããã§çµãããããããŸããããTheanoã®äžã§åäœãããã¥ãŒã©ã«ãããã¯ãŒã¯çšã®çŽ æŽãããã©ã€ãã©ãªã§ããLasagneãèªè
ã«çŽ¹ä»ããããšæããŸãã Lasagneã¯ãã¬ã€ã€ãŒãæé©åã¢ã«ãŽãªãºã ãæ倱é¢æ°ããã©ã¡ãŒã¿ãŒã®åæåãªã©ãæ¢è£œã®ã³ã³ããŒãã³ãã®ã»ãããæäŸããŸãããTheanoã¯æœè±¡åã®å€æ°ã®ã¬ã€ã€ãŒã®åŸãã«é ããŸããã
MNISTåé¡ã®äŸã䜿çšããŠãå
žåçãªTheano / Lasagneã³ãŒããã©ã®ããã«èŠããããèŠãŠã¿ãŸãããã
MNISTã®ç»åã®äŸïŒãŸã èŠãããšããªãå ŽåïŒ ãããã800ãã¥ãŒãã³ã®2ã€ã®é ãå±€ãæã€å€å±€ããŒã»ãããã³ãæ§ç¯ããŸããæ£èŠåã®ããã«ããããã¢ãŠãã䜿çšãããã®ã³ãŒããå¥ã®é¢æ°ã«é
眮ããŸãã
def build_mlp(input_var=None):
ãã®ãããªã·ã³ãã«ã§å®å
šã«æ¥ç¶ããããããã¯ãŒã¯ãååŸããŸãã

ãã³ãœã«å€æ°ãåæåãããã¬ãŒãã³ã°ãšæ€èšŒã®ããã«Theanoé¢æ°ãã³ã³ãã€ã«ããŸãã
input_var = T.tensor4('inputs') target_var = T.ivector('targets')
次ã«ããã¬ãŒãã³ã°ãµã€ã¯ã«ãäœæããŸãã
print("| Epoch | Train err | Validation err | Accuracy | Time |") print("|------------------------------------------------------------------------|") try: for epoch in range(100):
çµæã®åŠç¿æ²ç·ïŒ

ç§ãã¡ã®ã¢ãã«ã¯98ïŒ
以äžã®ç²ŸåºŠãéæããŠããŸããããã¯ãäŸãã°ç³ã¿èŸŒã¿ãã¥ãŒã©ã«ãããã¯ãŒã¯ã䜿çšããŠééããªãæ¹åã§ããŸããããã®ãããã¯ã¯ãã§ã«ãã®èšäºã®ç¯å²å€ã§ãã
ãã«ããŒã䜿çšããŠãŠã§ã€ããä¿åããã³ããŒããããšäŸ¿å©ã§ãã
Lasagneã®ããã¥ã¡ã³ãã¯ãã¡ãããå
¥æã§ããŸã ãå€ãã®äŸãšäºåãã¬ãŒãã³ã°ãããã¢ãã«ã¯å¥ã®ãªããžããªã«ãããŸã ã
ãããã«
ãã®æçš¿ã§ã¯ãè¡šé¢çã«Theanoã®å¯èœæ§ã«ç²ŸéããŸããã詳现ã«ã€ããŠã¯ä»¥äžãã芧ãã ããã
æçš¿ã®æºåãæäŒã£ãŠãããbauchgefuehlã«æè¬ããŸãã
1. 2ã€ã®ã¢ãããŒãã®å¢çã¯ããªãææ§ã§ããã以äžã«è¿°ã¹ããã¹ãŠãå³å¯ã«åœãŠã¯ãŸãããã§ã¯ãªããäŸå€ãšå¢çç·ã®ã±ãŒã¹ãåžžã«ååšããŸãã ããã§ã®ã¿ã¹ã¯ã¯ãäž»ãªã¢ã€ãã¢ãäŒããããšã§ãã
2.ãã¯ãã«ã«
ã¬ããŒããšããã¥ã¡ã³ãã®Theanoéçºè
ã¯ãå·®å¥åã象城çã«åŒãã§ããŸãã ãã ããHabrã«é¢ãã以åã®èšäºã®1ã€ã§ãã®çšèªã䜿çšãããšã
è°è«ãçããŸãã
ãTheanoã®ãœãŒã¹ã³ãŒããšãŠã£ãããã£ã¢ã®å®çŸ©ã«åºã¥ããŠãèè
ã¯æ£ããçšèªã¯äŸç¶ãšããŠãèªåå·®å¥åãã§ãããšèããŠããŸãã3.ãã®ã»ã¯ã·ã§ã³ã®è³æã®å€§éšåã¯ãLasagneã®è³æã«åºã¥ããŠããŸãã