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

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

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

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

Q&A

0回答

595閲覧

画像を複数個の分割画像に分割し、類似した分割画像をまとめて同じ画像(赤一色、青一色等)に変換する処理をするプログラムを作ったがおかしい

ques346

総合スコア47

Python

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

0グッド

0クリップ

投稿2021/06/12 18:29

編集2021/06/13 04:31

イメージ説明
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 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])

タイトルのようなプログラムを作った・・・はずなのですが、
変換された画像は、いまいち規則性がありません、
プログラムがどこか論理的におかしいのか、それともこんなものなのか?(学習回数が単に少ないのか?

1つ気付いたのは、いやこれ、分割が細かすぎますね。。
こるならnnを1つ1つにあてる意味がない。
もう少し分割を粗くして、1つの分割画像に複数色含まないとだめですね。
で、閾値と繰り返し数を変えると、、何となく意味ありげな結果が出た気がします。

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

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

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

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

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

quickquip

2021/06/13 03:22

タイトルの意味が他人には伝わらないかと
ques346

2021/06/13 09:29

この質問の評価が-3というのは、よく分かりませんね。
quickquip

2021/06/13 23:51

マイナス評価がたまると「質問への追記・修正の依頼」欄(ここ)にテンプレ文章で依頼がでますからね。 "質問を書き直さないと回答でてこないよ"と思った質問で、具体的に何がどうと指摘するのも面倒、みたいな意図のマイナス評価はあると思いますよ。 何がしたいのかまったく伝わらないですよ(タイトルからもコードからも)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問