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行にまとめているんですね。
これ、上の画像と下の画像を相似な形にしたいのですが、どう設定すれば良いんでしょうか。
コード、回答を受けて更新しました、一応画像は相似形にできましたが、画像同士間隔が空いているので隣接させたいです、また、別の疑問もあるので、まだ回答のついていない「画像の分割」質問にも答えて頂きたいです。
out_img がどこにも定義されてないですね。
わざと初見で伝わらないように書いているんでしょうか。
(嫌みではなくて、コンテキストが分かっていない人を排除しようと意図的にしているのかも? という気がしたというだけです)
いや長沼テラテイラーさんは自分が何やってるかあんまり把握できてないので、何をやりたいかも把握しづらいんですよ。悪気はないんですよきっと。
長沼テラテイラーさんって、苗字が長沼なんですかね
悪気があるかないかはまったく問題ではなく、これで質問が伝わると思って書いているのかどうかが謎です。
そもそもこれで「悪気がある」という状態が想像できない。
out_img は一体何者?
plt は慣習としてギリギリ分かるとしても。
> 画像同士間隔が空いているので隣接させたい
私の回答のコメント見てください
ちょっとやってみます。
回答1件
あなたの回答
tips
プレビュー