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

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

ただいまの
回答率

87.95%

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 209

score 12

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

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("out_img" ,out_img[0][1])
print("out_img" ,out_img[0][2])
print("out_img" ,out_img[5][3])
print("out_img" ,out_img[0])
print("out_img" ,out_img[10])
print("out_img" ,out_img[11])
print("out_img" ,out_img[41])
print("len(out_img)" ,len(out_img))
print("type(img)" ,type(img))
print("type(out_img)" ,type(out_img))
print("type(out_img[0])" ,type(out_img[0]))
print("type(out_img[0][0])" ,type(out_img[0][0]))

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)))

print(type(extract(out_img[i], 1)))
print(type(diff(extract(out_img[i], 1))))
print(type(out_img[0][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)
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使うようにしたら今のところエラーはなくなり、数値も異なった値が出るようになりました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • 退会済みユーザー

    2021/06/11 16:49

    複数のユーザーから「過去に投稿した質問と同じ内容の質問」という意見がありました
    teratailでは閲覧数を増やす目的などにより、過去に投稿した質問と同じ内容の質問を新たに投稿することは推奨していません。
    質問について新たにわかったことや試したことがあれば、すでにある質問を編集してください。

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

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

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Pythonに関する質問
  • 画像のRGBから抽出した値は、画像が全て異なるため全て当然異なるのに、出力数値が全て等しいのはなぜ