質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

959閲覧

分割画像の内類似したもの同士を見つける

ques346

総合スコア47

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/08 04:39

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

あるiについて、out_img[i]をtestdataとし、i以外の範囲内の0以上の任意の整数jについてのout_img[j]を、traningdataとして、testdataがどのtraningdataに最も近いか判定したいのですが、このプログラムをどういじれば良いでしょう(学習、はいじらなくて良い?テスト、を内包for使っていじる?)、またさらには、iを範囲内の0以上の任意の整数として、各々のデータに最も近いデータのデータ番号を含む集合リストを作るプログラムを作りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/06/08 05:40

どういうものが近いと、どういうものが遠い、と判断するんでしょうか。 そこらへんを詳しく説明しましょう
ques346

2021/06/08 05:47

画像データは数値リスト化されているため、 この数値同士の差の和が最も小さいもの同士を「近い亅とします。 この処理はこのnnの「テスト」で行なわれていると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問