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

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

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

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

Q&A

0回答

589閲覧

Fashion-MNISTのオートエンコーダで入力&デコード画像の差分画像と、異常領域のヒートマップを作成したい

Poyoyo

総合スコア6

Python

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

0グッド

0クリップ

投稿2021/10/08 11:15

編集2021/10/08 11:17

##実現したいこと
①Fashion-MNISTデータセットで行なった畳み込みオートエンコーダにて、入力画像と出力画像の差分(Difference)の画像と、Heatmapの画像を出力したい。

②下記、「試したこと」に記載の、history = model.fit(x_normal_train, x_normal_train,.....の戻り値はval_loss: 0.2036だったが、その後に行なったscore = model.evaluate(x_test, x_test, verbose=1) の戻り値がloss: -563.5782
-563.5781860351562であった。この損失-563というのはどういうことか知りたい。最適なモデルであれば損失は0.2036に近い値が返ってくるという認識である。

##試したこと
Fashion-MNISTにて、畳み込みオートエンコーダを実装。
学習には、ラベル7のスニーカーのみで行い、異常画像としてラベル6のシャツを使用した。
入力画像とデコード後の画像は出力できたが、入力画像とデコード後の差分画像を出力し、そのヒートマップで異常個所を可視化するところが分からない。調べても該当箇所が見つからなかったので質問させていただきました。

環境:Google colaboratory

python

1#必要ライブラリのインポート 2import numpy as np 3import tensorflow as tf 4 5#Fashion-MNISTのインポート シャツ:ラベル6、スニーカー:ラベル7 6from tensorflow.keras.datasets import fashion_mnist 7 8#Fashion-MNISTの読み込み 9(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data() 10 11#形状と次元確認 12print("x_train.shape:", x_train.shape) 13print("x_test.shape:", x_test.shape) 14print("x_train.ndim:", x_train.ndim) 15print("x_test.ndim:", x_test.ndim) 16 17target_imgs = x_train[y_train == 7] #スニーカーはラベル7で今回正常データとする。 18x_test = x_test[y_test == 7] #スニーカーのmodel.Evaluateで使う用途 19anomaly_imgs = x_train[y_train == 6] #シャツはラベル6で今回異常のデータとする。 20import matplotlib.pyplot as plt 21%matplotlib inline 22 23print(len(target_imgs)) #スニーカーのデータ数確認→6000 24print(len(anomaly_imgs)) #ブーツのデータ数確認→6000 25 26#試しに1枚出力 27plt.imshow(target_imgs[0], cmap="gray") 28 29#試しに1枚出力 30plt.imshow(anomaly_imgs[0], cmap="gray") 31 32#変数に代入 33x_normal_train = target_imgs 34x_anomaly_test = anomaly_imgs 35print("x_normal_train.shape:", x_normal_train.shape) 36print("x_anomaly_test.shape:", x_anomaly_test.shape) 37 38##訓練データ 正常データのスニーカー★ 39#x_normal_train(6000, 28, 28)の3階テンソルを(6000, 28, 28, 1)の4階テンソルへ変換 40x_normal_train = x_normal_train.reshape(6000, 28, 28, 1) 41#float32型に変換 42x_normal_train = x_normal_train.astype("float32") 43#0から1.0の範囲に変換 44x_normal_train = x_normal_train / 255 45 46##検証データ 異常データのシャツ★ 47#x_anomaly_test(6000, 28, 28)の3階テンソルを(6000, 28, 28, 1)の4階テンソルへ変換 48x_anomaly_test = x_anomaly_test.reshape(6000, 28, 28, 1) 49#float32型に変換 50x_anomaly_test = x_anomaly_test.astype("float32") 51#0から1.0の範囲に変換 52x_anomaly_test = x_anomaly_test / 255 53 54#x_normal_trainをx_normal_trainとx_normal_valに分ける 55x_normal_val = x_normal_train[:3000] 56x_normal_train = x_normal_train[3000:] 57#x_anomaly_testをx_anomaly_testとx_anomaly_valに分ける 58x_anomaly_val = x_anomaly_test[:3000] 59x_anomaly_test = x_anomaly_test[3000:] 60print("x_normal_val.shape:", x_normal_val.shape) 61print("x_normal_train.shape:", x_normal_train.shape) 62print("x_anomaly_val.shape:", x_anomaly_val.shape) 63print("x_anomaly_test.shape:", x_anomaly_test.shape) 64 65#畳み込みオートエンコーダ 66#keras.layersからInput関数, Dense関数、Conv2D関数、MaxPooling関数、UpSampling関数、Activation関数をインポート 67from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D, Activation 68#keras.modelsからModel関数をインポート 69from keras.models import Model 70#keras.callbacksからEarlyStopping関数をインポート 71from keras.callbacks import EarlyStopping 72es_cb = EarlyStopping(monitor='val_loss', patience=0, verbose=0, mode='auto') 73 74##Encode部 75input_img = Input(shape=(28, 28, 1)) #Input関数で入力として受け付けるデータの次元を指定 76x = Conv2D(56, (3, 3), padding="same")(input_img) #受け付けたデータを56個からなるレイヤーに流す。3x3フィルター、ゼロパディングを使う 77x = Activation("relu")(x) 78x = MaxPooling2D((2, 2), padding="same") (x) #多分2x2に対してプーリングする 79x = Conv2D(28, (3, 3), padding="same")(x) #28個のレイヤーに流す。3x3フィルター、ゼロパディングを使う 80x = Activation("relu")(x) 81x = MaxPooling2D((2, 2), padding="same") (x) #多分2x2に対してプーリングする 82x = Conv2D(14, (3, 3), padding="same")(x) #14個のレイヤーに流す。3x3フィルター、ゼロパディングを使う 83encoded = Activation("relu")(x) 84 85##Decode部 86x = Conv2D(14, (3, 3), padding="same")(encoded) 87x = Activation("relu")(x) 88x = UpSampling2D((2, 2)) (x) 89x = Conv2D(28, (3, 3), padding="same")(x) #28個のレイヤーに流す。3x3フィルター、ゼロパディングを使う 90x = Activation("relu")(x) 91x = UpSampling2D((2, 2)) (x) 92x = Conv2D(56, (3, 3), padding="same")(x) #56個のレイヤーに流す。3x3フィルター、ゼロパディングを使う 93x = Activation("relu")(x) 94x = UpSampling2D((1, 1)) (x) 95x = Conv2D(1, (3, 3), padding="same")(x) #3x3フィルター、ゼロパディングを使う 96decoded = Activation("sigmoid")(x) #decoded変数に入れる 97 98model = Model(input_img, decoded) #Model関数で入力と出力を指定。入力と出力が指定した引数のようになるモデルにするということ 99model.compile(optimizer="adam", loss="binary_crossentropy") 100 101 102history = model.fit(x_normal_train, x_normal_train, 103 batch_size = 28, 104 epochs = 100, 105 verbose=1, 106 validation_data=(x_normal_val, x_normal_val), 107 callbacks=[es_cb], 108 shuffle=True) 109 #→val_loss: 0.2036 110 111#Evaluate with test dataset 112score = model.evaluate(x_test, x_test, verbose=1) 113print(score) 114 #→1s 41ms/step - loss: -563.5782 -563.5781860351562 115 116 117#Visualize originail image and reconstructed image 118x_anomaly_pred = model.predict(x_anomaly_test) #異常データをモデルに通す 119#definition to show original image and reconstructed image 120def showOrigDec(original, dec, num=10): 121 import matplotlib.pyplot as plt 122 n=num 123 plt.figure(figsize=(20, 4)) 124 125 for i in range(n): 126 #display original 127 ax = plt.subplot(2, n, i+1) 128 plt.imshow(original[i].reshape(28, 28), cmap="gray") #imshow expects images to be structured as (rows, columns) for grayscale data and (rows, columns, channels) and possibly (rows, columns, channels, alpha) values for RGB(A) data. 129 #You will thus have to reshape your grayscale visualization image into (28, 28) to make it work. 130 #グレースケールにするにはcmap="gray"が必要 131 ax.get_xaxis().set_visible(False) 132 ax.get_yaxis().set_visible(False) 133 134 #display reconstruction 135 ax = plt.subplot(2, n, i+1+n) 136 plt.imshow(dec[i].reshape(28, 28), cmap="gray") 137 ax.get_xaxis().set_visible(False) 138 ax.get_yaxis().set_visible(False) 139 plt.show() 140 141showOrigDec(x_anomaly_test, x_anomaly_pred) 142

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問