ããã¯ãç³ã¿èŸŒã¿ãããã¯ãŒã¯ã«é¢ããèšäºã®æåŸã®éšåã§ãã èªãåã«ããããã¯ãŒã¯å±€ãšãã®åäœã®åçãããã³ã¢ãã«å šäœã®ãã¬ãŒãã³ã°ã«é¢äžããå ¬åŒã«ã€ããŠèª¬æãã第1éšãšç¬¬2éšã«ç²Ÿéããããšããå§ãããŸãã ä»æ¥ã¯ãPythonã§èšè¿°ãããç³ã¿èŸŒã¿ãããã¯ãŒã¯ãæåã§ãã¹ãããèšè¿°ããããããã¯ãŒã¯ãMNISTããŒã¿ã»ããã«é©çšããçµæãtensorflowã©ã€ãã©ãªãšæ¯èŒãããšãã«çºçããå¯èœæ§ã®ããæ©èœãšå°é£ã調ã¹ãŸãã
ããã§ããããã¯ãŒã¯ã®åºæ¬æŠå¿µãã¬ã€ã€ãŒã®æ§é ãããã³ãããã®ã·ãŒã±ã³ã¹ããã§ã«èŠãããšãã§ããŸãã 以äžã«ãã³ãŒãã§å®è£ ããæ¹æ³ã§åã¬ã€ã€ãŒã瀺ããŸãã-åã¬ã€ã€ãŒãåå¥ã®æ©èœãšããŠïŒå®éšãšããŠãæ°ããã¬ã€ã€ãŒãåé€ãŸãã¯è¿œå ãããã亀æããããç¬èªã®æ°ããã¬ã€ã€ãŒãäœæãããã§ããŸãïŒïŒ
ãããã¯ãŒã¯ãçŽæ¥éé
1ïŒç³ã¿èŸŒã¿ãããã¯ãŒã¯ã®æåã®å±€
2ïŒMaxpoolingã¬ã€ã€ãŒ
3ïŒç³ã¿èŸŒã¿ãããã¯ãŒã¯ã®2çªç®ã®å±€
4ïŒãã¹ãŠã®æ©èœãããã1ã€ã®ãã¯ã¿ãŒã«è¿œå ïŒããã¯å®å šã«ãæ¬æ Œçãªãã¬ã€ã€ãŒã§ã¯ãããŸããããããã§ãããã§éèŠãªå Žæãå ããŸãïŒ
5ïŒfcãããã¯ãŒã¯ã®æåã®å±€
6ïŒfcãããã¯ãŒã¯ã®2çªç®ã®å±€
7ïŒæ倱é¢æ°ã®å€ã®èšç®
ãããã¯ãŒã¯ãéã«ééãããã©ã¡ãŒã¿ãŒãæŽæ°ããŸãïŒãã¹ãŠã®ã¬ã€ã€ãŒãéã®é åºã§å®è¡ããŸãïŒ
8ïŒæ倱ã«ããããã¯ãããã
9ïŒfcãããã¯ãŒã¯ã®2çªç®ã®å±€
10ïŒfcãããã¯ãŒã¯ã®æåã®å±€
11ïŒãã¯ã¿ãŒããã®æ©èœãããã®å±éïŒããã«ãã¬ã€ã€ãŒã§ããªãïŒ
12ïŒç³ã¿èŸŒã¿ãããã¯ãŒã¯ã®ç¬¬2å±€
13ïŒMaxpoolingã¬ã€ã€ãŒ
14ïŒç³ã¿èŸŒã¿ãããã¯ãŒã¯ã®æåã®å±€
ãã¡ããããã®ã¢ãã«ãæ©æ¢°åŠç¿çšã«æé©åãããã©ã€ãã©ãªãããéãåäœããããšãæåŸ ããªãã§ãã ããã ããããæçµçãªç®æšã¯ãè¿ éãªå®è£ ãæžãããšã§ã¯ãªããã©ã€ãã©ãªã®ä»çµã¿ãç解ããæäžäœã¬ãã«ã§ãã¥ãŒã©ã«ãããã¯ãŒã¯ãç¬ç«ããŠæ§ç¯ããæ¹æ³ãåŠã¶ããšã§ãããããŠãäœæ¥ã®ååãšåŒãæ±ã£ã以åã®èšäºã®åŸãã³ãŒããæžãããšã ããæ®ã£ãŠããŸãã 以äžã¯ãã®ãããªã³ãŒãã®äŸã§ãã
model.py-ãããã¯ãŒã¯ãæ§æãããã¹ãŠã®åºæ¬æ©èœãããã«ä¿åãããŸãã éå»ã®èšäºã§ãã§ã«å€ãã®æ©èœãåãäžããŸããã
np_mnist_train_test.py-ãããã¯ãŒã¯èªäœãšãã®å ¥åãã©ã¡ãŒã¿ãŒã ãããã¯ãŒã¯ã¯ãmodel.pyã§å®çŸ©ãããé¢æ°ããæ§ç¯ãããèšäºã®åé ã§å®çŸ©ãã14ãã€ã³ããšæåéãåãã«èŠããŸãã
ïŒç§ã¯é¢æ°ã®åŒæ°ãé ããŸããããæ¡åŒµããã圢åŒã§ã¯ãã¹ãŠãäžæ°å³ã«èŠããŸãïŒ
ããããçµæã®èª¬æã«é²ãåã«ãç§ã¯å¥ã®ããšã«è§ŠããããšæããŸãã èšè¿°ãããã¢ãã«ãããŒã¿ã«é©çšãããšãã¢ãã«ããã¬ãŒãã³ã°ããããã¹ãŠããšã©ãŒãªãå®è¡ãããããšãããããŸããã ãã ãããããã¯ãŒã¯ãæ£ããæ©èœããŠããããšããã¹ãŠã®å éšèšç®ãæ£ããããšã確èªãããã£ãã®ã§ãã ãããŠãæãæçœãªè§£æ±ºçã¯ãããšãã°MNISTãããŒã¿ã»ãããšããŠäœ¿çšããŠããã®ã¢ãã«ããã³ãœã«ãããŒã®åæ§ã®ã¢ãŒããã¯ãã£ãšæ¯èŒããããšã§ããã
ãã³ãœã«ãããŒã§ã®ãããã¯ãŒã¯ã®èšè¿°ã¯ã¯ããã«ç°¡åã§ãããå®éã ãã®ãªãã·ã§ã³ããã³ãœã«ãããŒããã¥ã¢ã«ããåãããã©ã¡ãŒã¿ãå°ã調æŽããŸããã ãã®ãããªã¢ãã«ãå€æããŸããïŒ
tf_mnist_train_test.py
äž¡æ¹ã®ã¢ãã«ã®çµæãäžèŽããããšã確èªããã«ã¯ãæåã«ãããã®éå§ééãåäžã§ããããšã確èªããå¿ èŠããããŸãã ããã§æåã®é£ããããããŸãã-æåã«ã©ã³ãã ã«çæãããéã¿è¡åãäžèŽããããã«ãnumpyãštensorflowã®ã·ãŒããåå¥ã«ä¿®æ£ã§ããŸããã§ããã ç§ã¯ãã®ããªãã¯ãæãã€ããŸããïŒtesnrflowã§ãŠã§ã€ããäœæããäž¡æ¹ã®ã¢ãã«ã«ãã£ãŒãããŸãã ããããç§ã«ã¯ãã®åé¡ã解決ã§ããã©ããããããç°¡åã«ã§ããããã«æããŸãã ãã ããæçµçã«ã¯ãã¹ãŠã次ã®ããã«ãªããŸãã
code_demo_tf_reshape.py
gitãªã³ã¯
import numpy as np import tensorflow as tf tf_w = tf.truncated_normal([2, 2, 1, 4], stddev=0.1) with tf.Session() as sess: np_w = sess.run(tf_w) print('\n tensorflow: \n \n', np_w) print('\n \n :') for i in range(len(np_w)): print('\n', np_w[i]) conv_w = [] np_w = np.reshape(np_w, (np_w.size,)) np_w = np.reshape(np_w, (4,2,2), order='F') print('\n \n , tensorflow:') for i in range(4): conv_w.append(np_w[i].T) print('\n', conv_w[-1])
ã¹ã¯ãªããåºåã®äŸ
ãã³ãœã«ããéã¿ãèŠãé åºã§ãã€ãŸããã©ã€ãã©ãªå ã®ãããªãäœæ¥ã§äœ¿çšãããããã«ããã³ãœã«ããéã¿ãæœåºããããã«ãäžèšã®ã³ãŒãã䜿çšããŸããã ã芧ã®ãšããããã¹ãŠãå®å šã«ç°¡åãªããã§ã¯ãããŸããããã³ãœã«ãããŒãã³ãœã«ã¯ãnumpyã¢ãã«ã§äœ¿çšã§ããããã«ãããã€ãã®å€æãšè»¢çœ®ãè¡ãå¿ èŠããããŸããã ãŸãããã®ãããä»ã®ããã€ãã®æ©èœãæžãçŽãå¿ èŠããããŸããã ããšãã°ããã¹ãŠã®ãã£ãŒãã£ãããã1ã€ã®ãã¯ãã«ã«çµåããæ©èœã¯ãç³ã¿èŸŒã¿å±€ã®åŸã«å€æ°ã®ãã£ãŒãã£ãããã圢æãããfcãããã¯ãŒã¯ã«ãã£ãŒãããããã«ãããããã¯ãã«åããå¿ èŠãããå Žåã§ãã äžèšã®æ¹æ³ã䜿çšããŠãã³ãœã«ããããªãã¯ã¹ã«åå²ããåŸããã³ãœã«ãããŒã®å éšãšåãããã«èŠããå Žåããããªãã¯ã¹ããã®ãããªãã¯ãã«ã«çµåããããšã¯ã§ããªããªããŸããã ãããŠããããéæããããã«ã次ã®ããšãããªããã°ãªããŸããïŒ
ãããã£ãŠããšã©ãŒã®éäŒæäžã«å®å šã«æ¥ç¶ãããã¬ã€ã€ãŒãééãããšãåŸé ã®ãã¯ãã«ãåŸãããŸããããããã£ãŒãã£ãããã«ããŸã£ããã«æ»ããå¿ èŠããããŸãã ããã¯äžã®å³ã®ããã«ãå察æ¹åã«ã®ã¿è¡ãããŸãã ãã¡ãããnumpyã¢ãã«ãštenosorflowã¢ãã«ã®èšç®çµæãæ¯èŒããããšãç®çã§ãªãå Žåããããã®é¢æ°ã¯ç°¡åãªæ¹æ³ã§äœæã§ããŸãã ãã®ãããå®éã«ã¯ãmodel.pyã§é¢æ°matrix2vectorïŒè¡åããã¯ãã«ã«å€æããïŒããã³vector2matrixïŒãã¯ãã«ãè¡åã«å€æããïŒã®æ©èœã説æããŸããã
以äžïŒãã£ãŒãã£ãŒãããã¯ãããã°ããäºãã®ç¬ç«ããç»åãšããŠã§ã¯ãªãã1ã€ã®ãã£ã³ãã«ãšèŠãªãããŸãã æåã«ãåºåã«4ã€ã®æ©èœããããå¿ èŠãªå Žåã4ã€ã®ã³ã¢ãå¿ èŠã§ãããšæ³å®ããŸãããããã¹ãŠãå°ãç°ãªã£ãŠåºåãããŸãã åã®ã¬ã€ã€ãŒã®ãã¹ãŠã®æ©èœã«ãŒãã¯å€ãã®ãã£ãã«ãæã€1ã€ã®ç»åãšèŠãªãããããã次ã®ã¬ã€ã€ãŒã§1ã€ã®ã«ãŒãã®ã¿ãååŸããã«ã¯ãåã®ã¬ã€ã€ãŒã®ãã£ãã«ãšåãæ°ã®ãŠã§ã€ããããªãã¯ã¹ãäœæããå¿ èŠããããŸãïŒããããã2ã€ã®ã«ãŒãã®2åã®ãŠã§ã€ããããªãã¯ã¹ïŒã 次ã«ãé©åãªæ°ã®ãäžéãã«ãŒããååŸãããããã1ã€ã«è¿œå ããŸããããããç®çã®1ã€ã®æ©èœãããã«ãªããŸãã ããšãã°ãåã®ã¬ã€ã€ãŒã§2æã®ã«ãŒããååŸãã次ã®ã¬ã€ã€ãŒã§4æã®ã«ãŒããååŸãããå Žåã次ã®ããã«ãªããŸãã
åèšãããšããäžéããã£ãŒãã£ããããæ··åšããŠãæçµãããããååŸããŠããããã«èŠããŸãããããèŠããšãå ã®ã¬ã€ã€ãŒã®ç°ãªããã£ãã«ããã®ãäžéããã£ãŒãã£ãããã®ã¿ãå®éã«æçµãããã«åèšãããŠããããšã¯æããã§ãã ãã¶ããäžã®ç»åã®ãããã§ããããç解ãããã§ãããïŒ
ããã§ã¯ã1ã€ã®RGBç»åãã2ã€ã®æ©èœããããååŸããŸãã ãŸãããšã©ãŒã®éäŒæã®å Žåããããã®ãäžéãã«ãŒãã¯ãŸã£ãã䜿çšãããªãããšã«æ³šæããŠãã ãããããã°ã©ã ã®ç解ã«ã¯ãŸã£ããååšããŸããã åã®ã¬ã€ã€ãŒã®åéã¿ãããªãã¯ã¹ãšæ©èœãããã¯ã次ã®ã¬ã€ã€ãŒã®å¯Ÿå¿ãããæçµãã«ãŒãã«é¢é£ä»ããããŠããŸãã
ãã³ãœã«ãããŒèšç®ã®æ¬¡ã®æ©èœã¯ãçžäºçžé¢ãå®éã«tf.nn.conv2dé¢æ°å ã§çºçããããšã§ãããããã¯ãã³ãœã«ãããŒããã¥ã¢ã«ã«ãèšèŒãããŠããŸã ã
ãããã®opã¯ãç³ã¿èŸŒã¿ããšåŒã°ããŸããããã£ã«ã¿ãŒãå転ããã«ãã£ã«ã¿ãŒãå ¥åãŠã£ã³ããŠãšçµåããããããå³å¯ã«ã¯ãçžäºçžé¢ããšåŒã°ããŸãã 詳现ã«ã€ããŠã¯ãçžäºçžé¢ã®ããããã£ãåç §ããŠãã ããã
ããããnumpyã§ã®å®è£ ã§ã¯TrueããFalseã«å€æŽããã ãã§ååãªã®ã§ãããã¯å€§ããªåé¡ã«ã¯ãªããŸããã§ããã çžäºçžé¢ã䜿çšãããŠããããšã確èªããããã«äœ¿çšã§ããã³ãŒãã®äŸã次ã«ç€ºããŸãã
code_demo_cross_correlation.py
gitãªã³ã¯
import tensorflow as tf import numpy as np np.random.seed(0) tf.set_random_seed(0) # from pudb import set_trace; set_trace() # # numpy tf_w1 = tf.truncated_normal([3, 3, 1, 1], stddev=0.1) with tf.Session() as sess: w1 = sess.run(tf_w1) x = tf.constant(0.1, shape=[4, 4]) input_image = tf.reshape(x, [-1, 4, 4, 1]) w_conv1 = tf.Variable(w1) h_conv1 = tf.nn.conv2d(input_image, w_conv1, strides=[1, 1, 1, 1], padding='SAME') with tf.Session() as sess: sess.run(tf.global_variables_initializer()) w_conv = sess.run(h_conv1) w_conv = np.reshape(w_conv, (w_conv.size,)) w_conv = np.reshape(w_conv, (1,4,4), order='F') # ! print('\n "" tensorflow:') for i in range(1): print(w_conv[i].T) w1 = np.reshape(w1, (w1.size,)) w1 = np.reshape(w1, (1,3,3), order='F') for i in range(1): w_l = w1[i].T y_l_minus_1 = np.array([ [0.1,0.1,0.1,0.1], [0.1,0.1,0.1,0.1], [0.1,0.1,0.1,0.1], [0.1,0.1,0.1,0.1]]) other_parameters={ 'convolution':False, 'stride':1, 'center_w_l':(1,1), } def convolution_feed_x_l(y_l_minus_1, w_l, conv_params): indexes_a, indexes_b = create_indexes(size_axis=w_l.shape, center_w_l=conv_params['center_w_l']) stride = conv_params['stride'] # x_l = np.zeros((1,1)) # if conv_params['convolution']: g = 1 # else: g = -1 # # i j y_l_minus_1 , x_l for i in range(y_l_minus_1.shape[0]): for j in range(y_l_minus_1.shape[1]): demo = np.zeros([y_l_minus_1.shape[0], y_l_minus_1.shape[1]]) # result = 0 element_exists = False for a in indexes_a: for b in indexes_b: # , if i*stride - g*a >= 0 and j*stride - g*b >= 0 \ and i*stride - g*a < y_l_minus_1.shape[0] and j*stride - g*b < y_l_minus_1.shape[1]: result += y_l_minus_1[i*stride - g*a][j*stride - g*b] * w_l[indexes_a.index(a)][indexes_b.index(b)] # "" w_l demo[i*stride - g*a][j*stride - g*b] = w_l[indexes_a.index(a)][indexes_b.index(b)] element_exists = True # , i j if element_exists: if i >= x_l.shape[0]: # , x_l = np.vstack((x_l, np.zeros(x_l.shape[1]))) if j >= x_l.shape[1]: # , x_l = np.hstack((x_l, np.zeros((x_l.shape[0],1)))) x_l[i][j] = result # demo # print('i=' + str(i) + '; j=' + str(j) + '\n', demo) return x_l def create_axis_indexes(size_axis, center_w_l): coordinates = [] for i in range(-center_w_l, size_axis-center_w_l): coordinates.append(i) return coordinates def create_indexes(size_axis, center_w_l): # coordinates_a = create_axis_indexes(size_axis=size_axis[0], center_w_l=center_w_l[0]) coordinates_b = create_axis_indexes(size_axis=size_axis[1], center_w_l=center_w_l[1]) return coordinates_a, coordinates_b print('\n -:') print(convolution_feed_x_l(y_l_minus_1, w_l, other_parameters))
ã¹ã¯ãªããåºåã®äŸ
åããã¢ã³ãŒãã«ã¯ããã³ãœã«ãããŒã®èšç®ã«é¢ããå¥ã®èå³æ·±ã詳现ãå«ãŸããŠããŸãã ã©ã€ãã©ãªå ã§ã¯ãç³ã¿èŸŒã¿æäœäžã«ãç³ã¿èŸŒã¿ã«ãŒãã«ã®äžå¿èŠçŽ ãæã å€åããŸãã éåžžã¯äœçœ®ïŒ0,0ïŒã«ãããŸããã3 x 3ã³ã¢ã®å Žåã¯äžå€®ã®äœçœ®ïŒ1,1ïŒã«ç§»åããŸãïŒãŸãã¯ãå®éã«ã¯å察ãçã§ããããéåžžã®ãäœçœ®ã¯ã¡ããã©äžå€®ïŒ1,1ïŒã«ãããŸãïŒããã«é¢é£ããŠãã³ã¢ã¯å·Šäžé ã«ç§»åããŸã...ïŒã ãã®ã«ãŒãã«ã§ã¹ãã©ã€ãã2ã«èšå®ãããšããã³ãœã«ãããŒã®äžå¿èŠçŽ ãåã³ãŒãã®äœçœ®ã«ç§»åããŸãã ããžãã¯ã¯ã4 x 4ãã¯ã»ã«ã®å ¥åãããªãã¯ã¹æ¬¡å ãš2ãã¯ã»ã«ã®ãããã§ã2 x 2ã®åºåãããªãã¯ã¹ãæåŸ ããŠããããã«æããããšããããšã§ãããããŠãããã¯ãŸãã«èµ·ããããšã§ãããäžå¿èŠçŽ ãïŒ0,0 ïŒãäžå€®èŠçŽ ãïŒ1,1ïŒã«ããå Žåããããã®æ¡ä»¶äžã§ã®åºåè¡åã®æ¬¡å ã¯3 x 3ãã¯ã»ã«ã«ãªããŸãã ããã¯ãïŒ1,1ïŒã®äžå¿èŠçŽ ãæã€ã³ã¢ããå ¥åè¡åã®å€åŽã«ãé ãããåã«ããã«èšç®ãè¡ãããã§ãã ããã§ãäžã®åçãèŠãŠãã ããïŒ
ãããã£ãŠããŒãããäœæãããã³ãŒããäžå¿èŠçŽ ãéžæããå¯èœæ§ãèæ ®ããŠããªãå Žåãçµæãšãã³ãœã«ãããŒã®éãã®çç±ãç解ããããšã¯ã§ããŸããã
ãããã£ãŠãæçµçã«ãçµæã®éãã«ã€ãªãããã¹ãŠã®ãã¥ã¢ã³ã¹ãæŽçããã¹ã¯ã©ããã¢ãã«ããããããã¹ãŠèæ ®ããäž¡æ¹ã®ãããã¯ãŒã¯ã®æ倱ãæ¯èŒã§ããŸãïŒæåã®å®è£ ã¯numpyã䜿çšããŠå®è£ ããã2çªç®ã®ã©ã€ãã©ãªã¯tensorflowã§å®è¡ãããŸãã
次ã«ããããã¯ãŒã¯ã®ã¢ãŒããã¯ãã£ã«ã€ããŠå°ã説æããŸãã æåã®ç³ã¿èŸŒã¿å±€ã§ã¯ã2x2ãã¯ã»ã«ã®ã³ã¢ïŒããã³ãŒãäœçœ®ã®äžå€®èŠçŽ ïŒã2ã«çããã¹ãããã§äœ¿çšããŸããããã®ã¬ã€ã€ãŒã¯ã14x14ãã¯ã»ã«ã®æ¬¡å ïŒã€ãŸãã28x28ãã¯ã»ã«ã®å ã®mnistç»åã®2åïŒã®5ã€ã®ç¹åŸŽããããçæããŸãã ãããã®ã«ãŒãã¯ãã³ã¢ããã§ã«3 x 3ãã¯ã»ã«ã§1ã¹ãããã§ïŒå®éã«ã¯ã³ã¢ã®äžå¿ã«ç§»åããŸãïŒãåã次å ã®20æã®ãã£ãŒãã£ã«ãŒãã®åºåã§ã2çªç®ã®ã¬ã€ã€ãŒã«äŸçµŠãããŸãã 次ã¯max-spoolã¬ã€ã€ãŒã§ãã«ãŒãã®ãµã€ãºã7x7ãã¯ã»ã«ã«çž®å°ããŸãã 次ã«ãã«ãŒãããã¯ã¿ãŒã«è¿œå ãããŸãã 次ã¯ã2,000åã®ãã¥ãŒãã³ãå«ãå®å šã«æ¥ç¶ããããããã¯ãŒã¯ã®é ãå±€ã§ãã ã»ãŒ200äžïŒ7 x 7 x 20 x 2000 = 1,960,000ïŒåã®èŠçŽ ããéã¿ã®ãããªãã¯ã¹ã§ãã®ã¬ã€ã€ãŒã«ååŸãããŸãïŒ ãããŠããã§ã«2000åã®ãã¥ãŒãã³ããã¯ã©ã¹ã®æ°ã«é¢äžãã10åã®åºåãã¥ãŒãã³ã«æ¥ç¶ãããŠããŸããã€ãŸãããããã¯ãŒã¯ãäºæž¬ããããã«åŠç¿ããªããã°ãªããªã10æ¡ã§ãã ãããã®ãã©ã¡ãŒã¿ãŒã¯ãã¹ãŠãnp_mnist_train_test.pyãã¡ã€ã«å ã«ããã¢ãã«èšå®ãšåŒã°ããèŸæžã«ãªã¹ããããŠããŸãã
ãããã£ãŠãäž¡æ¹ã®ã¢ãã«ãå®è¡ããŠãçµæãæ¯èŒããŠã¿ãŸãããïŒæ倱ãšç²ŸåºŠã5ã€ã®ç»åããšã®å¹³åïŒ
ã芧ã®ãšãããæ倱ã¯ã»ãŒå®å šã«äžèŽããŠããŸããã€ãŸããæåã§çµã¿ç«ãŠãããã¢ãã«ãšãã³ãœã«ãããŒã§èšè¿°ãããã¢ãã«å ã®ãã¹ãŠã®èšç®ã¯ãå°ãªããšãéåžžã«ãã䌌ãŠããŸãã
1æ¥ãš1ã€ã®ãã¬ãŒãã³ã°ã®æ代ïŒã€ãŸãããããã¯ãŒã¯ã®é æ¹åããã³éæ¹åã®ééã55,000åç¹°ãè¿ãïŒã®åŸãæ倱ãšç²ŸåºŠã®ã°ã©ãã衚瀺ãããŸãã
ãŸãããã¹ããµã³ãã«ã§ã¯ãââ粟床ã¯89ïŒ ã§ãã
ã芧ã®ããã«ããã¹ããµã³ãã«ãšãã¬ãŒãã³ã°ãµã³ãã«ã®çµåãããnumpyã¢ãã«ã®æ倱ã¯ããã³ãœã«ãããŒãããã¯ãŒã¯ã®çµæãšéåžžã«äŒŒãŠããŸãã 1åã®ãã¬ãŒãã³ã°æéåŸã®ãã¹ããµã³ãã«ã®ç²ŸåºŠã®éãã¯ã1äžåããã1ã€ã®ç»åã®ã¿ã§ãïŒ ããããããã§ããéã¿è¡åèªäœã¯1000åã®1ã§ç°ãªããŸãïŒäžæ¹ããã¬ãŒãã³ã°ã®æåã®æ®µéã§ã¯éãã¯ãããŸããã§ããïŒ-numpyãštensorflowã®èšç®ã®ç²ŸåºŠãç°ãªãå¯èœæ§ãæãé«ãå¯èœæ§ããããŸãïŒfloat32ãšfloat64ããŸãã¯ããããªéãããããããã®ä»ã®äžæãªãã¥ã¢ã³ã¹ã¢ãã«èšç®ã§ã
1ã€ã®æ代ãéããåŸã89ïŒ ã®ç²ŸåºŠãéæãããŸããã ããããåãã¢ãã«ã§4ã€ã®æ代ãçµãåŸããã¹ããµã³ãã«ã®çµæã¯ã¯ããã«é«ããªããŸã-96ïŒ ã ããããç§ã¯ãã³ãœã«ãããŒãnumpyã¢ãã«ã®ã¿ã§ãããè©ŠããŸãããããããªããã¬ãŒãã³ã°ã«ã¯æéãããããããŸããããäžè¬çã«ã¯éžæããã¢ãŒããã¯ãã£ã¯ããã»ã©æªãã¯ãªããšçµè«ä»ããããšãã§ããŸãïŒ
æ£ç¢ºã«ã¯ãnumpyã¢ãã«ã®1ã€ã®æ代ã¯ãå€ãã©ãããããã§çŽ15æéããããŸããã ãã³ãœã«ãããŒã䜿çšããŠæ§ç¯ãããã¢ãã«ã§ã¯ããã®åãæ代ã¯ããã7ã8åã§çµãããŸãã ã€ãŸããå·®ã¯120åã§ãïŒ æäœæ¥ã§çµã¿ç«ãŠãããã¢ãã«ã§ã¯åžžã«äœãããããããã«ããã¯ã¯ã©ãã«ãããŸããïŒ ãããç解ããã«ã¯ãnumpyã¢ãã«ã®åé¢æ°ããšãã¿ã€ã ã©ã€ã³ãèŠãŠãã ããïŒãããã¯ãŒã¯ãé æ¹åãšéæ¹åã«ééããåèšïŒïŒ
ã芧ã®ããã«ãã»ãŒ15æéã«ããã£ãŠãããã€ãã®ç³ã¿èŸŒã¿ã«ãŒãã«ããã¬ãŒãã³ã°ãããŠããŸãã ãã®ãããã¢ãã«ãã©ã¡ãŒã¿ãŒã§ã¯ãç³ã¿èŸŒã¿å±€ã®åºåã«ãã£ãŒãã£ããããã»ãšãã©ãããŸããã numpyãããªãã¯ã¹ã®æé©åãããä¹ç®ãå éšã§çºçãããããå®å šã«æ¥ç¶ãããã¬ã€ã€ãŒïŒç¹ã«ãã©ã¡ãŒã¿ãŒã®æ°ãå°ãªã2çªç®ã®fcã¬ã€ã€ãŒïŒã«ã¯ã»ãšãã©æéãããããŸããã ãã³ãœã«ãããŒã®èšç®ã¯ã¯ããã«æé©åãããŠãããé²åå±€ãè¡åä¹ç®ãšããŠè¡šãããŸãã ããã§ãã£ãšèªãããšãã§ããŸãã
ãéæšæºããã©ã¡ãŒã¿ãŒã§ã¢ãã«ããã¬ãŒãã³ã°ããŸãã-çžäºçžé¢ã®ä»£ããã«ç³ã¿èŸŒã¿æŒç®ãè¡ããæåã®å±€ã®äœçœ®ïŒ1,0ïŒãš2çªç®ã®ç³ã¿èŸŒã¿å±€ã®äœçœ®ïŒ1,2ïŒã®äžå¿èŠçŽ ã çµæã¯ããã«æªãã£ãããããã«èšç·Žããã°ãããããéåžžã®ãã©ã¡ãŒã¿ãŒãšäžèŽããã¯ãã ã£ãã ãã¡ãããç¹å®ã®äžå¿èŠçŽ ãä»ã®ãã³ãœã«ãããŒã«å€æŽããããç³ã¿èŸŒã¿ãããã¯ãŒã¯ã®ä»»æã®å±€ã®ç³ã¿èŸŒã¿ã®çžäºçžé¢ãå€æŽããããšã¯ã§ããªããããèšç®ããã³ãœã«ãããŒã¢ãã«ãšæ¯èŒããããšã¯ã§ããŸããïŒäžè¬çã«ããã€ã䟿å©ã«ãªããããããŸããïŒã èå³æ·±ãããšã«ãåœåã®ç²ŸåºŠã¯æ¥æ¿ã«åäžãå§ããŸãããããã®åŸã¯ãéåžžã®ãã¢ãã«ãããã¯ããã«é ããŠããŸããã
ãã¡ãããnumpyã¢ãã«ã¯å®éã®èšç®ã«ã¯é©ããŠããªããããæ©æ¢°åŠç¿çšã®ãã³ãœã«ãããŒãŸãã¯ãã®ä»ã®ã©ã€ãã©ãªã䜿çšããå¿ èŠããããŸãã ç§ã¯ãPythonã®å®è£ ã«ãšã©ãŒããªãããšã絶察ã«ç¢ºä¿¡ããŠãããšã¯èšããŸããã絶察ã«ç¢ºãã«ãã³ãœã«ãããŒã«ãããã¹ãŠã®åŸ®åŠãªãã¬ãŒãã³ã°ã®åŸ®åŠãªãã¥ã¢ã³ã¹ãèæ ®ãããŸãã ããããäž»ãªããšã¯ãã¬ãŒãã³ã°æéã§ãã Pythonã§2æéãããã®ã¯ããã³ãœã«ãããŒã§ããã1åã§ãã
MNISTã§åŸãããçµæãæ¹åããã«ã¯ãããå€ãã®ç³ã¿èŸŒã¿å±€ã䜿çšããããå€ãã®ç¹åŸŽããããçæããŠç»åã®ãããã¯ãŒã¯ããç¹åŸŽãé©åã«æœåºããå¿ èŠããããŸãïŒãã¡ãããããã¯ãã¹ãŠãnumpyã¢ãã«ã䜿çšãããšãã¬ãŒãã³ã°æéã«æ·±å»ãªåœ±é¿ãäžããŸãïŒã ãŸããè€æ°ã®ã€ã¡ãŒãžã§ãããã䜿çšããåŸæ¥ã®SGDæé©åæ¹æ³ããããšãã°AdamïŒ ãã¡ããŸãã¯ãã¡ãã§èªãããšãã§ããŸã ïŒã«çœ®ãæããŠãã ããã ãã¡ããããã®èšäºã§åŸãããçµæã¯å°è±¡çã§ã¯ãããŸããïŒãªãŒããŒããŒãã¯ããã«ãããŸã ïŒããåŒã«åŸã£ãŠæåéãæžãããã¢ãã«ãå®éã«åŠç¿ããŠæ©èœããããšã¯æããã§ãã ãã¹ãçµæãåçŸããå ŽåããŸãã¯ãã¬ãŒãã³ã°ãç¶è¡ããå Žåãnumpyã¢ãã«ã®cnn_weights_mnist.npyãŠã§ã€ãã¯gitã®ãªããžããªã«ãããŸãã
ããã§ãç³ã¿èŸŒã¿ãããã¯ãŒã¯ã«é¢ããèšäºã®çµããã«æ¥ãŸããã ãããã¯ãŒã¯ã®èåŸã«ãããæ©æ¢°åŠç¿ã©ã€ãã©ãªå ã«é ããŠããå éšæ§é ãšæ°åŠã®ã¢ã€ãã¢ãæ¢ã«ãæã¡ã§ããã°ãããã¯è¯ãããšã§ãã ç§ã¯å¯èœãªéãç°¡åãªèšèªã§ãã¹ãŠãäŒãããã¹ãŠã®åŒã解æããŠè³ªåãæ®ããªãããã«ããŸããããããã®èšäºã誰ãã®æéãç¯çŽããããšãé¡ã£ãŠããŸãã ããã§çµããã§ããæåŸãŸã§èªãã§ãããŠããããšãïŒ