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

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

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

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

機械学習

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

Python

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

Q&A

1回答

884閲覧

深層学習で異常検知を行いたいがどこでエラーが起こっているのかわからない

konekone

総合スコア0

Keras

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/12/20 13:35

編集2021/12/20 14:07

前提・実現したいこと

右も左もわからないような初心者です。
Pythonを用いて独自の画像で異常検知を行えるようになりたいと思い他の方が公開しているコードを組み合わせたりしたのですが最後の部分でエラー表示。
正直数値等がおかしいのではと思っていたりしているのですがエラーの原因がわからずどう対処すればよいのかと行き詰ってしまいました。
エラーの原因とどのような改善を加えればよいのかご教授いただけたら幸いです。

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

InvalidArgumentError Traceback (most recent call last) ~\Anaconda3\lib\site-packages\tensorflow_core\python\framework\ops.py in _create_c_op(graph, node_def, inputs, control_inputs) 1609 try: -> 1610 c_op = c_api.TF_FinishOperation(op_desc) 1611 except errors.InvalidArgumentError as e: InvalidArgumentError: Dimensions must be equal, but are 128 and 3 for 'loss/activation_5_loss/softmax_cross_entropy_with_logits' (op: 'SoftmaxCrossEntropyWithLogits') with input shapes: [1,128], [16384,3]. During handling of the above exception, another exception occurred: ValueError Traceback (most recent call last) <ipython-input-19-07c452cd3afd> in <module> 3 batch_size=1, 4 shuffle=True, ----> 5 validation_data=(x_test, x_test), 6 ) ValueError: Dimensions must be equal, but are 128 and 3 for 'loss/activation_5_loss/softmax_cross_entropy_with_logits' (op: 'SoftmaxCrossEntropyWithLogits') with input shapes: [1,128], [16384,3]. ​

該当のソースコード

model = Sequential() model.add(Conv2D(32, (3, 3), padding='same',input_shape=(128,128,3))) model.add(Activation('relu')) model.add(Conv2D(32, (3, 3))) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(4,4))) model.add(Conv2D(64, (3, 3), padding='same')) model.add(Activation('relu')) model.add(Conv2D(64, (3, 3))) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(4,4))) model.add(Flatten()) model.add(Dense(512)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(128)) model.add(Activation('softmax')) model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy']) model.fit(x_train, x_train, epochs=20, batch_size=1, shuffle=True, validation_data=(x_test, x_test), )

試したこと

数値の変更や画像の変更をしましたが解決には至りませんでした。

補足情報(FW/ツールのバージョンなど)

画像がうまく読み込まれていない可能性も否定できないので一応書いておきます。
また入力画像ですが128×128で32bitになります。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/12/20 21:48 編集

x_test, x_test、これらのshapeが期待されているshapeというエラーです。x_test, x_testのshapeをprintしてみてください。
jbpb0

2021/12/21 02:57

model.fit(x_train, x_train,...」で同じ「x_train」が2回使われてるし、「...validation_data=(x_test, x_test),...」で同じ「x_test」が2回使われてるので、ネットワークの入力と出力が同じshapeである必要がありますが、実際のネットワークの定義は、下記の通りでそうなってません > model.add(Conv2D(32, (3, 3), padding='same',input_shape=(128,128,3))) が入力 > model.add(Dense(128)) が出力 入力と出力のどちらも、「x_train」や「x_test」のshape(からサンプル数の次元を取ったもの)と同じである必要があります
guest

回答1

0

掲載されたコードを見た限りだと、掲載していない部分のコードにも誤りが沢山ありそうな気がします(validation_data=(x_test, x_test),など)
ここがエラーの箇所だろうと勝手に決めつけて部分掲載するのではなく、できる限りコード全体を掲載するようにしてください。

異常検知をしたいということですが、どのような手法を望んでいるのでしょうか?
発生している問題・エラーメッセージのvalidation_data=(x_test, x_test),からだと VAE なのかなと想像できますし、該当ソースコードのモデルの組み方からだと分類問題なのかなと想像できます。

仮に、分類問題として異常検知を行いたいとした場合、開示されている情報で問題点は以下。

softmax直前の次元数が128となっているのは、正常+異常127種で判別したいということでしょうか?ただの正常/異常の2クラス分類であるならば model.add(Dense(2))としましょう。

②ラベルデータの用意の仕方ですが、kerasを使う場合は one-hotベクトル で用意します。
例)正常/異常(0,1)の2クラス分類であれば、正常(0)は[1,0]、異常(1)は[0,1]など

③モデルの組み方は shape を意識して組みましょう。おそらくこうなっているであろう shape をコメントで記載すると以下になっていると思います。(summary で見るほうが早いですが...)

model.add(Conv2D(32, (3, 3), padding='same',input_shape=(128,128,3))) #(128,128,3) -> (128,128,32) model.add(Activation('relu')) model.add(Conv2D(32, (3, 3))) #(128,128,32) -> (126,126,32) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(4,4))) #(126,126,32) -> (32,32,32) model.add(Conv2D(64, (3, 3), padding='same')) #(32,32,32) -> (32,32,64) model.add(Activation('relu')) model.add(Conv2D(64, (3, 3))) #(32,32,64) -> (30,30,64) model.add(Activation('relu')) model.add(MaxPool2D(pool_size=(4,4))) #(30,30,64) -> (8,8,64) model.add(Flatten()) #(8,8,64) -> (4096) model.add(Dense(512)) #(4096) -> (512) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(128)) # (512) -> (128) model.add(Activation('softmax'))

今はまだ問題にはなっていませんが、shape を意識しないままさらに手を加えたらおそらくエラーになりそうでしたので、先に指摘しておきます。
Conv2D()padding='same'をしなかった場合、カーネルサイズ-1ずつサイズが減っていきます。今回の場合ですと、カーネルサイズが (3,3) でしたので、w, h が -2 ずつですね。
今回はMaxPool2D()のカーネルサイズが (4,4) でしたので変化はありませんでしたが、だんだん意図しない shape になってしまうことになるので注意しましょう。

投稿2021/12/27 06:42

HRCo4

総合スコア140

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問