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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

1回答

1630閲覧

ターゲットサンプルと入力配列の違いの原因

maguro2020

総合スコア34

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2020/07/20 03:17

#前提・実現したいこと
GitHub WeaklyAnomalyDetection

上記サイト様を参考に、Pythonと自前のデータセットを用いて異常検知を行いたいと考えております。

#発生している問題・エラーメッセージ
発生している問題の詳細は「#試していること」で述べさせていただきますが、x_train,y_train,x_test_y_testの出力結果が全て異なってしまい、頭を悩ませております。

Python

1--------------------------------------------------------------------------- 2ValueError Traceback (most recent call last) 3<ipython-input-11-7bfdc75aa020> in <module> 4 1 # 普通の異常検知 5 2 for i in range(2): 6----> 3 train_and_evaluate(i+1, False) 7 4 8 5 # 弱異常検知 9 10<ipython-input-10-6e38c831f860> in train_and_evaluate(number, anomaly) 11 50 batch_size=128, 12 51 epochs=50, 13---> 52 verbose = False) 14 53 15 54 16 17~/.pyenv/versions/3.6.5/lib/python3.6/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs) 18 1152 sample_weight=sample_weight, 19 1153 class_weight=class_weight, 20-> 1154 batch_size=batch_size) 21 1155 22 1156 # Prepare validation data. 23 24~/.pyenv/versions/3.6.5/lib/python3.6/site-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size) 25 635 # Check that all arrays have the same length. 26 636 if check_array_lengths: 27--> 637 training_utils.check_array_length_consistency(x, y, sample_weights) 28 638 if self._is_graph_network: 29 639 # Additional checks to avoid users mistakenly 30 31~/.pyenv/versions/3.6.5/lib/python3.6/site-packages/keras/engine/training_utils.py in check_array_length_consistency(inputs, targets, weights) 32 242 'the same number of samples as target arrays. ' 33 243 'Found ' + str(list(set_x)[0]) + ' input samples ' 34--> 244 'and ' + str(list(set_y)[0]) + ' target samples.') 35 245 if len(set_w) > 1: 36 246 raise ValueError('All sample_weight arrays should have ' 37 38ValueError: Input arrays should have the same number of samples as target arrays. Found 520 input samples and 1010 target samples.

#コード
(自前のコードは文字数制限のため、省略いたしました)
異常検知のコード

Python

1import matplotlib.pyplot as plt 2import os 3import cv2 4import random 5import numpy as np 6from keras.utils import to_categorical 7from keras.preprocessing.image import ImageDataGenerator 8 9from b_c_dataset import BCN_Dataset 10 11bell = 0#bellは0 12call = 1#callは1 13 14# dataset 15(x_train, y_train), (x_test, y_test) = BCN_Dataset.create_bcn() 16 17x_train = x_train.reshape(x_train.shape[0], 583, 438, 3) 18x_test = x_test.reshape(x_test.shape[0], 583, 438, 3) 19 20x_train = x_train.astype('float32') / 255 21x_test = x_test.astype('float32') / 255 22 23#学習データ 24x_train_sum, x_train_c, x_train_b, x_test_c, x_test_b = [], [], [], [], [] 25y_train_sum = [] 26 27for i in range(len(x_train)): 28 if y_train[i] == bell: 29 x_train_b.append(x_train[i]) 30 elif y_train[i] == call: 31 x_train_c.append(x_train[i]) 32 else: 33 x_train_sum.append(x_train[i]) 34 y_train_sum.append(y_train[i]) 35 36x_train_sum = np.array(x_train_sum) 37x_train_b = np.array(x_train_b) 38x_train_c = np.array(x_train_c) 39 40#trainデータからランダムに10個抽出 41number = np.random.choice(np.arange(0,x_train_sum.shape[0]),10,replace=False) 42 43x, y = [], [] 44 45for i in number: 46 x.append(x_train_sum[i]) 47 y.append(y_train_sum[i]) 48 49x_train_sum = np.array(x) 50y_train_sum = np.array(y) 51 52#callデータからランダムに10個抽出 53number = np.random.choice(np.arange(0,x_train_c.shape[0]),10,replace=False) 54 55x, y = [], [] 56 57for i in number: 58 x.append(x_train_c[i]) 59 60#データ結合 61x_train_sum = np.vstack((x_train_sum, np.array(x))) 62y_train_sum = np.hstack((y_train_sum, call*np.ones(500))) 63 64#bellデータからランダムに10個抽出 65number = np.random.choice(np.arange(0,x_train_b.shape[0]),10,replace=False) 66 67x, y = [], [] 68 69for i in number: 70 x.append(x_train_b[i]) 71 72# Data Augmentation 73datagen = ImageDataGenerator(rotation_range=10, 74 width_shift_range=0.1, 75 height_shift_range=0.1, 76 horizontal_flip=False) 77img = [] 78 79for d in datagen.flow(np.array(x), batch_size=1): 80 # このあと画像を表示するためにndarrayをPIL形式に変換して保存する 81 img.append(d[0]) 82 # datagen.flowは無限ループするため必要な枚数取得できたらループを抜ける 83 if len(img) == 500: 84 print("finish") 85 break 86 87#データ結合 88x_train_sum = np.vstack((x_train_sum, np.array(img))) 89y_train_sum = np.hstack((y_train_sum, bell*np.ones(500))) 90y_train_sum = to_categorical(y_train_sum) 91 92#テストデータ 93for i in range(len(x_test)): 94 if y_test[i] == 1:#callは1 95 x_test_c.append(x_test[i]) 96 97 if y_test[i] == 0:#bellは0 98 x_test_b.append(x_test[i]) 99 100x_test_c = np.array(x_test_c) 101x_test_b = np.array(x_test_b) 102 103**#こちらの出力結果が元のサイト様と異なります(※1)** 104print(x_train_sum.shape) 105print(y_train_sum.shape) 106print(x_test_c.shape) 107print(x_test_b.shape) 108 109 110#96 * 96 ** 3にリサイズ 111import cv2 112from PIL import Image 113 114def resize(x): 115 x_out = [] 116 117 for i in range(len(x)): 118 img = cv2.cvtColor(x[i], cv2.COLOR_RGB2BGR) 119 img = cv2.resize(img,dsize=(96,96)) 120 x_out.append(img) 121 122 return np.array(x_out) 123 124X_train_sum = resize(x_train_sum) 125X_test_c = resize(x_test_c) 126X_test_b = resize(x_test_b) 127 128 129#metric learning 130import keras 131from keras.applications import MobileNetV2 132from keras.optimizers import Adam, SGD 133from keras.models import Model 134from keras.layers import GlobalAveragePooling2D, Dense 135from keras import backend as K 136 137from sklearn.neighbors import LocalOutlierFactor 138from sklearn import metrics 139from sklearn.preprocessing import MinMaxScaler 140 141 142input_shape = (96, 96, 3) 143classes = 3 144batchsize = 128 145alpha = 0.5 146 147def train_and_evaluate(number, anomaly=True): 148 # mobile net読み込み 149 print("Model build...") 150 151 mobile = MobileNetV2(include_top=True, input_shape=input_shape, alpha=alpha, 152 weights='imagenet') 153 154 # 最終層削除 155 mobile.layers.pop() 156 model = Model(inputs=mobile.input,outputs=mobile.layers[-1].output) 157 158 # L2層と全結合層を付ける 159 c = keras.layers.Lambda(lambda xx: 5*(xx)/K.sqrt(K.sum(xx**2)))(model.output) #metric learning 160 c = Dense(classes, activation='softmax')(c) 161 model = Model(inputs=model.input,outputs=c) 162 163 #model.summary() 164 165 model.compile(loss='categorical_crossentropy', 166 optimizer=Adam(amsgrad=True), 167 metrics=['accuracy']) 168 169 print(number,"training...") 170 171 #cnnの学習 172 if anomaly == True: 173 train_NO = 5000 174 else: 175 train_NO = 4500 176 177 hist = model.fit(X_train_sum[:train_NO], 178 y_train_sum[:train_NO], 179 batch_size=128, 180 epochs=50, 181 verbose = False) 182 183 184 # 最終層削除 185 model.layers.pop() 186 model = Model(inputs=model.input,outputs=model.layers[-1].output) 187 188 train = model.predict(X_train_sum[4000:4500], batch_size=1)#スニーカー 189 test_c = model.predict(X_test_c, batch_size=1) 190 test_b = model.predict(X_test_b, batch_size=1) 191 192 train = train.reshape((len(train),-1)) 193 test_c = test_s.reshape((len(X_test_c),-1)) 194 test_b = test_b.reshape((len(X_test_b),-1)) 195 196 #0-1変換 197 ms = MinMaxScaler() 198 train = ms.fit_transform(train) 199 test_c = ms.transform(test_c) 200 test_b = ms.transform(test_b) 201 202 # LOF 203 clf = LocalOutlierFactor(n_neighbors=5) 204 y_pred = clf.fit(train) 205 206 # plot the level sets of the decision function 207 Z1 = -clf._decision_function(test_c) 208 Z2 = -clf._decision_function(test_b) 209 210 #ROC曲線の描画 211 y_true = np.zeros(len(test_c)+len(test_b)) 212 y_true[len(test_c):] = 1#0:正常、1:異常 213 214 # FPR, TPR(, しきい値) を算出 215 fpr, tpr, _ = metrics.roc_curve(y_true, np.hstack((Z1, Z2))) 216 217 # AUC 218 auc = metrics.auc(fpr, tpr) 219 220 # ROC曲線をプロット 221 plt.plot(fpr, tpr, label='metric learning(AUC = %.2f)'%auc) 222 plt.legend() 223 plt.title(str(number)+'ROC curve') 224 plt.xlabel('False Positive Rate') 225 plt.ylabel('True Positive Rate') 226 plt.grid(True) 227 plt.show() 228 229#ここより下のコードを実行した際に、上記のエラーメッセージが発生いたしました。 230# 普通の異常検知 231for i in range(2): 232 train_and_evaluate(i+1, False) 233 234# 弱異常検知 235for i in range(2): 236 train_and_evaluate(i+1) 237

異常検知のコードはまだ続きがありますが、エラーが発生してしまったため省略させていただきます。
※1:「#試していること」で出力結果の違いについて述べさせていただきます。

#試していること
コードの途中に記載させていただいた(※1)の出力結果は以下のようになっておりました。
自前のデータセットで実行した際の出力結果

#異常検知の途中のコード print(x_train_sum.shape) print(y_train_sum.shape) print(x_test_c.shape) print(x_test_b.shape) #出力結果 finish (520, 583, 438, 3) (1010, 3) (24, 583, 438, 3) (56, 583, 438, 3)

元のサイト様のコードの出力結果

print(x_train_sum.shape) print(y_train_sum.shape) print(x_test_c.shape) print(x_test_b.shape) # 出力結果 finish (5000, 28, 28, 1) (5000, 10) (1000, 28, 28, 1) (1000, 28, 28, 1)

注)画像サイズの違いは当方も把握しております。(サイト様は28,28の画像データ。自分は583,438の画像データです。)
エラーメッセージの原因は、上記に記載したx_train_sum.shape、y_train_sum.shape、x_test_c.shape、x_test_b.shapeの数が一致していないことではないかと考えております。また、元のサイト様の画像サイズは確かに、当初、使用する予定だった自前のデータセットのbellとcallのtrainデータの数は一致しておりませんでした。そこでデータ数を揃えるため、bell、callの元のトレーニング画像データを60枚にいたしました。(ちなみにnoiseのトレーニング画像データは11枚です)しかし、出力結果は変わらず、上記と同じになってしまい頭を悩ませております。

自前のデータセットの詳細です。
トレーニングデータ(train)
bell:60枚
call:60枚
noise:11枚

テストデータ(test)
bell:28枚
call:12枚
noise:10枚

クラス数はbell、call、noiseの3クラスです。

#補足
使っているPCはmacOS Catalina バージョン10.15.5
Pythonのバージョンは3.6.5です
Jupiter notebookを使用しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

元サイトのコードを見ますと

4000枚⁺スニーカー500枚⁺ブーツ500枚で5000

ですが例示いただきましたコードを見ますと

callは60枚とのことですが元サイトのコードのまま500枚分追加している

Python

1y_train_sum = np.hstack((y_train_sum, call*np.ones(500)))

bellは60枚とのことですが元サイトのコードのまま500枚分追加している

Python

1y_train_sum = np.hstack((y_train_sum, bell*np.ones(500)))

など元サイトのコードと例示いただいたコードを比較しますと
データ件数が異なるのに、数値を投入した件数に合わせず元サイトのコードのままの数字としている
からだと思います。

投稿2020/07/20 03:34

aokikenichi

総合スコア2240

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

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

maguro2020

2020/07/20 04:42

ご回答いただきありがとうございます。aokikenichi様。 aokikenichi様のおかげで、エラーを解消することができました。本当にありがとうございました。
aokikenichi

2020/07/20 09:08

お役に立てたようでよかったです たぶんそこらへんの可変な数値は関数内に直接書かずに冒頭辺りに設定値としてまとめた方が 美しい書き方ですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問