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