Upgrade to Pro — share decks privately, control downloads, hide ads and more …

第2回 Chainer v2 による実践深層学習 2

Atsushi
January 16, 2018
200

第2回 Chainer v2 による実践深層学習 2

B3勉強会 第2回目
発表日 2018年1月16日

Atsushi

January 16, 2018
Tweet

More Decks by Atsushi

Transcript

  1.      !" !# !$ %" %#

    %& ℎ ( 2 1 + 2 1 , 2 1 -(") -(#)    W(#) W(") z = f(x1, x2, x3) = (x1 2x2 1)2 + (x2x3 1)2 + 1 y = f(x) = 2 ⇣ W (2) 1 ⇣ W (1)x + b(1) ⌘ + b(2) ⌘
  2.      !    

      z = f(x1, x2, x3) = (x1 2x2 1)2 + (x2x3 1)2 + 1 z = f(x1, x2, x3) = h1(x1 2x2 1, x2x3 1) h1(y1, y2) = y2 1 + y2 2 + 1 h2(z1, z2) = z1 2z2 1 h3(u1, u2) = u1u2 1 z = f(x1, x2, x3) = h1(x1 2x2 1, x2x3 1) = h1(h2(x1, x2), h3(x2, x3)) h1, h2, h3 f
  3. ') u " $ ')&! .*(   u ')+%

     .*( u ,-$ #  @y1 @x1 @y1 @x2 @y2 @x2 @y2 @x3 @z @y1 @z @y2 @z @x1 = @z @y1 @y1 @x1 @z @x2 = @z @y1 @y1 @x2 + @z @y2 @y2 @x2
  4.      import numpy as np import

    chainer from chainer import cuda, Function, report, training, utils, Variable from chainer import datasets, iterators, optimizers, serializers from chainer import Link, Chain, ChainList import chainer.functions as F import chainer.links as L from chainer.training import extensions
  5. Variable u ! "#    u %( u

     >>>x1 = Variable(np.array([1]).astype(np.float32)) >>>x2 = Variable(np.array([2]).astype(np.float32)) >>>x3 = Variable(np.array([3]).astype(np.float32)) :np.float32 $:np.int32 u !'&  >>>z = (x1 - 2 * x2 - 1)**2 + (x2 * x3 - 1)**2 + 1 >>>z.data array([42.], dtype=float32)
  6. Variable u   >>>z.backward() >>>x1.grad array([8.], dtype=float32) >>>x2.grad array([46.],

    dtype=float32) >>>x3.grad array([20.], dtype=float32) u     z = (x1 2x2 1)2 + (x2x3 1)2 + 1 @z @x1 = 2(x1 2x2 1) @z @x2 = 4(x1 2x2 1) + 2x3(x2x3 1) @z @x3 = 2x2(x2x3 1) (x1, x2, x3) = (1, 2, 3) @z @x1 = 2(1 2 ⇥ 2 1) = 8 @z @x2 = 4(1 2 ⇥ 2 1) + 2 ⇥ 3 ⇥ (2 ⇥ 3 1) = 46 @z @x3 = 2 ⇥ 2 ⇥ (2 ⇥ 3 1) = 20
  7. functions u Variable"  $ u & !%# u 

     >>>x = Variable(np.array([-1], dtype=np.float32)) >>>F.sin(x).data array([-0.84147096], dtype=float32) >>>F.sigmoid(x).data array([0.2689414], dtype=float32) u ' >>>z = F.cos(x) >>>z.backward() >>>x.grad array([0.84147096], dtype=float32) >>>((-1) * F.sin(x)).data array([0.84147096], dtype=float32) u cos(x)’ = sin(x)' 
  8. links u Variable)%  '!%(+ u functions !% *links !%

    ' u Linear u #$ links !% u NN  & " -& " + 1 - ),!% u & " - " % & " - " &  & = (% + )
  9. links >>>h = L.Linear(3,4) >>>h.W.data array([[ 0.43859118, -0.39790073, 0.20828195], [

    0.3470746 , -0.54201466, 1.0473386 ], [ 0.50721884, 0.6193507 , -0.21138462], [-0.21932535, -0.05090914, -0.9445903 ]], dtype=float32) >>>h.b.data array([0., 0., 0., 0.], dtype=float32) >>>x = Variable(np.array(range(6), dtype=np.float32).reshape(2,3)) >>>x.data array([[0., 1., 2.], [3., 4., 5.]], dtype=float32) >>>y = h(x) >>>y.data array([[ 0.01866317, 1.5526626 , 0.19658142, -1.9400897 ], [ 0.7655803 , 4.109858 , 2.942136 , -5.5845637 ]], dtype=float32) u  >>>w = h.W.data >>>x0 = x.data >>>x0.dot(w.T) + h.b.data array([[ 0.01866317, 1.5526626 , 0.19658142, -1.9400897 ], [ 0.7655803 , 4.109858 , 2.942136 , -5.5845637 ]], dtype=float32)
  10. Chain  u ( )  u   y

    = W2( (W1x + b1)) + b2 u   >>>class MyChain(Chain): ... def __init__(self): ... super(MyChain, self).__init__( ... l1 = L.Linear(4,3), ... l2 = L.Linear(3,3), ... ) ... def __call__(self,x,y): ... fv = self.fwd(x,y) ... loss = F.mean_squared_error(fv,y) ... return loss ... def fwd(self,x,y): ... return F.sigmoid(self.l1(x)) !" !# $" $# $% 2 1 3 2 1 2 1 )(") )(#)    W(#) W(") 4 3 3 !% !.
  11. optimizers u EC <?=/3"(% F+ >5 u 5 F+>"(%B- #*($76A

    u "(%B- ;1&')0 D@42   u 1 EC !<"(%1.B- u 82,9: >>>model = MyChain() >>>optimizer = optimizers.SGD() >>>optimizer.setup(model) u "(%B- >>>model.cleargrads() >>>loss = model(x,y) >>>loss.backward() >>>optimizer.update()