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

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

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

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

深層学習

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

GitHub

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

機械学習

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

Python

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

Q&A

解決済

1回答

1142閲覧

何故AttributeErrorが発生するのか

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 04:58

編集2020/07/20 05:48

#前提・実現したいこと
GitHub WeaklyAnomalyDetection
上記サイト様のコードを参考にPythonを用いて、自前のデータセットでの異常検知をしたいと考えております。

#発生している問題・エラーメッセージ

Python

1--------------------------------------------------------------------------- 2AttributeError Traceback (most recent call last) 3<ipython-input-10-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-9-6e38c831f860> in train_and_evaluate(number, anomaly) 11 61 test_b = model.predict(X_test_b, batch_size=1) 12 62 13---> 63 train = train.reshape((len(train),-1)) 14 64 test_c = test_s.reshape((len(X_test_c),-1)) 15 65 test_b = test_b.reshape((len(X_test_b),-1)) 16 17AttributeError: 'list' object has no attribute 'reshape'

#コード
異常検知のコード(自前のデータセットのコードは文字数の関係上、省略をさせていただきます)

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(10))) 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) == 10: 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(10))) 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 103print(x_train_sum.shape) 104print(y_train_sum.shape) 105print(x_test_c.shape) 106print(x_test_b.shape) 107 108import cv2 109from PIL import Image 110 111def resize(x): 112 x_out = [] 113 114 for i in range(len(x)): 115 img = cv2.cvtColor(x[i], cv2.COLOR_RGB2BGR) 116 img = cv2.resize(img,dsize=(96,96)) 117 x_out.append(img) 118 119 return np.array(x_out) 120 121X_train_sum = resize(x_train_sum) 122X_test_c = resize(x_test_c) 123X_test_b = resize(x_test_b) 124 125import keras 126from keras.applications import MobileNetV2 127from keras.optimizers import Adam, SGD 128from keras.models import Model 129from keras.layers import GlobalAveragePooling2D, Dense 130from keras import backend as K 131 132from sklearn.neighbors import LocalOutlierFactor 133from sklearn import metrics 134from sklearn.preprocessing import MinMaxScaler 135 136 137input_shape = (96, 96, 3) 138classes = 3 139batchsize = 128 140alpha = 0.5 141 142def train_and_evaluate(number, anomaly=True): 143 # mobile net読み込み 144 print("Model build...") 145 146 mobile = MobileNetV2(include_top=True, input_shape=input_shape, alpha=alpha, 147 weights='imagenet') 148 149 # 最終層削除 150 mobile.layers.pop() 151 model = Model(inputs=mobile.input,outputs=mobile.layers[-1].output) 152 153 # L2層と全結合層を付ける 154 c = keras.layers.Lambda(lambda xx: 5*(xx)/K.sqrt(K.sum(xx**2)))(model.output) #metric learning 155 c = Dense(classes, activation='softmax')(c) 156 model = Model(inputs=model.input,outputs=c) 157 158 #model.summary() 159 160 model.compile(loss='categorical_crossentropy', 161 optimizer=Adam(amsgrad=True), 162 metrics=['accuracy']) 163 164 print(number,"training...") 165 166 #cnnの学習 167 if anomaly == True: 168 train_NO = 5000 169 else: 170 train_NO = 4500 171 172 hist = model.fit(X_train_sum[:train_NO], 173 y_train_sum[:train_NO], 174 batch_size=128, 175 epochs=50, 176 verbose = False) 177 178 179 # 最終層削除 180 model.layers.pop() 181 model = Model(inputs=model.input,outputs=model.layers[-1].output) 182 183 train = model.predict(X_train_sum[4000:4500], batch_size=1)#スニーカー 184 test_c = model.predict(X_test_c, batch_size=1) 185 test_b = model.predict(X_test_b, batch_size=1) 186 187 train = train.reshape((len(train),-1)) 188 test_c = test_c.reshape((len(X_test_c),-1)) 189 test_b = test_b.reshape((len(X_test_b),-1)) 190 191 #0-1変換 192 ms = MinMaxScaler() 193 train = ms.fit_transform(train) 194 test_c = ms.transform(test_c) 195 test_b = ms.transform(test_b) 196 197 # LOF 198 clf = LocalOutlierFactor(n_neighbors=5) 199 y_pred = clf.fit(train) 200 201 # plot the level sets of the decision function 202 Z1 = -clf._decision_function(test_c) 203 Z2 = -clf._decision_function(test_b) 204 205 #ROC曲線の描画 206 y_true = np.zeros(len(test_c)+len(test_b)) 207 y_true[len(test_c):] = 1#0:正常、1:異常 208 209 # FPR, TPR(, しきい値) を算出 210 fpr, tpr, _ = metrics.roc_curve(y_true, np.hstack((Z1, Z2))) 211 212 # AUC 213 auc = metrics.auc(fpr, tpr) 214 215 # ROC曲線をプロット 216 plt.plot(fpr, tpr, label='metric learning(AUC = %.2f)'%auc) 217 plt.legend() 218 plt.title(str(number)+'ROC curve') 219 plt.xlabel('False Positive Rate') 220 plt.ylabel('True Positive Rate') 221 plt.grid(True) 222 plt.show() 223 224 225#下記のコードを実行した際にエラーが発生いたします。 226# 普通の異常検知 227for i in range(2): 228 train_and_evaluate(i+1, False) 229 230# 弱異常検知 231for i in range(2): 232 train_and_evaluate(i+1)

#試していること
英語に疎い私ですが、エラーメッセージについて調査を行っていましたところ、下記のサイト様を参考に
Pythonエラー一覧(日本語)
「'list'オブジェクトは'reshape'という属性を持ってない」
と解釈をしました。しかし、ではどのようにコードを改善すればいいのかわからず、頭を抱えております。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

コード詳細動作の把握、妥当性の確認はしていませんがKeras - model.predict() returns list instead of numpy arrayと同様のケースかと思います。
上記に記載されているとおり、マルチ出力モデルだと複数の結果がnumpyndarrayではなくリストで返るそうです。
よってreshapeしたい場合はリストをndarrayに変換してやればよいです。

投稿2020/07/20 05:33

編集2020/07/20 05:34
can110

総合スコア38262

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

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

maguro2020

2020/07/20 06:08

ご回答いただきありがとうございます。can110様。 おかげさまで質問のエラーを無くすことができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問