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

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

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

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

Q&A

解決済

1回答

1447閲覧

subplotをforしたいがうまく行かない。

ques346

総合スコア47

Python

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

0グッド

0クリップ

投稿2021/06/09 16:22

編集2021/06/11 00:36
from google.colab import drive drive.mount('/content/drive') import sys import numpy as np import matplotlib.pyplot as plt sys.path.append('/content/drive/My Drive') import ActivationFunction as AF from PIL import Image from IPython.display import display img = Image.open("drive/My Drive/mnist_dataset/rei.jpeg") img = img.resize((100, 100)) img = np.asarray(img) plt.imshow(img) size = 5 v_split = img.shape[0] // size h_split = img.shape[1] // size out_img = [] [out_img.extend(np.hsplit(h_img, h_split)) for h_img in np.vsplit(img, v_split)] print("len(out_img)" ,len(out_img)) plt.figure(figsize=(100,100)) for i in range(len(out_img)): plt.subplot(20, 20, i+1).imshow(out_img[i]) def extract(x, y): # カラー画像の時Gだけ抜き取りたい if len(x.shape) == 3: h, w, ch = x.shape # RGBのGだけ抜き取りたい return x[:,:,y] v_max, v_min = 300, 200 def diff(x): imgrows, lenrows, imgcolumns, lencolumns = [], [], [], [] for (img, imgt) in zip(x, x.T): rows = img[(v_min<img)&(v_max>img)] columns = imgt[(v_min<imgt)&(v_max>imgt)] imgrows.append(rows) lenrows.append(len(rows)) imgcolumns.append(columns) lencolumns.append(len(columns)) return lenrows + lencolumns 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))) # 見本データに対しても同様に # exについて同様に training_data_list = [] for i in range(len(out_img)): #g #b #r 抽出後diffしてappend training_data_list.append([i] + diff(extract(out_img[i], 1)) + diff(extract(out_img[i], 2)) + diff(extract(out_img[i], 0))) # 略 print("training_data_list" ,training_data_list) print("training_data_list[1:]" ,training_data_list[1:]) print("len(training_data_list)" ,len(training_data_list)) print("len(out_data_list[0])" ,len(out_data_list[0])) print("out_data_list[0][0]" ,out_data_list[0][0]) print("out_data_list[1][0]" ,out_data_list[1][0]) print("out_data_list[2][0]" ,out_data_list[2][0]) print("out_data_list[0][1]" ,out_data_list[0][1]) print("out_data_list[1][1]" ,out_data_list[1][1]) print("len(out_data_list[1:])" ,len(out_data_list[1:])) print("out_data_list[0][1:]" ,out_data_list[0][1:]) # 3層ニューラルネットワーク class ThreeLayerNetwork: # コンストラクタ def __init__(self, inodes, hnodes, onodes, lr): # 各レイヤーのノード数 self.inodes = inodes self.hnodes = hnodes self.onodes = onodes # 学習率 self.lr = lr # 重みの初期化 self.w_ih = np.random.normal(0.0, 1.0, (self.hnodes, self.inodes)) self.w_ho = np.random.normal(0.0, 1.0, (self.onodes, self.hnodes)) # 活性化関数 self.af = AF.sigmoid self.daf = AF.derivative_sigmoid # 誤差逆伝搬 def backprop(self, idata, tdata): # 縦ベクトルに変換 o_i = np.array(idata, ndmin=2).T t = np.array(tdata, ndmin=2).T # 隠れ層 np.set_printoptions(threshold=10000) x_h = np.dot(self.w_ih, o_i) o_h = self.af(x_h) # 出力層 x_o = np.dot(self.w_ho, o_h) o_o = self.af(x_o) # 誤差計算 e_o = (t - o_o) e_h = np.dot(self.w_ho.T, e_o) # 重みの更新 self.w_ho += self.lr * np.dot((e_o * self.daf(o_o)), o_h.T) self.w_ih += self.lr * np.dot((e_h * self.daf(o_h)), o_i.T) # 順伝搬 def feedforward(self, idata): # 入力のリストを縦ベクトルに変換 o_i = np.array(idata, ndmin=2).T # 隠れ層 x_h = np.dot(self.w_ih, o_i) o_h = self.af(x_h) # 出力層 x_o = np.dot(self.w_ho, o_h) o_o = self.af(x_o) return o_o if __name__=='__main__': # パラメータ #inodes=784から30に変更 inodes = 30 hnodes = 100 onodes = 400 lr = 0.3 # ニューラルネットワークの初期化 nn = ThreeLayerNetwork(inodes, hnodes, onodes, lr) # 学習 epoch = 50 for e in range(epoch): print('#epoch ', e) data_size = len(training_data_list) for i in range(data_size): if i % 1000 == 0: print(' train: {0:>5d} / {1:>5d}'.format(i, data_size)) idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01 # 変更の余地あり tdata = np.zeros(onodes) + 0.01 tdata[training_data_list[i][0]] = 0.99 nn.backprop(idata, tdata) pass pass # テスト scoreboard = [] for i in range(len(out_data_list)): idata = (np.array(out_data_list[i][1:]) / 255.0 * 0.99) + 0.01 predict = nn.feedforward(idata) plabel = np.argmax(predict) print("plabel" ,plabel) pass scoreboard_array = np.asarray(scoreboard) print('performance: ', scoreboard_array.sum() / scoreboard_array.size)

一応これで画像が、上と下に表示されるんですが、
下の画像の行と列が、上の画像の行と列に対応してないんです。
上の画像の、1行以上を1行にまとめているんですね。

これ、上の画像と下の画像を相似な形にしたいのですが、どう設定すれば良いんでしょうか。

コード、回答を受けて更新しました、一応画像は相似形にできましたが、画像同士間隔が空いているので隣接させたいです、また、別の疑問もあるので、まだ回答のついていない「画像の分割」質問にも答えて頂きたいです。

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

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

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

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

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

quickquip

2021/06/10 01:54 編集

out_img がどこにも定義されてないですね。
quickquip

2021/06/10 02:12 編集

わざと初見で伝わらないように書いているんでしょうか。 (嫌みではなくて、コンテキストが分かっていない人を排除しようと意図的にしているのかも? という気がしたというだけです)
Munosuke222

2021/06/10 07:37

いや長沼テラテイラーさんは自分が何やってるかあんまり把握できてないので、何をやりたいかも把握しづらいんですよ。悪気はないんですよきっと。
ques346

2021/06/10 09:16

長沼テラテイラーさんって、苗字が長沼なんですかね
quickquip

2021/06/10 23:57

悪気があるかないかはまったく問題ではなく、これで質問が伝わると思って書いているのかどうかが謎です。
quickquip

2021/06/10 23:57

そもそもこれで「悪気がある」という状態が想像できない。
quickquip

2021/06/10 23:59

out_img は一体何者? plt は慣習としてギリギリ分かるとしても。
jbpb0

2021/06/13 22:52 編集

> 画像同士間隔が空いているので隣接させたい 私の回答のコメント見てください
ques346

2021/06/13 23:18

ちょっとやってみます。
guest

回答1

0

ベストアンサー

上の画像と下の画像を相似な形にしたい

が、分割された画像それぞれの配置が、元画像の位置に対応するようにしたい、という意味だとして、書きます
つまり、元画像の右上の部分が、分割された画像の配置でも右上に配置されるようにする

A. 分割された画像の、横方向に配置されてる数が現在いくつか、を数えてください
B. 「plt.subplot(17, 60, i+1)」の数字(17, 60)と、上記A.で数えた結果を比べて、どちらの数字がA.で数えた結果に対応するのか確認してください
C. 分割された画像の、横方向に配置される数がいくつになれば望ましい状態になるのか、を考えてください
D. 「plt.subplot(17, 60, i+1)」をどのように変えたらいいのか、を考えて、そこを変えて実行してみてください

変更して実行してエラーが出たら、
分割画像が6個までしか表示できないが、100個ほど表示したい
の私の回答に書いてある内容から、どうしたらいいのかを考えてください

投稿2021/06/10 01:12

jbpb0

総合スコア7651

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

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

ques346

2021/06/10 05:21

横方向に配置されてる数 というのは、 横方向に配置されてるピクセル数 ということで、 resizeして100.100なので、100個という事なんでしょうか・・・?この考えであってます?
jbpb0

2021/06/10 09:45 編集

違います 「分割された画像の」って書いてるでしょう ちっこい out_img[i] が何個並んでるか??
jbpb0

2021/06/13 20:44

> 画像同士間隔が空いているので隣接させたい plt.figure(figsize=(100,100)) の下に plt.subplots_adjust(wspace=0, hspace=0) を追加 参考 http://ailaby.com/subplots_adjust/ 座標軸を消したければ、 plt.subplot(20, 20, i+1).imshow(out_img[i]) の下に(同じインデントで) plt.axis('off') を追加 参考 https://cocoinit23.com/matplotlib-grid/
ques346

2021/06/14 04:12

できました、今forの塊を2つ作っていますが、 この塊2つが、互いに上下隣接して表示されており、境目が分かりにくい状態で、 この境が明確になるよう、改行等を入れる適切な方法はありますでしょうか? (たとえば、print("----")等としても、上に-----と表示さ、画像はやはり隣接したままになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問