python
1for i in range(len(out_img)): 2 plt.subplot(20, 20, i+1).imshow(out_img[i]) 3 4中略 5 6 # テスト 7 scoreboard = [] 8 for i in range(len(training_data_list)): 9 idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01 10 predict = nn.feedforward(idata) 11 plabel = np.argmax(predict) 12 print("plabel" ,plabel) 13 #修正値plabelにimg値を修正する。 14 out_img[i] = out_img[plabel] 15 pass 16 scoreboard_array = np.asarray(scoreboard) 17 print('performance: ', scoreboard_array.sum() / scoreboard_array.size) 18 19中略 20 21 22for i in range(len(out_img)): 23 plt.subplot(20, 20, i+1).imshow(out_img[i])
とすると、下の画像の集まりしか表示されないのですが、
plt.subplotは、2つ書くと最後の方が優先されるのでしょうか?
両方表示するにはどうすればいいんでしょうか。
コード全体は以下です。
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 19plt.imshow(img) 20 21size = 5 22 23v_split = img.shape[0] // size 24h_split = img.shape[1] // size 25out_img = [] 26[out_img.extend(np.hsplit(h_img, h_split)) 27 for h_img in np.vsplit(img, v_split)] 28 29plt.figure(figsize=(100,100)) 30 31# imgの画像を表示 元は20,20,i+1... 32# for i in range(len(out_img)): 33# plt.subplot(20, 20, i+1).imshow(out_img[i]) 34 35def extract(x, y): 36 # カラー画像の時Gだけ抜き取りたい 37 if len(x.shape) == 3: 38 h, w, ch = x.shape 39 40 # RGBのGだけ抜き取りたい 41 return x[:,:,y] 42 43# v_max, v_min = 300, 200から変更 44v_max, v_min = 255, 250 45 46def diff(x): 47 imgrows, lenrows, imgcolumns, lencolumns = [], [], [], [] 48 for (img, imgt) in zip(x, x.T): 49 rows = img[(v_min<img)&(v_max>img)] 50 columns = imgt[(v_min<imgt)&(v_max>imgt)] 51 imgrows.append(rows) 52 lenrows.append(len(rows)) 53 imgcolumns.append(columns) 54 lencolumns.append(len(columns)) 55 return lenrows + lencolumns 56 57np.set_printoptions(threshold=10000) 58print(type(extract(out_img[i], 1))) 59print(type(diff(extract(out_img[i], 1)))) 60print(type(out_img[0][0])) 61 62# 見本データに対しても同様に 63# exについて同様に 64training_data_list = [] 65 66for i in range(len(out_img)): 67 #g #b #r 抽出後diffしてappend 68 training_data_list.append([i] + diff(extract(out_img[i], 1)) + diff(extract(out_img[i], 2)) + diff(extract(out_img[i], 0))) # 略 69 70# 3層ニューラルネットワーク 71class ThreeLayerNetwork: 72 # コンストラクタ 73 def __init__(self, inodes, hnodes, onodes, lr): 74 # 各レイヤーのノード数 75 self.inodes = inodes 76 self.hnodes = hnodes 77 self.onodes = onodes 78 79 # 学習率 80 self.lr = lr 81 82 # 重みの初期化 83 self.w_ih = np.random.normal(0.0, 1.0, (self.hnodes, self.inodes)) 84 self.w_ho = np.random.normal(0.0, 1.0, (self.onodes, self.hnodes)) 85 86 # 活性化関数 87 self.af = AF.sigmoid 88 self.daf = AF.derivative_sigmoid 89 90 # 誤差逆伝搬 91 def backprop(self, idata, tdata): 92 93 # 縦ベクトルに変換 94 o_i = np.array(idata, ndmin=2).T 95 t = np.array(tdata, ndmin=2).T 96 97 # 隠れ層 98 x_h = np.dot(self.w_ih, o_i) 99 o_h = self.af(x_h) 100 101 # 出力層 102 x_o = np.dot(self.w_ho, o_h) 103 o_o = self.af(x_o) 104 105 # 誤差計算 106 e_o = (t - o_o) 107 e_h = np.dot(self.w_ho.T, e_o) 108 109 # 重みの更新 110 self.w_ho += self.lr * np.dot((e_o * self.daf(o_o)), o_h.T) 111 self.w_ih += self.lr * np.dot((e_h * self.daf(o_h)), o_i.T) 112 113 114 # 順伝搬 115 def feedforward(self, idata): 116 # 入力のリストを縦ベクトルに変換 117 o_i = np.array(idata, ndmin=2).T 118 119 # 隠れ層 120 x_h = np.dot(self.w_ih, o_i) 121 o_h = self.af(x_h) 122 123 # 出力層 124 x_o = np.dot(self.w_ho, o_h) 125 o_o = self.af(x_o) 126 127 return o_o 128 129if __name__=='__main__': 130 # パラメータ 131 #inodes=784から30に変更 132 inodes = 30 133 hnodes = 100 134 onodes = len(training_data_list) 135 lr = 0.3 136 137 # ニューラルネットワークの初期化 138 nn = ThreeLayerNetwork(inodes, hnodes, onodes, lr) 139 140 # 学習 141 epoch = 50 142 for e in range(epoch): 143 data_size = len(training_data_list) 144 for i in range(data_size): 145 idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01 146 # 変更の余地あり 147 tdata = np.zeros(onodes) + 0.01 148 tdata[training_data_list[i][0]] = 0.99 149 nn.backprop(idata, tdata) 150 pass 151 pass 152 153 # テスト 154 scoreboard = [] 155 for i in range(len(training_data_list)): 156 idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01 157 predict = nn.feedforward(idata) 158 plabel = np.argmax(predict) 159 print("plabel" ,plabel) 160 #修正値plabelにimg値を修正する。 161 out_img[i] = out_img[plabel] 162 pass 163 scoreboard_array = np.asarray(scoreboard) 164 print('performance: ', scoreboard_array.sum() / scoreboard_array.size) 165 166 167# imgの値を修正し、かつ修正した画像を表示 元は20,20,i+1... 168for i in range(len(out_img)): 169 plt.subplot(20, 20, i+1).imshow(out_img[i])
回答4件
あなたの回答
tips
プレビュー