python
1from google.colab import drive 2drive.mount('/content/drive') 3 4import sys 5import numpy as np 6 7sys.path.append('/content/drive/My Drive') 8 9import ActivationFunction as AF 10from PIL import Image 11 12# PILで開いたうえでデータをNumpy形式にする 13# (例えばJPEGは圧縮されていてNumpyな配列になっていないので、 14# そこからNumpyのデータ空間(?)に持ってくる必要がある) 15tefilename = "test2.png" 16teimg = Image.open("drive/My Drive/mnist_dataset/" + tefilename) 17teimg = teimg.resize((10, 10)) 18teimg = np.asarray(teimg) 19 20size = 5 21 22v_split = img.shape[0] // size 23h_split = img.shape[1] // size 24out_img = [] 25[out_img.extend(np.hsplit(h_img, h_split)) 26 for h_img in np.vsplit(img, v_split)] 27 28plt.subplot(17, 6, 1).imshow(out_img[1]) 29plt.subplot(17, 6, 2).imshow(out_img[2]) 30plt.subplot(17, 6, 3).imshow(out_img[3]) 31plt.subplot(17, 6, 4).imshow(out_img[4]) 32plt.subplot(17, 6, 5).imshow(out_img[5]) 33plt.subplot(17, 6, 6).imshow(out_img[6]) 34plt.subplot(17, 6, 7).imshow(out_img[7]) 35plt.subplot(17, 6, 8).imshow(out_img[8]) 36plt.subplot(17, 6, 9).imshow(out_img[9]) 37plt.subplot(17, 6, 10).imshow(out_img[10]) 38plt.subplot(17, 6, 11).imshow(out_img[11]) 39plt.subplot(17, 6, 12).imshow(out_img[12]) 40plt.subplot(17, 6, 13).imshow(out_img[13]) 41plt.subplot(17, 6, 14).imshow(out_img[14]) 42plt.subplot(17, 6, 15).imshow(out_img[15]) 43plt.subplot(17, 6, 16).imshow(out_img[16]) 44plt.subplot(17, 6, 17).imshow(out_img[17]) 45plt.subplot(17, 6, 18).imshow(out_img[18]) 46plt.subplot(17, 6, 19).imshow(out_img[19]) 47plt.subplot(17, 6, 20).imshow(out_img[20]) 48plt.subplot(17, 6, 21).imshow(out_img[21]) 49plt.subplot(17, 6, 22).imshow(out_img[22]) 50plt.subplot(17, 6, 23).imshow(out_img[23]) 51plt.subplot(17, 6, 24).imshow(out_img[24]) 52plt.subplot(17, 6, 25).imshow(out_img[25]) 53plt.subplot(17, 6, 26).imshow(out_img[26]) 54plt.subplot(17, 6, 27).imshow(out_img[27]) 55plt.subplot(17, 6, 28).imshow(out_img[28]) 56plt.subplot(17, 6, 29).imshow(out_img[29]) 57plt.subplot(17, 6, 30).imshow(out_img[30]) 58plt.subplot(17, 6, 31).imshow(out_img[31]) 59plt.subplot(17, 6, 32).imshow(out_img[32]) 60 61def extract(x, y): 62 # カラー画像の時Gだけ抜き取りたい 63 if len(x.shape) == 3: 64 h, w, ch = x.shape 65 66 # RGBのGだけ抜き取りたい 67 return x[:,:,y] 68 69v_max, v_min = 300, 200 70 71def diff(x): 72 imgrows, lenrows, imgcolumns, lencolumns = [], [], [], [] 73 for (img, imgt) in zip(x, x.T): 74 rows = img[(v_min<img)&(v_max>img)] 75 columns = imgt[(v_min<imgt)&(v_max>imgt)] 76 imgrows.append(rows) 77 lenrows.append(len(rows)) 78 imgcolumns.append(columns) 79 lencolumns.append(len(columns)) 80 return lenrows + lencolumns 81 82test_data_list = [] 83 84test_data_list.append([0] + diff(extract(teimg, 1)) + diff(extract(teimg, 2)) + diff(extract(teimg, 0))) # 略 85 86print("test_data_list[0][1:]" ,test_data_list[0][1:]) 87print("test_data_list" ,test_data_list) 88 89# 見本データに対しても同様に 90# exについて同様に 91training_data_list = [] 92 93for i in range(10): 94 for e in range(1): 95 trad = Image.open("drive/My Drive/mnist_dataset/" + str(10*i+e) + ".png") 96 trad = trad.resize((10, 10)) 97 trad = np.asarray(trad) 98 #g #b #r 抽出後diffしてappend 99 training_data_list.append([i] + diff(extract(trad, 1)) + diff(extract(trad, 2)) + diff(extract(trad, 0))) # 略 100 101print("training_data_list" ,training_data_list) 102print("training_data_list[1:]" ,training_data_list[1:]) 103 104# 3層ニューラルネットワーク 105class ThreeLayerNetwork: 106 # コンストラクタ 107 def __init__(self, inodes, hnodes, onodes, lr): 108 # 各レイヤーのノード数 109 self.inodes = inodes 110 self.hnodes = hnodes 111 self.onodes = onodes 112 113 # 学習率 114 self.lr = lr 115 116 # 重みの初期化 117 self.w_ih = np.random.normal(0.0, 1.0, (self.hnodes, self.inodes)) 118 self.w_ho = np.random.normal(0.0, 1.0, (self.onodes, self.hnodes)) 119 120 # 活性化関数 121 self.af = AF.sigmoid 122 self.daf = AF.derivative_sigmoid 123 124 # 誤差逆伝搬 125 def backprop(self, idata, tdata): 126 127 # 縦ベクトルに変換 128 o_i = np.array(idata, ndmin=2).T 129 t = np.array(tdata, ndmin=2).T 130 131 # 隠れ層 132 np.set_printoptions(threshold=10000) 133 x_h = np.dot(self.w_ih, o_i) 134 o_h = self.af(x_h) 135 136 # 出力層 137 x_o = np.dot(self.w_ho, o_h) 138 o_o = self.af(x_o) 139 140 # 誤差計算 141 e_o = (t - o_o) 142 e_h = np.dot(self.w_ho.T, e_o) 143 144 # 重みの更新 145 self.w_ho += self.lr * np.dot((e_o * self.daf(o_o)), o_h.T) 146 self.w_ih += self.lr * np.dot((e_h * self.daf(o_h)), o_i.T) 147 148 149 # 順伝搬 150 def feedforward(self, idata): 151 # 入力のリストを縦ベクトルに変換 152 o_i = np.array(idata, ndmin=2).T 153 154 # 隠れ層 155 x_h = np.dot(self.w_ih, o_i) 156 o_h = self.af(x_h) 157 158 # 出力層 159 x_o = np.dot(self.w_ho, o_h) 160 o_o = self.af(x_o) 161 162 return o_o 163 164if __name__=='__main__': 165 # パラメータ 166 #inodes=784から59+1に変更 167 inodes = 60 168 hnodes = 100 169 onodes = 10 170 lr = 0.3 171 172 # ニューラルネットワークの初期化 173 nn = ThreeLayerNetwork(inodes, hnodes, onodes, lr) 174 175 # 学習 176 epoch = 50000 177 for e in range(epoch): 178 print('#epoch ', e) 179 data_size = len(training_data_list) 180 for i in range(data_size): 181 if i % 1000 == 0: 182 print(' train: {0:>5d} / {1:>5d}'.format(i, data_size)) 183 idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01 184 # 変更の余地あり 185 tdata = np.zeros(onodes) + 0.01 186 tdata[training_data_list[i][0]] = 0.99 187 nn.backprop(idata, tdata) 188 pass 189 pass 190 191 # テスト 192 scoreboard = [] 193 for record in test_data_list: 194 idata = (np.array(test_data_list[0][1:]) / 255.0 * 0.99) + 0.01 195 predict = nn.feedforward(idata) 196 plabel = np.argmax(predict) 197 print("predict" ,predict) 198 print("plabel" ,plabel) 199 pass 200 201 scoreboard_array = np.asarray(scoreboard) 202 print('performance: ', scoreboard_array.sum() / scoreboard_array.size)
この学習とテストについて、ここで、あらかじめ用意しておいた(が使っていない)
分割画像out_img[0],out_img[1],out_img[2],out_img[3],・・・,out_img[20]?(100,100resizeして5で分割してるから20個あります・・・よね?)
しかしplt.subplot(17, 6, 32).imshow(out_img[32])と、32まで出してもエラーが出ないんですが、なぜでしょう?
ご自分で書いたコードではないのですか。
コードがこれだと
v_split = img.shape[0] // size
の行でimgのNameErrorが起きるはず。
動かしているコードが別のものだった、などを疑うべき。
(他にはJupyter等で動かしていて、これより前に動かしたコードがあった、とか)
v_split = img.shape[0] // size
imgって?
teimgはあるけど
> 100,100resizeして
どこで?
teimg = teimg.resize((10, 10))
はあるけど
仮に、teimgとimgが同じもので、
teimg = teimg.resize((10, 10))
ではなく
> 100,100resizeして
をやってるとして、imgが100x100のデータなら、縦横それぞれを
100//5=20
に分割するのだから、分割後のout_imgは、
> 20個あります・・・よね?
ではなくて、20x20=400ある
> 32まで出してもエラーが出ないんですが、なぜでしょう?
400あるから
(本当に実行してるコード次第ですが)
plt.subplot(17, 6, 1).imshow(out_img[1])
の上に
print(len(out_img))
を追加したら、out_imgがいくつあるか分かる
別のものだったかも知れません、いずれにせよ、
10,10でも25個あるんですねなるほど。
> 10,10でも25個ある
縦横それぞれを
10//5=2
に分割だから、2x2=4しかない
何個に分けるのかはv_split, h_splitです
sizeではない
確かに
質問のコードと本分のつじつまがあってないからどういうことなの? って言われているのに「確かに」とは……?
回答1件
あなたの回答
tips
プレビュー