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

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

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

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

Q&A

0回答

612閲覧

画像のRGBから抽出した値は、画像が全て異なるため全て当然異なるのに、出力数値が全て等しいのはなぜ

ques346

総合スコア47

Python

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

0グッド

0クリップ

投稿2021/06/10 09:40

編集2021/06/12 11:34

イメージ説明
これがrei.jpegです。

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 29print("out_img" ,out_img[0][1]) 30print("out_img" ,out_img[0][2]) 31print("out_img" ,out_img[5][3]) 32print("out_img" ,out_img[0]) 33print("out_img" ,out_img[10]) 34print("out_img" ,out_img[11]) 35print("out_img" ,out_img[41]) 36print("len(out_img)" ,len(out_img)) 37print("type(img)" ,type(img)) 38print("type(out_img)" ,type(out_img)) 39print("type(out_img[0])" ,type(out_img[0])) 40print("type(out_img[0][0])" ,type(out_img[0][0])) 41 42plt.figure(figsize=(100,100)) 43 44for i in range(len(out_img)): 45 plt.subplot(20, 20, i+1).imshow(out_img[i]) 46 47def extract(x, y): 48 # カラー画像の時Gだけ抜き取りたい 49 if len(x.shape) == 3: 50 h, w, ch = x.shape 51 52 # RGBのGだけ抜き取りたい 53 return x[:,:,y] 54 55v_max, v_min = 300, 200 56 57def diff(x): 58 imgrows, lenrows, imgcolumns, lencolumns = [], [], [], [] 59 for (img, imgt) in zip(x, x.T): 60 rows = img[(v_min<img)&(v_max>img)] 61 columns = imgt[(v_min<imgt)&(v_max>imgt)] 62 imgrows.append(rows) 63 lenrows.append(len(rows)) 64 imgcolumns.append(columns) 65 lencolumns.append(len(columns)) 66 return lenrows + lencolumns 67 68out_data_list = [[0]] * len(out_img) 69for i in range(len(out_img)): 70 out_data_list[i].append(diff(extract(out_img[i], 1)) + diff(extract(out_img[i], 2)) + diff(extract(out_img[i], 0))) 71 72print(type(extract(out_img[i], 1))) 73print(type(diff(extract(out_img[i], 1)))) 74print(type(out_img[0][0])) 75 76# 見本データに対しても同様に 77# exについて同様に 78training_data_list = [] 79 80for i in range(len(out_img)): 81 #g #b #r 抽出後diffしてappend 82 training_data_list.append([i] + diff(extract(out_img[i], 1)) + diff(extract(out_img[i], 2)) + diff(extract(out_img[i], 0))) # 略 83 84print("training_data_list" ,training_data_list) 85print("training_data_list[1:]" ,training_data_list[1:]) 86print("len(training_data_list)" ,len(training_data_list)) 87print("len(out_data_list[0])" ,len(out_data_list[0])) 88print("out_data_list[0][0]" ,out_data_list[0][0]) 89print("out_data_list[1][0]" ,out_data_list[1][0]) 90print("out_data_list[2][0]" ,out_data_list[2][0]) 91print("out_data_list[0][1]" ,out_data_list[0][1]) 92print("out_data_list[1][1]" ,out_data_list[1][1]) 93print("len(out_data_list[1:])" ,len(out_data_list[1:])) 94print("out_data_list[0][1:]" ,out_data_list[0][1:]) 95 96# 3層ニューラルネットワーク 97class ThreeLayerNetwork: 98 # コンストラクタ 99 def __init__(self, inodes, hnodes, onodes, lr): 100 # 各レイヤーのノード数 101 self.inodes = inodes 102 self.hnodes = hnodes 103 self.onodes = onodes 104 105 # 学習率 106 self.lr = lr 107 108 # 重みの初期化 109 self.w_ih = np.random.normal(0.0, 1.0, (self.hnodes, self.inodes)) 110 self.w_ho = np.random.normal(0.0, 1.0, (self.onodes, self.hnodes)) 111 112 # 活性化関数 113 self.af = AF.sigmoid 114 self.daf = AF.derivative_sigmoid 115 116 # 誤差逆伝搬 117 def backprop(self, idata, tdata): 118 119 # 縦ベクトルに変換 120 o_i = np.array(idata, ndmin=2).T 121 t = np.array(tdata, ndmin=2).T 122 123 # 隠れ層 124 np.set_printoptions(threshold=10000) 125 x_h = np.dot(self.w_ih, o_i) 126 o_h = self.af(x_h) 127 128 # 出力層 129 x_o = np.dot(self.w_ho, o_h) 130 o_o = self.af(x_o) 131 132 # 誤差計算 133 e_o = (t - o_o) 134 e_h = np.dot(self.w_ho.T, e_o) 135 136 # 重みの更新 137 self.w_ho += self.lr * np.dot((e_o * self.daf(o_o)), o_h.T) 138 self.w_ih += self.lr * np.dot((e_h * self.daf(o_h)), o_i.T) 139 140 141 # 順伝搬 142 def feedforward(self, idata): 143 # 入力のリストを縦ベクトルに変換 144 o_i = np.array(idata, ndmin=2).T 145 146 # 隠れ層 147 x_h = np.dot(self.w_ih, o_i) 148 o_h = self.af(x_h) 149 150 # 出力層 151 x_o = np.dot(self.w_ho, o_h) 152 o_o = self.af(x_o) 153 154 return o_o 155 156if __name__=='__main__': 157 # パラメータ 158 #inodes=784から30に変更 159 inodes = 30 160 hnodes = 100 161 onodes = 400 162 lr = 0.3 163 164 # ニューラルネットワークの初期化 165 nn = ThreeLayerNetwork(inodes, hnodes, onodes, lr) 166 167 # 学習 168 epoch = 50 169 for e in range(epoch): 170 print('#epoch ', e) 171 data_size = len(training_data_list) 172 for i in range(data_size): 173 if i % 1000 == 0: 174 print(' train: {0:>5d} / {1:>5d}'.format(i, data_size)) 175 idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01 176 # 変更の余地あり 177 tdata = np.zeros(onodes) + 0.01 178 tdata[training_data_list[i][0]] = 0.99 179 nn.backprop(idata, tdata) 180 pass 181 pass 182 183 # テスト 184 scoreboard = [] 185 for i in range(len(out_data_list)): 186 idata = (np.array(out_data_list[i][1:]) / 255.0 * 0.99) + 0.01 187 predict = nn.feedforward(idata) 188 plabel = np.argmax(predict) 189 print("plabel" ,plabel) 190 pass 191 192 scoreboard_array = np.asarray(scoreboard) 193 print('performance: ', scoreboard_array.sum() / scoreboard_array.size)
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True). out_img [[254 255 255] [254 255 255] [254 255 255] [254 255 255] [254 255 255]] out_img [[252 255 255] [252 255 255] [252 255 255] [252 255 255] [252 255 255]] out_img [[239 255 255] [238 255 255] [237 255 255] [236 255 255] [235 255 255]] out_img [[[255 255 255] [255 255 255] [255 255 255] [255 255 255] [255 255 255]] [[254 255 255] [254 255 255] [254 255 255] [254 255 255] [254 255 255]] [[252 255 255] [252 255 255] [252 255 255] [252 255 255] [252 255 255]] [[248 255 255] [248 255 255] [248 255 255] [248 255 255] [248 255 255]] [[243 255 255] [243 255 255] [243 255 255] [243 255 255] [243 255 255]]] out_img [[[240 255 255] [238 252 255] [234 245 255] [226 235 254] [213 219 242]] [[239 255 255] [237 252 255] [233 244 255] [225 234 254] [212 219 241]] [[238 254 255] [236 251 255] [232 244 255] [224 234 253] [211 218 240]] [[236 253 255] [234 250 255] [230 243 255] [222 233 252] [209 217 239]] [[233 251 255] [231 248 255] [227 241 255] [219 231 250] [206 216 237]]] out_img [[[192 198 219] [166 169 192] [135 138 160] [104 104 126] [ 72 71 93]] [[191 198 219] [166 169 192] [135 137 159] [104 104 126] [ 72 71 92]] [[190 197 218] [165 169 191] [134 137 159] [103 104 125] [ 72 71 92]] [[188 196 217] [163 168 190] [133 137 158] [102 103 124] [ 71 71 91]] [[186 195 215] [161 167 188] [131 136 156] [101 103 123] [ 70 71 90]]] out_img [[[185 235 251] [186 236 252] [187 236 251] [188 236 251] [190 237 251]] [[171 230 251] [172 231 251] [173 231 250] [175 232 250] [177 232 249]] [[157 224 249] [158 225 250] [159 226 249] [161 226 248] [164 227 247]] [[143 219 248] [144 220 248] [146 221 247] [148 221 246] [151 222 245]] [[129 213 247] [130 214 246] [132 215 245] [134 215 244] [138 216 243]]] len(out_img) 400 type(img) <class 'numpy.ndarray'> type(out_img) <class 'list'> type(out_img[0]) <class 'numpy.ndarray'> type(out_img[0][0]) <class 'numpy.ndarray'> <class 'numpy.ndarray'> <class 'list'> <class 'numpy.ndarray'> training_data_list [[0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5] 中略 [399, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]] training_data_list[1:] [[1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5] 中略 [399, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]] len(training_data_list) 400 len(out_data_list[0]) 401 out_data_list[0][0] 0 out_data_list[1][0] 0 out_data_list[2][0] 0 out_data_list[0][1] [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5] out_data_list[1][1] [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5] len(out_data_list[1:]) 399 out_data_list[0][1:] [[5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5] 中略 [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]] #epoch 0 train: 0 / 400 中略 #epoch 49 train: 0 / 400 plabel 97600 中略 plabel 97600 performance: nan /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:193: RuntimeWarning: invalid value encountered in double_scalars

GoogleColaboratoryで、
rei.jpegを複数個の画像に分割して、1個ずつ、全てとNNして、類似画像を見つけ出すプログラムです、
が、全部大きな桁で、同じ値になる、大きな値になるが、そもそもそんな多数生成してないはず、
また、
out_data_list = [[0]] * len(out_img)
for i in range(len(out_img)):
out_data_list[i].append(diff(extract(out_img[i], 1)) + diff(extract(out_img[i], 2)) + diff(extract(out_img[i], 0)))
の部分とテスト部分をforにする前(地道に変数out_data_list1[]とかで置いていた)時は、出力値は3桁で、しかも差がありました、同じになるのはおかしい。

やはりどうやら、outimglistにappendするところで、きちんとappendできていない感じですかね、二重リストの使い方をまず学ぶべきか。

回答を受けて、typeの値を出力しました、どうすれば良いのでしょうか・・・。

というか、冷静に見てみたらこれ、たぶんdiffの閾値の設定ミスですかね。
resizeする大きさを変えたから、閾値のバランスがずれたんですか。

また、よく考えたらこれ、同じデータ使うわけだから、outdatalist作る必要ありませんね・・・
trainingdatalist回せばいいだけだし・・・。
training使うようにしたら今のところエラーはなくなり、数値も異なった値が出るようになりました。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問