ネットにあった三層ニューラルネットワークのサンプルを使用して画像認識をしているのですが学習誤差がどれなのかがわかりません。どなたか教えてください。
ソースコード
python
1import numpy as np 2 3sigmoid_range = 34.538776394910684 4 5def sigmoid(x): 6 return 1.0 / (1.0 + np.exp(-np.clip(x, -sigmoid_range, sigmoid_range))) 7 8def derivative_sigmoid(o): 9 return o * (1.0 - o) 10 11class ThreeLayerNetwork: 12 # コンストラクタ 13 def __init__(self, inodes, hnodes, onodes, lr): 14 # 各レイヤーのノード数 15 self.inodes = inodes 16 self.hnodes = hnodes 17 self.onodes = onodes 18 19 # 学習率 20 self.lr = lr 21 22 # 重みの初期化 23 self.w_ih = np.random.normal(0.0, 1.0, (self.hnodes, self.inodes)) 24 self.w_ho = np.random.normal(0.0, 1.0, (self.onodes, self.hnodes)) 25 26 # 活性化関数 27 self.af = sigmoid 28 self.daf = derivative_sigmoid 29 30 # 誤差逆伝搬 31 def backprop(self, idata, tdata): 32 # 縦ベクトルに変換 33 o_i = np.array(idata, ndmin=2).T 34 t = np.array(tdata, ndmin=2).T 35 36 # 隠れ層 37 x_h = np.dot(self.w_ih, o_i) 38 o_h = self.af(x_h) 39 40 # 出力層 41 x_o = np.dot(self.w_ho, o_h) 42 o_o = self.af(x_o) 43 44 # 誤差計算 45 e_o = (t - o_o) 46 e_h = np.dot(self.w_ho.T, e_o) 47 48 # 重みの更新 49 self.w_ho += self.lr * np.dot((e_o * self.daf(o_o)), o_h.T) 50 self.w_ih += self.lr * np.dot((e_h * self.daf(o_h)), o_i.T) 51 52 def feedforward(self, idata): 53 # 入力のリストを縦ベクトルに変換 54 o_i = np.array(idata, ndmin=2).T 55 56 # 隠れ層 57 x_h = np.dot(self.w_ih, o_i) 58 o_h = self.af(x_h) 59 60 # 出力層 61 x_o = np.dot(self.w_ho, o_h) 62 o_o = self.af(x_o) 63 64 return o_o 65 66if __name__=='__main__': 67 # パラメータ 68 inodes = 784 69 hnodes = 100 70 onodes = 10 71 lr = 0.3 72 73 # ニューラルネットワークの初期化 74 nn = ThreeLayerNetwork(inodes, hnodes, onodes, lr) 75 76 # トレーニングデータのロード 77 training_data_file = open('mnist_train.csv', 'r') 78 training_data_list = training_data_file.readlines() 79 training_data_file.close() 80 81 # テストデータのロード 82 test_data_file = open('mnist_test.csv') 83 test_data_list = test_data_file.readlines() 84 test_data_file.close() 85 86 # 学習 87 epoch = 10 88 for e in range(epoch): 89 print('#epoch ', e) 90 data_size = len(training_data_list) 91 for i in range(data_size): 92 if i % 1000 == 0: 93 print(' train: {0:>5d} / {1:>5d}'.format(i, data_size)) 94 val = training_data_list[i].split(',') 95 idata = (np.asfarray(val[1:]) / 255.0 * 0.99) + 0.01 96 tdata = np.zeros(onodes) + 0.01 97 tdata[int(val[0])] = 0.99 98 nn.backprop(idata, tdata) 99 pass 100 pass 101 102 # テスト 103 scoreboard = [] 104 for record in test_data_list: 105 val = record.split(',') 106 idata = (np.asfarray(val[1:]) / 255.0 * 0.99) + 0.01 107 tlabel = int(val[0]) 108 predict = nn.feedforward(idata) 109 plabel = np.argmax(predict) 110 scoreboard.append(tlabel == plabel) 111 pass 112 113 scoreboard_array = np.asarray(scoreboard) 114 print('performance: ', scoreboard_array.sum() / scoreboard_array.size)
試したこととして一通りprintで出してみましたがわかりませんでした。
こんにちは。
ではまず機械学習における学習誤差とはなにかをcocoa_さんの言葉で教えてください。
こんにちは。
学習データで学習できているかを知る値
ふむふむ。
学習誤差と最後に出力しているperformanceの値との違いはなんですか?
performanceは学習データとテストデータを比較してテストデータが合っているかの値
それはちょっと違います……。
学習データとテストデータというのは、それぞれなんですか。
学習データはその画像が何かを知るためのデータ
テストデータは学習データをもとに判断するデータ
そこから勘違いしているようだと
このコードを理解するのは難しいです。
機械学習の基礎から勉強するといいですよ。
わかりました
基礎からやり直します