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

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

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

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

Q&A

解決済

1回答

1786閲覧

model.fitがValueErrorになる

f0u2n4e0ll

総合スコア1

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

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

0グッド

0クリップ

投稿2023/01/29 16:15

前提

python初心者です。
以下のサイトを見て異常検知AIを作ろうとしたのですが以下のエラーメッセージが発生しました。
https://qiita.com/michelle0915/items/28bc5b844bd0d7ab597b

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

ValueError Traceback (most recent call last) Cell In[3], line 69 65 return K.mean(K.square(y_true - y_pred), axis=[1,2,3]) 67 model.compile(optimizer=optimizer, loss=r_loss) ---> 69 model.fit( 70 train, 71 train, 72 batch_size=BATCH_SIZE, 73 epochs=EPOCHS 74 ) File ~\anaconda3\envs\opencv\lib\site-packages\keras\utils\traceback_utils.py:70, in filter_traceback.<locals>.error_handler(*args, **kwargs) 67 filtered_tb = _process_traceback_frames(e.__traceback__) 68 # To get the full stack trace, call: 69 # `tf.debugging.disable_traceback_filtering()` ---> 70 raise e.with_traceback(filtered_tb) from None 71 finally: 72 del filtered_tb File ~\AppData\Local\Temp\__autograph_generated_fileotg7w6jb.py:15, in outer_factory.<locals>.inner_factory.<locals>.tf__train_function(iterator) 13 try: 14 do_return = True ---> 15 retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope) 16 except: 17 do_return = False ValueError: in user code: File "C:\Users\owner\anaconda3\envs\opencv\lib\site-packages\keras\engine\training.py", line 1160, in train_function * return step_function(self, iterator) File "C:\Users\owner\anaconda3\envs\opencv\lib\site-packages\keras\engine\training.py", line 1146, in step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) File "C:\Users\owner\anaconda3\envs\opencv\lib\site-packages\keras\engine\training.py", line 1135, in run_step ** outputs = model.train_step(data) File "C:\Users\owner\anaconda3\envs\opencv\lib\site-packages\keras\engine\training.py", line 993, in train_step y_pred = self(x, training=True) File "C:\Users\owner\anaconda3\envs\opencv\lib\site-packages\keras\utils\traceback_utils.py", line 70, in error_handler raise e.with_traceback(filtered_tb) from None File "C:\Users\owner\anaconda3\envs\opencv\lib\site-packages\keras\engine\input_spec.py", line 295, in assert_input_compatibility raise ValueError( ValueError: Input 0 of layer "model_8" is incompatible with the layer: expected shape=(None, 300, 300, 3), found shape=(None, 4032, 3024, 3)

該当のソースコード

from tensorflow.keras.layers import Input, Conv2D, Flatten, Dense, Conv2DTranspose, Reshape, Activation, LeakyReLU from tensorflow.keras.models import Model from tensorflow.keras import backend as K from tensorflow.keras.optimizers import Adam import numpy as np import cv2 import glob train_images = glob.glob('training_images/*') train = [] for i in train_images: image = cv2.imread(i) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) train.append(image) train = np.array(train) train = train.astype('float32') / 255 LEARNING_RATE = 0.0005 BATCH_SIZE = 8 Z_DIM = 100 EPOCHS = 50 encoder_input = Input(shape=(300,300,3), name='encoder_input') x = encoder_input x = Conv2D(filters=32, kernel_size=3, strides=1, padding='same', name='encoder_conv_0')(x) x = LeakyReLU()(x) x = Conv2D(filters=32, kernel_size=3, strides=1, padding='same', name='encoder_conv_0_1')(x) x = LeakyReLU()(x) x = Conv2D(filters=64, kernel_size=3, strides=2, padding='same', name='encoder_conv_1')(x) x = LeakyReLU()(x) x = Conv2D(filters=64, kernel_size=3, strides=2, padding='same', name='encoder_conv_2')(x) x = LeakyReLU()(x) x = Conv2D(filters=64, kernel_size=3, strides=1, padding='same', name='encoder_conv_3')(x) x = LeakyReLU()(x) shape_before_flattening = K.int_shape(x)[1:] x = Flatten()(x) encoder_output = Dense(Z_DIM, name='encoder_output')(x) encoder = Model(encoder_input, encoder_output) decoder_input = Input(shape=(Z_DIM,), name='decoder_input') x = Dense(np.prod(shape_before_flattening))(decoder_input) x = Reshape(shape_before_flattening)(x) x = Conv2DTranspose(filters=64, kernel_size=3, strides=1, padding='same', name='decoder_conv_t_0')(x) x = LeakyReLU()(x) x = Conv2DTranspose(filters=64, kernel_size=3, strides=2, padding='same', name='decoder_conv_t_1')(x) x = LeakyReLU()(x) x = Conv2DTranspose(filters=32, kernel_size=3, strides=2, padding='same', name='decoder_conv_t_2')(x) x = LeakyReLU()(x) x = Conv2DTranspose(filters=32, kernel_size=3, strides=1, padding='same', name='decoder_conv_t_2_5')(x) x = LeakyReLU()(x) x = Conv2DTranspose(filters=3, kernel_size=3, strides=1, padding='same', name='decoder_conv_t_3')(x) x = Activation('sigmoid')(x) decoder_output = x decoder = Model(decoder_input, decoder_output) model_input = encoder_input model_output = decoder(encoder_output) model = Model(model_input, model_output) optimizer = Adam(learning_rate=LEARNING_RATE) def r_loss(y_true, y_pred): return K.mean(K.square(y_true - y_pred), axis=[1,2,3]) model.compile(optimizer=optimizer, loss=r_loss) model.fit( train, train, batch_size=BATCH_SIZE, epochs=EPOCHS )

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

anaconda3 jupyter notebook
opencv 4.6.0
Tensorflow 2.10.0

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

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

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

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

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

PondVillege

2023/01/29 17:09

画像サイズがモデルのものと与えたサイズで異なるようですね
jbpb0

2023/01/29 18:30

model.fit(...」のすぐ上に print(train.shape) を追加して実行して、「train」(学習データ)の形状を確認してみてください それと、 > encoder_input = Input(shape=(300,300,3), name='encoder_input') の「300,300,3」が違うのが、 > ValueError: Input 0 of layer "model_8" is incompatible with the layer: expected shape=(None, 300, 300, 3), found shape=(None, 4032, 3024, 3) の原因だと思います
f0u2n4e0ll

2023/01/29 19:48

print(train.shape)を実行したところ (6, 4032, 3024, 3)と出ました。 「300,300,3」のところを書き換えたらよいのでしょうか?
PondVillege

2023/01/29 19:58

はい,機械学習としての良し悪しは置いといて,プログラムとしては(300, 300, 3)を(4032, 3024, 3)にするだけで動きます.
f0u2n4e0ll

2023/01/30 00:15

上記のように値を変えたところ以下のエラーが出たのですが、 調べてもよくわかりませんでした。 この場合どうすれば良いのでしょうか? ResourceExhaustedError Traceback (most recent call last) Cell In[1], line 39 37 shape_before_flattening = K.int_shape(x)[1:] 38 x = Flatten()(x) ---> 39 encoder_output = Dense(Z_DIM, name='encoder_output')(x) 40 encoder = Model(encoder_input, encoder_output) 42 decoder_input = Input(shape=(Z_DIM,), name='decoder_input')
PondVillege

2023/01/30 02:10

調べたらメモリ不足という内容がわかるはずです. この場合, ハードウェア的解決でメモリを増設するか, ソフトウェア的解決で入力の画像サイズを小さくし,モデルが占めるメモリ領域を削減するしかありません.まず4032x3024x3の画像なんて扱うのは精度的にも資源的にも現実的ではありません.普通は画像に合わせてモデルを大きくするのではなく,モデルが扱えるレベルのサイズに合わせて入力で与える画像を小さくします.
jbpb0

2023/01/30 03:10 編集

質問者さん 以下は、 > ハードウェア的解決でメモリを増設する がムリで、 > ソフトウェア的解決で入力の画像サイズを小さくし,モデルが占めるメモリ領域を削減する をする場合の話です > 以下のサイトを見て異常検知AIを作ろうとした 「異常検知」で見つけたい正常画像と異常画像の差異が、 > encoder_input = Input(shape=(300,300,3), name='encoder_input') に合わせた300x300のサイズにリサイズしても消えずに残るのなら、上記の「300,300,3」は変えずに元のままで、「image = cv2.imread(i)」のすぐ下に300x300にリサイズするコードを追加すれば、(使ってるgpuのメモリーが極端に少なくなければ)エラーは出なくなると思います 参考 https://imagingsolution.net/program/python/opencv-python/opencv_resize_image/#toc2 の「出力サイズを指定してリサイズする方法」 もし、300x300にリサイズしたら「異常検知」ができなくなるのなら、メモリー不足にならずに「異常検知」ができるサイズを探して、学習画像はそのサイズにリサイズして、 > encoder_input = Input(shape=(300,300,3), name='encoder_input') も、それに合わせて変えます あと、「BATCH_SIZE = 8」の「8」を小さくするのも、メモリー不足対策にはなります ただし、それを変えると学習の収束度合いも変わるので、まずは入力画像のサイズをリサイズするのを試して、それでもメモリー不足が解消しない場合に試すのがいいと思います
guest

回答1

0

自己解決

お教え頂いた方法で実行してみるとエラーなく異常検知できました。
ご回答頂きありがとうございました。誠に感謝致します

投稿2023/01/30 13:11

f0u2n4e0ll

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問