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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

GitHub

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

機械学習

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

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

887閲覧

リストをNumPy配列ndarrayに変換する方法

maguro2020

総合スコア34

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

GitHub

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

機械学習

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

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/07/20 15:40

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

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

Python

1--------------------------------------------------------------------------- 2ValueError Traceback (most recent call last) 3<ipython-input-12-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-11-ef7de7d098c9> in train_and_evaluate(number, anomaly) 11 63 train = np.array(train) 12 64 13---> 65 train = train.reshape((len(train),-1)) 14 66 test_c = test_c.reshape((len(X_test_c),-1)) 15 67 test_b = test_b.reshape((len(X_test_b),-1)) 16 17ValueError: cannot reshape array of size 0 into shape (0,newaxis)

また、print(train)でtrainの中身を確認しましたところ、

#print(train) --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-13-246f4ac0135d> in <module> ----> 1 print(train) NameError: name 'train' is not defined

という上記のエラーが発生してしまい、trainの中身が何故かなくなっておりました。

#コード
異常検知のコード

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#下記にNumPyをndarrayに変換するコードを付け足しました(※1) 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 = np.array(train) #(※1) 188 189 train = train.reshape((len(train),-1)) 190 test_c = test_c.reshape((len(X_test_c),-1)) 191 test_b = test_b.reshape((len(X_test_b),-1)) 192 193 #0-1変換 194 ms = MinMaxScaler() 195 train = ms.fit_transform(train) 196 test_c = ms.transform(test_c) 197 test_b = ms.transform(test_b) 198 199 # LOF 200 clf = LocalOutlierFactor(n_neighbors=5) 201 y_pred = clf.fit(train) 202 203 # plot the level sets of the decision function 204 Z1 = -clf._decision_function(test_c) 205 Z2 = -clf._decision_function(test_b) 206 207 #ROC曲線の描画 208 y_true = np.zeros(len(test_c)+len(test_b)) 209 y_true[len(test_c):] = 1#0:正常、1:異常 210 211 # FPR, TPR(, しきい値) を算出 212 fpr, tpr, _ = metrics.roc_curve(y_true, np.hstack((Z1, Z2))) 213 214 # AUC 215 auc = metrics.auc(fpr, tpr) 216 217 # ROC曲線をプロット 218 plt.plot(fpr, tpr, label='metric learning(AUC = %.2f)'%auc) 219 plt.legend() 220 plt.title(str(number)+'ROC curve') 221 plt.xlabel('False Positive Rate') 222 plt.ylabel('True Positive Rate') 223 plt.grid(True) 224 plt.show() 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) 233

#試していること
現在、上記のエラーについて調査を行っているのですが、解決の手段が全く見えていない状況となっております。しかし、下記サイト様にNumPy配列をndarrayに変換する際に、「便宜上「変換」という言葉を使っているが、実際は元のオブジェクトはそのままで新たな型のオブジェクトが生成される。」ということが記載されており、もしかすると新しい型のオブジェクトが生成されてしまったがために中身が空になってしまったのではないか、と考えているのですが、ではコードをどのように改良すればいいのかわからず、頭を悩ませております。
NumPy配列ndarrayとPython標準のリストを相互に変換

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

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

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

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

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

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

can110

2020/07/20 22:56

提示コードには「print(train)」が含まれていないようですが。
meg_

2020/07/21 00:07

「NameError: name 'train' is not defined」は「trainの中身が何故かなくなっておりました」とは意味の違うエラーですよね?ご確認ください。
guest

回答1

0

ベストアンサー

trainを定義し値を代入しところから1つずつtrainの内容を追い、どこでなくなったかを突き止めるところからだと思います。

投稿2020/07/21 03:43

aokikenichi

総合スコア2210

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問