9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ćƒ‡ć‚£ćƒ¼ćƒ—ćƒ©ćƒ¼ćƒ‹ćƒ³ć‚°ć‚’å®Ÿč£…ć‹ć‚‰å­¦ć¶ļ¼ˆ4ļ¼‰å­¦ēæ’ļ¼ˆčŖ¤å·®é€†ä¼ę’­ę³•ļ¼‰

9
Last updated at Posted at 2017-11-26

ä»Šå›žćÆć€å­¦ēæ’ć®ę€§čƒ½å‘äøŠć‚’č©¦ć—ć¾ć™ć€‚

ę”¹å–„ę”ˆ

å‰å›žćÆć€é‡ćæć€ćƒć‚¤ć‚¢ć‚¹ć®ć²ćØć¤ć„ć¤ć«ć¤ć„ć¦ć€å…„åŠ›ć‹ć‚‰å‡ŗåŠ›ć¾ć§čØˆē®—ć—ć¦ć„ć¾ć—ćŸć€‚MNISTć§ć®čØˆē®—å›žę•°ćÆć€ä»„äø‹ć§ć—ćŸć€‚
1éšŽå±¤ē›®ļ¼š768 $ \times $ 50
2éšŽå±¤ē›®ļ¼š50 $ \times $ 100
3éšŽå±¤ē›®ļ¼š100 $ \times $ 10
ć”ć‚‡ć£ćØå¤§ććŖå€¤ćØć”ć‚‡ć£ćØå°ć•ć„å€¤ć®2å›žčØˆē®—ć—ć¦ć„ć‚‹ć®ć§2å€ć«ćŖć‚Šć¾ć™ć€‚
ć“ć‚Œć‚’čØˆē®—ć™ć‚‹ćØ88,800å›žć«ćŖć‚Šć¾ć™ć€‚
ć¾ćŸć€å…Øćƒ‡ćƒ¼ć‚æ60,000å€‹åˆ†å®Ÿč”Œć™ć‚‹ćØć€5,328,000,000å›žå®Ÿč”Œć«ćŖć‚Šć¾ć™ć€‚é…ć„ć‚ć‘ć§ć™ć€‚

ć‚‚ć†äø€åŗ¦ć€ćƒćƒƒćƒˆćƒÆćƒ¼ć‚Æå›³ć‚’č¦‹ć¦ćæć¾ć—ć‚‡ć†ć€‚čµ¤ē·šć®éƒØåˆ†ć‚’å…ØéƒØčØˆē®—ć—ć¦ć„ć¾ć™ć€‚

network_all.png

å‡ŗåŠ›å±¤ć®éƒØåˆ†ć®$ w_{11}^{(2)} $に注目してみましょう。$ w_{11}^{(2)} $ć®å¤‰ę›“ćŒå½±éŸæć‚’åŠć¼ć™ćƒ‡ćƒ¼ć‚æćÆć€$ u_1^{(2)} $态$ y_1 $态$ E $ć®ćæć«ćŖć‚Šć¾ć™ć€‚äø‹å›³ć®čµ¤ē·šéƒØåˆ†ć®ćæčØˆē®—ć—ē›“ć›ć°ć‚ˆć„ć“ćØć«ćŖć‚Šć¾ć™ć€‚

network_out.png

åŒę§˜ć«ć€äø­é–“å±¤ć®$ w_{11}^{(1)} $に注目してみましょう。$ w_{11}^{(2)} $ć®å¤‰ę›“ćŒå½±éŸæć‚’åŠć¼ć™ćƒ‡ćƒ¼ć‚æćÆć€$ u_1^{(1)} $态$ z_1^{(1)} $ćŠć‚ˆć³ä»„é™ćÆć™ć¹ć¦ć«ćŖć‚Šć¾ć™ć€‚

network_middle.png

čµ¤ē·šć®ćæčØˆē®—ć™ć‚Œć°ć€ć‹ćŖć‚ŠčØˆē®—é‡ćŒęø›ć‚‹ćØę€ć‚ć‚Œć¾ć™ć€‚

čŖ¤å·®é€†ä¼ę’­ę³•

é‡ćæć€ćƒć‚¤ć‚¢ć‚¹ć«åÆ¾ć™ć‚‹å‹¾é…ć‚’ć²ćØć¤ć²ćØć¤čØˆē®—ć—ć¦ć„ć¾ć—ćŸćŒć€å¾Œć§čæ°ć¹ć‚‹ļ¼’ć¤ć®ę³•å‰‡ć‚’åˆ©ē”Øć™ć‚Œć°ć‚‚ć£ćØē°”å˜ć«å‹¾é…ć®čØˆē®—ćŒć§ćć¾ć™ć€‚ę³•å‰‡ć®č©³ē“°ć‚’ē°”å˜ć«čŖ¬ę˜Žć§ććŖć„ć‹ćØč€ƒćˆćŸć®ć§ć™ćŒé›£ć—ć„ć®ć§ć€ćć‚“ćŖć‚‚ć®ć ćØčØ€ć†ē†č§£ć§ä½æć£ć¦ćæć¾ć—ć‚‡ć†ć€‚ć‚‚ć—ć€ē°”å˜ć«čŖ¬ę˜Žć™ć‚‹ę–¹ę³•ćŒč€ƒćˆć‚‰ć‚Œć‚Œć°ć€ćć®éš›ćÆę›“ę–°ć—ć¾ć™ć€‚

ć€€ę³•å‰‡ļ¼‘ļ¼šå‹¾é…ćÆć€ćƒćƒƒćƒˆćƒÆćƒ¼ć‚Æć®å„ē·šć®å‹¾é…ć®ē©ćØćŖć‚‹ć€‚

下図で、$ w_{11}^{(2)} $ć«ć¤ć„ć¦č€ƒćˆć¦ćæć¾ć™ć€‚ä»„äø‹ć§å‹¾é…ćŒčØˆē®—ć§ćć¾ć™ć€‚ä¾æå®œäøŠć€å¾Œć‚ć®ēŸ¢å°ć‹ć‚‰ę›øćć¾ć™ć€‚

$ y_1 $恮$ E() $ć«åÆ¾ć™ć‚‹å‹¾é… $ \times $ $ u_1^{(2)} $恮$ f^{(2)}() $ć«åÆ¾ć™ć‚‹å‹¾é… $ \times $ $ w_{11}^{(2)} $ć®å‹¾é…

$ y_1 $ć®å€¤ć‚’ć”ć‚‡ć£ćØå¤‰åŒ–ć—ćŸå “åˆć®$ E $ć®å¤‰åŒ–ć€$ u_1^{(2)} $ć®å€¤ć‚’ć”ć‚‡ć£ćØå¤‰åŒ–ć—ćŸå “åˆć®$ y_1 $ć®å¤‰åŒ–ć€$ w_{11}^{(2)} $ć®å€¤ć‚’ć”ć‚‡ć£ćØå¤‰åŒ–ć—ćŸå “åˆć®$ u_1^{(2)} $ć®å¤‰åŒ–ć®ē©ć«ćŖć‚Šć¾ć™ć€‚

out.png

å…·ä½“ēš„ć«č¦‹ć¦ć„ćć¾ć—ć‚‡ć†ć€‚ć¾ćšćÆå‡ŗåŠ›å±¤ć®éƒØåˆ†ć§ć™ć€‚

out2.png

å‡ŗåŠ›å±¤ć®ę“»ę€§åŒ–é–¢ę•°ć«ćÆć€softmaxé–¢ę•°ć‚’åˆ©ē”Øć—ć¦ć„ć¾ć™ć€‚å®ŸćÆć€$ u_1^{(2)} $ć‚’å¤‰åŒ–ć•ć›ć‚‹ćØć€$ y_2 $ć‚‚å¤‰åŒ–ć—ć¾ć™ć€‚ć“ć“ćÆć€ć‚Ŗćƒ¬ćƒ³ć‚øć®ēŸ¢å°ć®éƒØåˆ†ć‚’ć¾ćØć‚ć¦åÆ¾åæœć™ć‚‹ć“ćØć«ć—ć¾ć—ć‚‡ć†ć€‚ć‚Ŗćƒ¬ćƒ³ć‚øć®ēŸ¢å°ć®éƒØåˆ†ć®å‹¾é…ć‚’ $ E^{'}(u_1^{(2)}) $ で蔨します。

E^{'}(u_1^{(2)}) = \frac{E(u_1^{(2)}+h) - E(u_1^{(2)}-h)}{2h}

ꬔ恫态$ w_{11}^{(2)} $についてみてみましょう。
$ u_1^{(2)} = w_{11}^{(2)}z_1^{(1)}+w_{12}^{(2)}z_2^{(1)}+w_{13}^{(2)}z_3^{(1)}+b_1^{(2)} $ ć§ć—ćŸć€‚å‹¾é…ć‚’čØˆē®—ć—ć¦ćæć¾ć™ć€‚

\frac{((w_{11}^{(2)}+h)z_1^{(1)}+w_{12}^{(2)}z_2^{(1)}+w_{13}^{(2)}z_3^{(1)}+b_1^{(2)}) - ((w_{11}^{(2)}-h)z_1^{(1)}+w_{12}^{(2)}z_2^{(1)}+w_{13}^{(2)}z_3^{(1)}+b_1^{(2)})}{2h} = z_1^{(1)}

ē·‘ć®ēŸ¢å°éƒØåˆ†ćÆć€$ z_1^{(1)} $ć«ćŖć‚Šć¾ć—ćŸć€‚
ć‚ˆć£ć¦ć€$ w_{11}^{(2)} $ć«åÆ¾ć™ć‚‹å‹¾é…ćÆć€ä»„äø‹ć®čØˆē®—å¼ć«ćŖć‚Šć¾ć™ć€‚

z_1^{(1)} \times E^{'}(u_1^{(2)})

ćƒć‚¤ć‚¢ć‚¹($ b_1^{(2)} $)ć«ć¤ć„ć¦ć‚‚č¦‹ć¦ćæć¾ć—ć‚‡ć†ć€‚é‡ćæåŒę§˜ć«čØˆē®—ć—ć¦ćæć¾ć™ć€‚

\frac{(w_{11}^{(2)}z_1^{(1)}+w_{12}^{(2)}z_2^{(1)}+w_{13}^{(2)}z_3^{(1)}+(b_1^{(2)}+h)) - (w_{11}^{(2)}z_1^{(1)}+w_{12}^{(2)}z_2^{(1)}+w_{13}^{(2)}z_3^{(1)}+(b_1^{(2)}-h))}{2h} = 1

1ć«ćŖć‚Šć¾ć—ćŸć€‚å›³ć§ćƒć‚¤ć‚¢ć‚¹ć®ēŸ¢å°ć®å…ƒćÆć€1恧恗恟悈恭怂
ć‚ˆć£ć¦ć€$ b_1^{(2)} $ć«åÆ¾ć™ć‚‹å‹¾é…ćÆć€ä»„äø‹ć®čØˆē®—å¼ć«ćŖć‚Šć¾ć™ć€‚å˜ć«ć€ć‚Ŗćƒ¬ćƒ³ć‚øć®ēŸ¢å°ć®å‹¾é…ć«ćŖć‚Šć¾ć—ćŸć€‚

E^{'}(u_1^{(2)})

欔に、中間層を見てみましょう。$ z_1^{(1)} $ć®éƒØåˆ†ć§åˆ†å²ć—ć¦ć„ć¾ć™ć€‚

middle.png

ここで法則2を使います。

ć€€ę³•å‰‡ļ¼’ļ¼šåˆ†å²ć®å “åˆćÆć€ćć‚Œćžć‚Œć®å‹¾é…ć®å’ŒćØćŖć‚‹ć€‚

$ z_1^{(1)} $恮$ w_{11}^{(2)} $ę–¹å‘ć®å‹¾é…ć‚’čØˆē®—ć—ć¦ćæć¾ć™ć€‚

\frac{(w_{11}^{(2)}(z_1^{(1)}+h)+w_{12}^{(2)}z_2^{(1)}+w_{13}^{(2)}z_3^{(1)}+b_1^{(2)}) - (w_{11}^{(2)}(z_1^{(1)}-h)+w_{12}^{(2)}z_2^{(1)}+w_{13}^{(2)}z_3^{(1)}+b_1^{(2)})}{2h} = w_{11}^{(2)}

åŒę§˜ć«ć€$ w_{21}^{(2)} $方向は、$ w_{21}^{(2)} $ć«ćŖć‚Šć¾ć™ć€‚
ć‚ˆć£ć¦ć€ćć‚Œćžć‚Œć®é’ēŸ¢å°ć€ć‚Ŗćƒ¬ćƒ³ć‚øēŸ¢å°ć®å‹¾é…ć‚’ęŽ›ć‘ćŸå€¤ć‚’åŠ ćˆć‚Œć°ć‚ˆć„ć“ćØć«ćŖć‚Šć¾ć™ć€‚

w_{11}^{(2)} \times E^{'}(u_1^{(2)}) + w_{21}^{(2)} \times E^{'}(u_2^{(2)})

é»„č‰²ć®ēŸ¢å°ćÆć€$ f'^{(1)}(u_1^{(1)}) $ćØćŖć‚Šć¾ć™ć€‚

f'^{(1)}(u_1^{(1)}) = \frac{f^{(1)}(u_1^{(1)}+h)-f^{(1)}(u_1^{(1)}-h)}{2h}

ē·‘č‰²ć®ēŸ¢å°ćÆć€å‡ŗåŠ›å±¤ć®éš›ć«čØˆē®—ć—ćŸć‚ˆć†ć«ć€$ z_1^{(0)} $ć«ćŖć‚Šć¾ć™ć€‚
ć‚ˆć£ć¦ć€$ w_{11}^{(1)} $ć«åÆ¾ć™ć‚‹å‹¾é…ćÆć€ä»„äø‹ć®čØˆē®—å¼ć«ćŖć‚Šć¾ć™ć€‚

z_1^{(0)} \times f'^{(1)}(u_1^{(1)}) \times (w_{11}^{(2)} \times E^{'}(u_1^{(2)}) + w_{21}^{(2)} \times E^{'}(u_2^{(2)}))

ć“ć“ć§ę³Øē›®ć—ć¦ę¬²ć—ć„ć®ćÆć€å¾Œć‚ć®å‹¾é…ć‹ć‚‰é †ć«å‰ć®å‹¾é…ćŒčØˆē®—ć§ćć‚‹ć“ćØć§ć™ć€‚ēŸ¢å°ć®å‹¾é…ć‚’ļ¼‘å›žę±‚ć‚ć‚‹ć ć‘ćŖć®ć§ć€å¤§å¹…ćŖę€§čƒ½ę”¹å–„ćŒč¦‹č¾¼ć¾ć‚Œć¾ć™ć€‚

å®Ÿč£…

ćć‚Œć§ćÆć€å®Ÿč£…ć—ć¦ćæć¾ć—ć‚‡ć†ć€‚

ć¾ćšćÆć€å‡ŗåŠ›å±¤ć®$ E'(u) $ć®éƒØåˆ†ć§ć™ć€‚ļ¼ˆć‚Ŗćƒ¬ćƒ³ć‚øēŸ¢å°ć®éƒØåˆ†ļ¼‰
ęå¤±é–¢ę•°ć‚’error_funcć€å‡ŗåŠ›å±¤ć®ę“»ę€§åŒ–é–¢ę•°ć‚’output_funcとします。
é–¢ę•°åćÆć€output_error_backćØć—ć¾ć—ćŸć€‚xć®å€¤ć®ć™ć“ć—å¤§ććŖå€¤ćØå°ć•ćŖå€¤ć®å‡ŗåŠ›å±¤ć®ę“»ę€§åŒ–é–¢ę•°ć®å€¤ć‚’čØˆē®—ć—ć€ćć®å€¤ć‚’ęå¤±é–¢ę•°ć«ęø”ć—ć¾ć™ć€‚ćć—ć¦ćć®å·®ć‚’čØˆē®—ć—ć¦å‹¾é…ć‚’ę±‚ć‚ć¾ć™ć€‚


def output_error_back(x, t):
    h = 1e-4
    dx = np.zeros(x.shape)
    for idx,i in np.ndenumerate(x):
        work = x[idx]                   # ē¾åœØć®å€¤ć‚’äø€ę™‚é€€éæ
        
        x[idx] = work + h               # ć™ć“ć—å¤§ććŖå€¤
        y = output_func(x)
        xph = error_func(y, t)
        
        x[idx] = work - h               # ć™ć“ć—å°ć•ćŖå€¤
        y = output_func(x)
        xmh = error_func(y, t)

        dx[idx] = (xph - xmh) / (2*h)   # å‹¾é…čØˆē®—
        
        x[idx] = work                   # å€¤ć‚’ć‚‚ćØć«ęˆ»ć™
    return dx

ę¬”ćÆć€é’ēŸ¢å°ć®éƒØåˆ†ć§ć™ć€‚é‡ćæć€ćƒć‚¤ć‚¢ć‚¹ć®å‹¾é…ćØćØć‚‚ć«ć€äøŠä½ć«čæ”å“ć™ć‚‹å‹¾é…ć‚’ę±ŗć‚ć¾ć™ć€‚é‡ćæćÆć€é’ēŸ¢å°ć®éƒØåˆ†ļ¼ˆzć®å€¤ļ¼‰ćØć€ćć‚Œć¾ć§ć®å‹¾é…ć‚’ęŽ›ć‘ć‚Œć°ę±‚ć‚ć‚‰ć‚Œć¾ć—ćŸć€‚ćƒć‚¤ć‚¢ć‚¹ć‚‚åŒę§˜ć«é’ēŸ¢å°ć®éƒØåˆ†ćÆć€1ćŖć®ć§ēµå±€ć€ćć‚Œć¾ć§ć®å‹¾é…ć«ćŖć‚Šć¾ć™ć€‚ćƒˆćƒ¼ć‚æćƒ«ć®å‹¾é…ćÆć€ćć‚Œć¾ć§ć®å‹¾é…ćØé‡ćæć‚’ęŽ›ć‘ć‚Œć°ć‚ˆć„ć®ć§ć—ćŸć€‚å†…ē©ć‚’åˆ©ē”Øć—ć¦čØˆē®—ć—ć¦ć„ć¾ć™ć€‚
ćƒć‚¤ć‚¢ć‚¹ć®éƒØåˆ†ćÆć€ć“ć“ć§ćÆč¤‡ę•°ćƒ‡ćƒ¼ć‚æå‡¦ē†ć§ćć‚‹ć‚ˆć†ć«åÆ¾åæœć—ć¦ć„ć¾ć™ć€‚1ć‚’ęŽ›ć‘ć‚Œć°ć‚ˆć„ć®ć§ć™ćŒć€ćƒ‡ćƒ¼ć‚æä»¶ę•°åˆ†ć®1ć®é…åˆ—ć‚’ē”Øę„ć—ć€äø€åŗ¦ć«čØˆē®—ć§ćć‚‹ć‚ˆć†ć«ć—ć¦ć„ć¾ć™ć€‚


def affine_back(dx, z, W, b):
    dz = np.dot(dx, W.T)                # zć®å‹¾é…ćÆć€ä»Šć¾ć§ć®å‹¾é…ćØé‡ćæć‚’ęŽ›ć‘ćŸå€¤
    dW = np.dot(z.T, dx)                # é‡ćæć®å‹¾é…ćÆć€zć«ä»Šć¾ć§ć®å‹¾é…ć‚’ęŽ›ć‘ćŸå€¤
    size = 1
    if z.ndim == 2:
        size = z.shape[0]
    db = np.dot(np.ones(size).T, dx)    # ćƒć‚¤ć‚¢ć‚¹ć®å‹¾é…ćÆć€ä»Šć¾ć§ć®å‹¾é…ć®å€¤
    return dz, dW, db

ę¬”ć«ć€é»„č‰²ć®ēŸ¢å°ć§ć™ć€‚ę“»ę€§åŒ–é–¢ę•°ć‚’middle_funcćØć—ć¦å‹¾é…ć‚’čØˆē®—ć—ć¾ć™ć€‚ć™ć“ć—å¤§ććŖå€¤ćØå°ć•ćŖå€¤ć‹ć‚‰é»„č‰²ēŸ¢å°éƒØåˆ†ć®å‹¾é…ć‚’ę±‚ć‚ć¦ć€ć„ć¾ć¾ć§ć®å‹¾é…ć®å€¤ć‚’ęŽ›ć‘ć¾ć™ć€‚


def middle_back(dz, x):
    h = 1e-4
    work = x                            # ē¾åœØć®å€¤ć‚’äø€ę™‚é€€éæ
    
    x = work + h                        # ć™ć“ć—å¤§ććŖå€¤
    xph = middle_func(x)
    
    x = work - h                        # ć™ć“ć—å°ć•ćŖå€¤
    xmh = middle_func(x)
    
    du = (xph - xmh) / (2*h)            # å‹¾é…čØˆē®—
    x = work                            # å€¤ć‚’ć‚‚ćØć«ęˆ»ć™
    return dz * du

ć“ć‚Œć§ć€å‹¾é…ć®čØˆē®—ć«åæ…č¦ćŖé–¢ę•°ć‚’ć™ć¹ć¦ē”Øę„ć§ćć¾ć—ćŸć€‚

ä»„äø‹ćÆć€å‰å›žć®å‹¾é…ć®čØˆē®—ć§ć™ć€‚


    dW1 = calc_gradient(z0[i:i+batch_size], t[i:i+batch_size], W1)
    db1 = calc_gradient(z0[i:i+batch_size], t[i:i+batch_size], b1)
    dW2 = calc_gradient(z0[i:i+batch_size], t[i:i+batch_size], W2)
    db2 = calc_gradient(z0[i:i+batch_size], t[i:i+batch_size], b2)
    dW3 = calc_gradient(z0[i:i+batch_size], t[i:i+batch_size], W3)
    db3 = calc_gradient(z0[i:i+batch_size], t[i:i+batch_size], b3)

ä»Šå›žćÆć€ä»„äø‹ć®ć‚ˆć†ć«ćŖć‚Šć¾ć™ć€‚


    du3 = output_error_back(u3[i:i+batch_size], t[i:i+batch_size])
    dz2, dW3, db3 = affine_back(du3, z2[i:i+batch_size], W3, b3)
    du2 = middle_back(dz2, u2[i:i+batch_size])
    dz1, dW2, db2 = affine_back(du2, z1[i:i+batch_size], W2, b2)
    du1 = middle_back(dz1, u1[i:i+batch_size])
    dz0, dW1, db1 = affine_back(du1, z0[i:i+batch_size], W1, b1)

ć”ć‚‡ć£ćØć‚ć‹ć‚Šć«ćć„ć‹ć‚‚ć—ć‚Œć¾ć›ć‚“ćŒć€å¾Œć‚å“ć‹ć‚‰é †ć«å‹¾é…ć‚’ę±‚ć‚ć¦čØˆē®—ć—ć¦ć„ć¾ć™ć€‚ę±‚ć‚ćŸå‹¾é…ć‚’é †ć«å‰ć«ęø”ć—ć¦čØˆē®—ć—ć¦ć„ćć¾ć™ć€‚

é€†ä¼ę’­.png

ę¬”ć«ć€ä»Šć¾ć§ć®é–¢ę•°ć®č¦‹ē›“ć—ć‚’č”Œć„ć¾ć™ć€‚propagation関数は、途中のu,zć®å€¤ć‚’åˆ©ē”Øć—ć¾ć™ć®ć§čæ”å“ć™ć‚‹ć‚ˆć†ć«ć—ć¾ć™ć€‚ć¾ćŸć€ę“»ę€§åŒ–é–¢ę•°ć‚’ē›“ęŽ„čØ˜čæ°ć›ćšć€å®šē¾©ć‚’å¤‰ę›“ć™ć‚Œć°ć‚ˆć„ć‚ˆć†ć«ć—ć¾ć—ćŸć€‚
å¾ŒćÆć€å„é–¢ę•°ć®å®šē¾©ć§ć™ć€‚ę­£č¦åŒ–ć®é–¢ę•°ć‚‚init_funcćØć—ć¦å®šē¾©ć™ć‚‹ć‚ˆć†ć«ć—ć¾ć—ćŸć€‚


def propagation(x):
    # 中間層(1)
    u1 = affine(x, W1, b1)
    z1 = middle_func(u1)
    # 中間層(2)
    u2 = affine(z1, W2, b2)
    z2 = middle_func(u2)
    # å‡ŗåŠ›å±¤
    u3 = affine(z2, W3, b3)
    y = output_func(u3)
    return u1, z1, u2, z2, u3, y

def init_func(x):
    return min_max(x)

def middle_func(x):
    return relu(x)

def output_func(x):
    return softmax(x)

def error_func(y, t):
    return cross_entropy_error(y, t)

čŖ¤å·®é€†ä¼ę’­ę³•ć«åÆ¾åæœć—ćŸćƒ—ćƒ­ć‚°ćƒ©ćƒ ć§ć™ć€‚
ä»Šć¾ć§ć«ä½œęˆć—ćŸé–¢ę•°ē¾¤ć‚’å…ˆć«čŖ­ćæč¾¼ć¾ć›ć¦ćŠćåæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚äø€ē•Ŗäø‹ć®(å‚č€ƒ)にのせています。


import numpy as np
# ćƒŽćƒ¼ćƒ‰ę•°
d0 = 784
d1 = 50
d2 = 100
d3 = 10
# é‡ćæć€ćƒć‚¤ć‚¢ć‚¹ć®åˆęœŸåŒ–ć€å­¦ēæ’ēŽ‡ć€ćƒćƒƒćƒć‚µć‚¤ć‚ŗć®čØ­å®š
W1 = he_normal(d0,d1)
b1 = np.zeros(d1)
W2 = he_normal(d1,d2)
b2 = np.zeros(d2)
W3 = he_normal(d2,d3)
b3 = np.zeros(d3)
eta = 0.01
batch_size = 100

# MNISTćƒ‡ćƒ¼ć‚æčŖ­ćæč¾¼ćæ
x_train, t_train, x_test, t_test = load_mnist('c:\\mnist\\')
# å…„åŠ›ćƒ‡ćƒ¼ć‚æć®ę­£č¦åŒ–
z0_train = init_func(x_train)
z0_test  = init_func(x_test)

# ćƒ‡ćƒ¼ć‚æć®ć‚·ćƒ£ćƒƒćƒ•ćƒ«(ę­£č§£ćƒ‡ćƒ¼ć‚æć‚‚åŒęœŸć—ć¦ć‚·ćƒ£ćƒ•ćƒ«ć™ć‚‹åæ…č¦ćŒć‚ć‚‹ćŸć‚äø€åŗ¦ć€ēµåˆć—åˆ†é›¢)
z0_t = np.concatenate([z0_train, t_train], axis=1)
np.random.shuffle(z0_t)
z0, t = np.split(z0_t, [z0_train.shape[1]], axis=1)

# 実蔌(å­¦ēæ’ćƒ‡ćƒ¼ć‚æ)
u1_train, z1_train, u2_train, z2_train, u3_train, y_train = propagation(z0_train)
# 実蔌(ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æ)
u1_test, z1_test, u2_test, z2_test, u3_test, y_test = propagation(z0_test)
# ę­£č§£ēŽ‡č”Øē¤ŗ
print(" å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = " + str(accuracy_rate(y_train, t_train)) + " ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = " + str(accuracy_rate(y_test, t_test)))

for i in range(0,z0.shape[0],batch_size):
    # 実蔌
    u1, z1, u2, z2, u3, y = propagation(z0[i:i+batch_size])
    # å‹¾é…ć‚’čØˆē®—
    du3 = output_error_back(u3, t[i:i+batch_size])
    dz2, dW3, db3 = affine_back(du3, z2, W3, b3)
    du2 = middle_back(dz2, u2)
    dz1, dW2, db2 = affine_back(du2, z1, W2, b2)
    du1 = middle_back(dz1, u1)
    dz0, dW1, db1 = affine_back(du1, z0[i:i+batch_size], W1, b1)
    
    # é‡ćæć€ćƒć‚¤ć‚¢ć‚¹ć®čŖæę•“
    W1 = W1 - eta*dW1
    b1 = b1 - eta*db1
    W2 = W2 - eta*dW2
    b2 = b2 - eta*db2
    W3 = W3 - eta*dW3
    b3 = b3 - eta*db3

    # čŖæę•“å¾Œć®å®Ÿč”Œ(å­¦ēæ’ćƒ‡ćƒ¼ć‚æ)
    u1_train, z1_train, u2_train, z2_train, u3_train, y_train = propagation(z0_train)
    # čŖæę•“å¾Œć®å®Ÿč”Œ(ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æ)
    u1_test, z1_test, u2_test, z2_test, u3_test, y_test = propagation(z0_test)
    print(str(i+1) + " ļ½ž " + str(i+batch_size) + " å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = " + str(accuracy_rate(y_train, t_train)) + " ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = " + str(accuracy_rate(y_test, t_test)))

ä»Šå›žćÆć€ę—©ćčØˆē®—ć§ćć¾ć—ćŸć€‚

 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.0955833333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.0952
1 ļ½ž 100 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.09895 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.099
101 ļ½ž 200 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.0994666666667 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.0995
201 ļ½ž 300 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.104983333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.1053
301 ļ½ž 400 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.10805 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.1079
401 ļ½ž 500 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.117133333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.118
501 ļ½ž 600 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.120283333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.1201
601 ļ½ž 700 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.124183333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.1229
701 ļ½ž 800 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.12895 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.1272
801 ļ½ž 900 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.133833333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.1329
901 ļ½ž 1000 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.14095 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.1374

å…Øćƒ‡ćƒ¼ć‚æć€60,000ä»¶ć¾ć§å®Ÿč”Œć—ćŸć‚°ćƒ©ćƒ•ć§ć™ć€‚ę­£č§£ēŽ‡ćŒē“„87%ć¾ć§é”ć—ć¾ć—ćŸć€‚

ę­£č§£ēŽ‡_é€†ä¼ę’­.png

ć‚Øćƒćƒƒć‚Æ

å…ˆć»ć©ć®ć‚°ćƒ©ćƒ•ć‹ć‚‰ć€ć¾ć ć¾ć ę­£č§£ēŽ‡ćŒå‘äøŠć—ćć†ć§ć™ć€‚é€šåøøć®å­¦ēæ’ćÆć€ļ¼‘å›žć ć‘ć§ćŖćć€åŒć˜ćƒ‡ćƒ¼ć‚æć§ē¹°ć‚Ščæ”ć—å­¦ēæ’ć™ć‚‹ć‚ˆć†ć§ć™ć€‚ć™ć¹ć¦ć®å­¦ēæ’ćƒ‡ćƒ¼ć‚æć‚’ļ¼‘å›žå­¦ēæ’ć™ć‚‹ć“ćØć‚’ć‚Øćƒćƒƒć‚ÆćØčØ€ć„ć¾ć™ć€‚MNIST恧恂悌恰态60,000ćƒ‡ćƒ¼ć‚æć®å­¦ēæ’ć§1ć‚Øćƒćƒƒć‚Æć€åŒć˜ćƒ‡ćƒ¼ć‚æć§å†åŗ¦å­¦ēæ’ć—ć€2ć‚Øćƒćƒƒć‚Æć«ćŖć‚Šć¾ć™ć€‚
č¤‡ę•°ć‚Øćƒćƒƒć‚Æć«åÆ¾åæœć—ćŸćƒ—ćƒ­ć‚°ćƒ©ćƒ ć«äæ®ę­£ć—ć¾ć™ć€‚ęŒ‡å®šć—ćŸć‚Øćƒćƒƒć‚Æę•°ćƒ«ćƒ¼ćƒ—ć™ć‚‹ć‚ˆć†ć«ć—ć¾ć—ćŸć€‚ę­£č§£ēŽ‡ćÆć€ć‚Øćƒćƒƒć‚Æć”ćØć«ę±‚ć‚ć¾ć™ć€‚


import numpy as np
# ćƒŽćƒ¼ćƒ‰ę•°
d0 = 784
d1 = 50
d2 = 100
d3 = 10
# é‡ćæć€ćƒć‚¤ć‚¢ć‚¹ć®åˆęœŸåŒ–ć€å­¦ēæ’ēŽ‡ć€ćƒćƒƒćƒć‚µć‚¤ć‚ŗć€ć‚Øćƒćƒƒć‚Æć®čØ­å®š
W1 = he_normal(d0,d1)
b1 = np.zeros(d1)
W2 = he_normal(d1,d2)
b2 = np.zeros(d2)
W3 = he_normal(d2,d3)
b3 = np.zeros(d3)
eta = 0.01
batch_size = 100
epoch = 10

# MNISTćƒ‡ćƒ¼ć‚æčŖ­ćæč¾¼ćæ
x_train, t_train, x_test, t_test = load_mnist('c:\\mnist\\')
# å…„åŠ›ćƒ‡ćƒ¼ć‚æć®ę­£č¦åŒ–
z0_train = init_func(x_train)
z0_test  = init_func(x_test)

# ćƒ‡ćƒ¼ć‚æć®ć‚·ćƒ£ćƒƒćƒ•ćƒ«(ę­£č§£ćƒ‡ćƒ¼ć‚æć‚‚åŒęœŸć—ć¦ć‚·ćƒ£ćƒ•ćƒ«ć™ć‚‹åæ…č¦ćŒć‚ć‚‹ćŸć‚äø€åŗ¦ć€ēµåˆć—åˆ†é›¢)
z0_t = np.concatenate([z0_train, t_train], axis=1)
np.random.shuffle(z0_t)
z0, t = np.split(z0_t, [z0_train.shape[1]], axis=1)

# 実蔌(å­¦ēæ’ćƒ‡ćƒ¼ć‚æ)
u1_train, z1_train, u2_train, z2_train, u3_train, y_train = propagation(z0_train)
# 実蔌(ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æ)
u1_test, z1_test, u2_test, z2_test, u3_test, y_test = propagation(z0_test)
# ę­£č§£ēŽ‡č”Øē¤ŗ
print(" å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = " + str(accuracy_rate(y_train, t_train)) + " ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = " + str(accuracy_rate(y_test, t_test)))

for j in range(epoch):
    for i in range(0,z0.shape[0],batch_size):
        # 実蔌
        u1, z1, u2, z2, u3, y = propagation(z0[i:i+batch_size])
        # å‹¾é…ć‚’čØˆē®—
        du3 = output_error_back(u3, t[i:i+batch_size])
        dz2, dW3, db3 = affine_back(du3, z2, W3, b3)
        du2 = middle_back(dz2, u2)
        dz1, dW2, db2 = affine_back(du2, z1, W2, b2)
        du1 = middle_back(dz1, u1)
        dz0, dW1, db1 = affine_back(du1, z0[i:i+batch_size], W1, b1)
    
        # é‡ćæć€ćƒć‚¤ć‚¢ć‚¹ć®čŖæę•“
        W1 = W1 - eta*dW1
        b1 = b1 - eta*db1
        W2 = W2 - eta*dW2
        b2 = b2 - eta*db2
        W3 = W3 - eta*dW3
        b3 = b3 - eta*db3

    # čŖæę•“å¾Œć®å®Ÿč”Œ(å­¦ēæ’ćƒ‡ćƒ¼ć‚æ)
    u1_train, z1_train, u2_train, z2_train, u3_train, y_train = propagation(z0_train)
    # čŖæę•“å¾Œć®å®Ÿč”Œ(ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æ)
    u1_test, z1_test, u2_test, z2_test, u3_test, y_test = propagation(z0_test)
    print(str(j+1) + " å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = " + str(accuracy_rate(y_train, t_train)) + " ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = " + str(accuracy_rate(y_test, t_test)))

å®Ÿč”Œēµęžœć§ć™ć€‚10ć‚Øćƒćƒƒć‚Æć§94%ć¾ć§å‘äøŠć—ć¾ć—ćŸć€‚

 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.0955833333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.0952
1 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.87225 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.875
2 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.897233333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.9015
3 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.909983333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.9107
4 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.91795 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.9182
5 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.924583333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.9228
6 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.928983333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.9281
7 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.932733333333 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.9318
8 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.935916666667 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.9357
9 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.938916666667 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.9383
10 å­¦ēæ’ćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.94125 ćƒ†ć‚¹ćƒˆćƒ‡ćƒ¼ć‚æę­£č§£ēŽ‡ = 0.9409

ēµęžœć‚’č¦‹ć¦ćæć¾ć—ć‚‡ć†ć€‚ęœ€åˆć®10ä»¶ć®ēµęžœćØćć®ē”»åƒć§ć™ć€‚(MNISTć®ęœ€åˆć®10ä»¶ć§ćÆćŖćć€ć‚·ćƒ£ćƒƒćƒ•ćƒ«å¾Œć®ęœ€åˆć®10件恧恙怂)å„ę•°å­—ć®å‡ŗåŠ›ēµęžœ$ y_i $悒%で蔨示しています。正解は、太字です。
2ē•Ŗē›®ä»„å¤–ćÆć€ę­£č§£ć§ć—ćŸć€‚2番目は、1ćŒē“„50%ć§ć—ćŸć€‚ę­£č§£ćÆć€5恧恙恌态2ē•Ŗē›®ć®ē”»åƒć€5ć«č¦‹ćˆć¾ć™ć‹ļ¼Ÿ

ę•°å­— 0 1 2 3 4 5 6 7 8 9
1 0.00 0.00 0.01 0.01 0.00 0.00 0.00 99.97 0.00 0.01
2 1.76 50.06 10.49 3.33 0.07 22.13 0.44 1.08 10.56 0.07
3 0.00 0.00 0.00 0.01 0.00 0.00 0.00 99.88 0.00 0.11
4 0.09 0.00 0.73 0.02 0.01 0.30 98.84 0.00 0.00 0.00
5 0.01 0.00 0.01 0.33 0.00 0.57 0.00 0.00 98.85 0.22
6 0.37 0.01 98.85 0.27 0.00 0.01 0.49 0.00 0.00 0.00
7 0.02 0.45 0.54 1.31 0.12 7.25 84.60 0.00 5.66 0.06
8 0.00 0.01 2.80 0.01 0.79 0.76 95.59 0.00 0.05 0.00
9 0.00 0.34 98.31 0.38 0.00 0.00 0.97 0.00 0.00 0.00
10 0.02 0.80 0.47 1.19 0.10 18.47 0.01 0.33 78.56 0.03

ć‚¤ćƒ”ćƒ¼ć‚ø10ä»¶.png

11ä»¶ē›®ä»„é™ć§ć€äøę­£č§£ć ć£ćŸ10ä»¶ć§ć™ć€‚ę­£č§£ć®ę•°å­—ć‚’å¤Ŗå­—ć€ę­£č§£ćØåˆ¤ę–­ć—ćŸę•°å­—ć‚’ć‚¤ć‚æćƒŖćƒƒć‚Æć§ē¤ŗć—ć¾ć™ć€‚
特に43番目,67番目は、90%ä»„é™ć®ē¢ŗēŽ‡ć§ę­£č§£ćØć—ć¦ć„ć¾ć™ćŒć€äøę­£č§£ć§ć—ćŸć€‚43番目は、正解は2恧恙恌态0ćØåˆ¤ę–­ć—ć¾ć—ćŸć€‚67番目は、正解は5恧恙恌态8ćØåˆ¤ę–­ć—ć¾ć—ćŸć€‚ć“ć‚Œć‚‰ć®ę•°å­—ćÆć€äŗŗć®ē›®ć§ć‚‚ć€é–“é•ć†äŗŗćŒå¤šć„ć®ć§ćÆļ¼Ÿ

ę•°å­— 0 1 2 3 4 5 6 7 8 9
16 1.30 0.01 0.91 60.95 0.42 19.72 0.10 0.05 15.90 0.64
43 95.79 0.00 0.60 2.00 0.00 1.31 0.00 0.00 0.29 0.00
67 2.10 0.00 0.00 0.06 0.00 1.87 0.03 0.00 95.61 0.33
74 0.01 0.01 4.67 26.31 0.00 0.32 0.00 67.92 0.01 0.74
93 51.63 0.01 26.58 13.92 0.00 7.72 0.02 0.02 0.09 0.00
108 0.03 0.01 0.63 0.20 9.68 0.00 0.04 1.37 0.05 87.97
111 0.20 21.41 0.70 3.23 0.19 33.32 0.27 0.24 40.31 0.13
138 69.89 0.00 29.59 0.48 0.00 0.04 0.00 0.00 0.00 0.00
141 0.35 0.10 68.16 15.53 0.01 12.05 0.22 0.03 3.54 0.02
151 0.04 0.00 0.01 0.19 0.00 13.27 0.01 0.00 86.46 0.01

ć‚¤ćƒ”ćƒ¼ć‚ø10件誤答.png

é‡ćæć€ćƒć‚¤ć‚¢ć‚¹ć®å¤‰åŒ–

å…ˆć»ć©ć®å®Ÿč”Œå¾Œć®é‡ćæć€ćƒć‚¤ć‚¢ć‚¹ć®ęœ€å°å€¤ć€ęœ€å¤§å€¤ć€å¹³å‡å€¤ć‚’č¦‹ć¦ćæć¾ć—ć‚‡ć†ć€‚


print('W1 ęœ€å°å€¤ = ' + str(np.min(W1)) + ' ([' + str(np.int(np.argmin(W1)/W1.shape[1])) + '][' + str(np.mod(np.argmin(W1),W1.shape[1])) + '])')
print('W1 平均値 = ' + str(np.mean(W1)))
print('W1 ęœ€å¤§å€¤ = ' + str(np.max(W1)) + ' ([' + str(np.int(np.argmax(W1)/W1.shape[1])) + '][' + str(np.mod(np.argmax(W1),W1.shape[1])) + '])')
print('W1 ęØ™ęŗ–åå·® = ' + str(np.std(W1)))
print('b1 ęœ€å°å€¤ = ' + str(np.min(b1)) + ' ([' + str(np.argmin(b1)) + '])')
print('b1 平均値 = ' + str(np.mean(b1)))
print('b1 ęœ€å¤§å€¤ = ' + str(np.max(b1)) + ' ([' + str(np.argmax(b1)) + '])')
print('b1 ęØ™ęŗ–åå·® = ' + str(np.std(b1)))

print('W2 ęœ€å°å€¤ = ' + str(np.min(W2)) + ' ([' + str(np.int(np.argmin(W2)/W2.shape[1])) + '][' + str(np.mod(np.argmin(W2),W2.shape[1])) + '])')
print('W2 平均値 = ' + str(np.mean(W2)))
print('W2 ęœ€å¤§å€¤ = ' + str(np.max(W2)) + ' ([' + str(np.int(np.argmax(W2)/W2.shape[1])) + '][' + str(np.mod(np.argmax(W2),W2.shape[1])) + '])')
print('W2 ęØ™ęŗ–åå·® = ' + str(np.std(W2)))
print('b2 ęœ€å°å€¤ = ' + str(np.min(b2)) + ' ([' + str(np.argmin(b2)) + '])')
print('b2 平均値 = ' + str(np.mean(b2)))
print('b2 ęœ€å¤§å€¤ = ' + str(np.max(b2)) + ' ([' + str(np.argmax(b2)) + '])')
print('b2 ęØ™ęŗ–åå·® = ' + str(np.std(b2)))

print('W3 ęœ€å°å€¤ = ' + str(np.min(W3)) + ' ([' + str(np.int(np.argmin(W3)/W3.shape[1])) + '][' + str(np.mod(np.argmin(W3),W3.shape[1])) + '])')
print('W3 平均値 = ' + str(np.mean(W3)))
print('W3 ęœ€å¤§å€¤ = ' + str(np.max(W3)) + ' ([' + str(np.int(np.argmax(W3)/W3.shape[1])) + '][' + str(np.mod(np.argmax(W3),W3.shape[1])) + '])')
print('W3 ęØ™ęŗ–åå·® = ' + str(np.std(W3)))
print('b3 ęœ€å°å€¤ = ' + str(np.min(b3)) + ' ([' + str(np.argmin(b3)) + '])')
print('b3 平均値 = ' + str(np.mean(b3)))
print('b3 ęœ€å¤§å€¤ = ' + str(np.max(b3)) + ' ([' + str(np.argmax(b3)) + '])')
print('b3 ęØ™ęŗ–åå·® = ' + str(np.std(b3)))

ēµęžœć§ć™ć€‚ę‹¬å¼§å†…ćÆć€č¦ē“ ē•Ŗå·ć‚’č”Øć—ć¾ć™ć€‚
ēµę§‹ć€å°ć•ć„å€¤ć«ćŖć£ć¦ć„ć¾ć™ć€‚å¹³å‡ćÆć€0に近いですね。

W1 ęœ€å°å€¤ = -0.215683681507 ([487][20])
W1 平均値 = 0.00289181066786
W1 ęœ€å¤§å€¤ = 0.226295371151 ([434][44])
W1 ęØ™ęŗ–åå·® = 0.0537721940886
b1 ęœ€å°å€¤ = -0.080514889263 ([11])
b1 平均値 = 0.0250239727252
b1 ęœ€å¤§å€¤ = 0.141728276556 ([4])
b1 ęØ™ęŗ–åå·® = 0.0499303977195
W2 ęœ€å°å€¤ = -0.834521381206 ([24][86])
W2 平均値 = 0.00318932553046
W2 ęœ€å¤§å€¤ = 0.828200612032 ([46][9])
W2 ęØ™ęŗ–åå·® = 0.210507854251
b2 ęœ€å°å€¤ = -0.0903755259307 ([47])
b2 平均値 = 0.0136107723887
b2 ęœ€å¤§å€¤ = 0.121659228401 ([58])
b2 ęØ™ęŗ–åå·® = 0.0323200998782
W3 ęœ€å°å€¤ = -0.67279333296 ([81][7])
W3 平均値 = 0.00255267426697
W3 ęœ€å¤§å€¤ = 0.584028052995 ([48][7])
W3 ęØ™ęŗ–åå·® = 0.183865649512
b3 ęœ€å°å€¤ = -0.172679974526 ([8])
b3 平均値 = -6.52443168936e-10
b3 ęœ€å¤§å€¤ = 0.156593237942 ([5])
b3 ęØ™ęŗ–åå·® = 0.080831611452

ę¬”ć«ć€é‡ćæć€ćƒć‚¤ć‚¢ć‚¹ćŒć€ć©ć®ć‚ˆć†ć«å¤‰åŒ–ć—ćŸć‹ć‚’ć‚°ćƒ©ćƒ•ć«ęć„ć¦ćæć¾ć—ćŸć€‚
ä»„å¤–ćØå¤‰åŒ–ćŒå°‘ćŖć„ć§ć™ć­ć€‚ć‚°ćƒ©ćƒ•ć‚’ęć„ć¦ćæć¾ć—ćŸćŒć€ć“ć®ēµęžœć‚’ć©ć†ćØć‚‰ćˆćŸć‚‰ć‚ˆć„ć‹ć€ē¾ę™‚ē‚¹ć§ćÆć‚ć‹ć‚Šć¾ć›ć‚“ć€‚

é‡ćæćƒ»ćƒć‚¤ć‚¢ć‚¹ęŽØē§».png

ć—ć‹ć—ć€å®Ÿč³Ŗę•°åć‚¹ćƒ†ćƒƒćƒ—ć®ćƒ—ćƒ­ć‚°ćƒ©ćƒ ć§ć€ć“ć“ć¾ć§ć§ććŸć“ćØć«ć³ć£ćć‚Šć§ć™ć€‚ć—ć‹ć‚‚ć€ę•°å­—ć§ćŖćć¦ć‚‚ć€"ā—‹","ā–³"态"Ɨ"ć§ć‚‚ć€ć‚¢ćƒ«ćƒ•ć‚”ćƒ™ćƒƒćƒˆć§ć‚‚ćƒ­ć‚øćƒƒć‚Æć‚’å¤‰ę›“ć›ćšć«åÆ¾åæœć§ćć¦ć—ć¾ć„ć¾ć™ć€‚

ę¬”å›žć“ćć€ć„ć‚ć„ć‚ćƒ‘ćƒ©ćƒ”ćƒ¼ć‚æć‚’å¤‰ę›“ć—ć¦ć€č©¦ć—ć¦ćæć¾ć™ć€‚

(å‚č€ƒ)
ä»Šć¾ć§ć«ä½œęˆć—ćŸé–¢ę•°ć§ć™ć€‚


import gzip
import numpy as np
def load_mnist( mnist_path ) :
    return _load_image(mnist_path + 'train-images-idx3-ubyte.gz'), \
           _load_label(mnist_path + 'train-labels-idx1-ubyte.gz'), \
           _load_image(mnist_path + 't10k-images-idx3-ubyte.gz'), \
           _load_label(mnist_path + 't10k-labels-idx1-ubyte.gz')
def _load_image( image_path ) :
    # ē”»åƒćƒ‡ćƒ¼ć‚æć®čŖ­ćæč¾¼ćæ
    with gzip.open(image_path, 'rb') as f:
        buffer = f.read()
    size = np.frombuffer(buffer, np.dtype('>i4'), 1, offset=4)
    rows = np.frombuffer(buffer, np.dtype('>i4'), 1, offset=8)
    columns = np.frombuffer(buffer, np.dtype('>i4'), 1, offset=12)
    data = np.frombuffer(buffer, np.uint8, offset=16)
    image = np.reshape(data, (size[0], rows[0]*columns[0]))
    image = image.astype(np.float32)
    return image
def _load_label( label_path ) :
    # ę­£č§£ćƒ‡ćƒ¼ć‚æčŖ­ćæč¾¼ćæ
    with gzip.open(label_path, 'rb') as f:
        buffer = f.read()
    size = np.frombuffer(buffer, np.dtype('>i4'), 1, offset=4)
    data = np.frombuffer(buffer, np.uint8, offset=8)
    label = np.zeros((size[0], 10))
    for i in range(size[0]):
        label[i, data[i]] = 1
    return label

def min_max(x, axis=None):
    x_min = np.min(x, axis=axis, keepdims=True) # ęœ€å°å€¤ć‚’ę±‚ć‚ć‚‹
    x_max = np.max(x, axis=axis, keepdims=True) # ęœ€å¤§å€¤ć‚’ę±‚ć‚ć‚‹
    return (x-x_min)/np.maximum((x_max-x_min),1e-7)

def z_score(x, axis = None):
    x_mean = np.mean(x, axis=axis, keepdims=True) # å¹³å‡å€¤ć‚’ę±‚ć‚ć‚‹
    x_std  = np.std(x, axis=axis, keepdims=True)  # ęØ™ęŗ–åå·®ć‚’ę±‚ć‚ć‚‹
    return (x-x_mean)/np.maximum(x_std,1e-7)

def affine(z, W, b):
    return np.dot(z, W) + b

def sigmoid(x):
    return 1/(1 + np.exp(-x))

def tanh(x):
    return np.tanh(x)

def relu(x):
    return np.maximum(0, x)

def identity(x):
    return x

def softmax(x):
    x = x.T
    max_x = np.max(x, axis=0)
    exp_x = np.exp(x - max_x)
    sum_exp_x = np.sum(exp_x, axis=0)
    y = exp_x/sum_exp_x
    return y.T

def lecun_normal(d_1, d):
    std = 1/np.sqrt(d_1)
    return np.random.normal(0, std, (d_1, d))
def lecun_uniform(d_1, d):
    min = -np.sqrt(3/d_1)
    max = np.sqrt(3/d_1)
    return np.random.uniform(min, max, (d_1, d))

def glorot_normal(d_1, d):
    std = np.sqrt(2/(d_1+d))
    return np.random.normal(0, std, (d_1, d))
def glorot_uniform(d_1, d):
    min = -np.sqrt(6/(d_1+d))
    max = np.sqrt(6/(d_1+d))
    return np.random.uniform(min, max, (d_1, d))

def he_normal(d_1, d):
    std = np.sqrt(2/d_1)
    return np.random.normal(0, std, (d_1, d))
def he_uniform(d_1, d):
    min = -np.sqrt(6/d_1)
    max = np.sqrt(6/d_1)
    return np.random.uniform(min, max, (d_1, d))

def mean_squared_error(y, t):
    size = 1
    if y.ndim == 2:
        size = y.shape[0]
    return 0.5 * np.sum((y-t)**2)/size
def cross_entropy_error(y, t):
    size = 1
    if y.ndim == 2:
        size = y.shape[0]
    return -np.sum(t * np.log(y))/size

def calc_gradient(x, t, w):
    h = 1e-4
    gradient = np.zeros(w.shape)
    for idx,i in np.ndenumerate(w):     # ć™ć¹ć¦ć®ćƒ‡ćƒ¼ć‚æć«åÆ¾ć—ć¦å®Ÿč”Œ
        work = w[idx]                   # ē¾åœØć®å€¤ć‚’äø€ę™‚é€€éæ
        
        w[idx] = work + h               # ć™ć“ć—å¤§ććŖå€¤
        yph = propagation(x)
        eph = error_func(yph, t)
        
        w[idx] = work - h               # ć™ć“ć—å°ć•ćŖå€¤
        ymh = propagation(x)
        emh = error_func(ymh, t)
        
        gradient[idx] = (eph - emh) / (2*h) # å‹¾é…čØˆē®—
        
        w[idx] = work                   # å€¤ć‚’ć‚‚ćØć«ęˆ»ć™
    return gradient

def accuracy_rate(y, t):
    max_y = np.argmax(y, axis=1)
    max_t = np.argmax(t, axis=1)
    return np.sum(max_y == max_t)/y.shape[0]

def affine_back(dx, z, W, b):
    dz = np.dot(dx, W.T)                # zć®å‹¾é…ćÆć€ä»Šć¾ć§ć®å‹¾é…ćØé‡ćæć‚’ęŽ›ć‘ćŸå€¤
    dW = np.dot(z.T, dx)                # é‡ćæć®å‹¾é…ćÆć€zć«ä»Šć¾ć§ć®å‹¾é…ć‚’ęŽ›ć‘ćŸå€¤
    size = 1
    if z.ndim == 2:
        size = z.shape[0]
    db = np.dot(np.ones(size).T, dx)    # ćƒć‚¤ć‚¢ć‚¹ć®å‹¾é…ćÆć€ä»Šć¾ć§ć®å‹¾é…ć®å€¤
    return dz, dW, db

def middle_back(dz, x):
    h = 1e-4
    work = x                            # ē¾åœØć®å€¤ć‚’äø€ę™‚é€€éæ
    
    x = work + h                        # ć™ć“ć—å¤§ććŖå€¤
    xph = middle_func(x)
    
    x = work - h                        # ć™ć“ć—å°ć•ćŖå€¤
    xmh = middle_func(x)
    
    du = (xph - xmh) / (2*h)            # å‹¾é…čØˆē®—
    x = work                            # å€¤ć‚’ć‚‚ćØć«ęˆ»ć™
    return dz * du

def output_error_back(x, t):
    h = 1e-4
    dx = np.zeros(x.shape)
    for idx,i in np.ndenumerate(x):
        work = x[idx]                   # ē¾åœØć®å€¤ć‚’äø€ę™‚é€€éæ
        
        x[idx] = work + h               # ć™ć“ć—å¤§ććŖå€¤
        y = output_func(x)
        xph = error_func(y, t)
        
        x[idx] = work - h               # ć™ć“ć—å°ć•ćŖå€¤
        y = output_func(x)
        xmh = error_func(y, t)

        dx[idx] = (xph - xmh) / (2*h)   # å‹¾é…čØˆē®—
        
        x[idx] = work                   # å€¤ć‚’ć‚‚ćØć«ęˆ»ć™
    return dx
9
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?