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

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

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

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

NumPy

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

機械学習

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

Python

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

Q&A

解決済

1回答

1624閲覧

エラーの解決方法が分かりません

pan_p

総合スコア3

Keras

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

NumPy

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/09/15 09:09

編集2021/09/16 11:38

前提・実現したいこと

雲の画像を学習させて種類の分類を行おうとしています
機械学習始めたばかりの初心者なのであまり理解が足りていないだけかもしれません

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

WARNING:tensorflow:Model was constructed with shape (None, None, None, 3) for input KerasTensor(type_spec=TensorSpec(shape=(None, None, None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"), but it was called on an input with incompatible shape (None, 1). --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-17-913039fb19c7> in <module>() ----> 1 model.fit(image_list_numpy, label_list, epochs=1000, batch_size=64, verbose=1, validation_split=0.2) 9 frames /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs) 992 except Exception as e: # pylint:disable=broad-except 993 if hasattr(e, "ag_error_metadata"): --> 994 raise e.ag_error_metadata.to_exception(e) 995 else: 996 raise ValueError: in user code: /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:853 train_function * return step_function(self, iterator) /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:842 step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:1286 run return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs) /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:2849 call_for_each_replica return self._call_for_each_replica(fn, args, kwargs) /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:3632 _call_for_each_replica return fn(*args, **kwargs) /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:835 run_step ** outputs = model.train_step(data) /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:787 train_step y_pred = self(x, training=True) /usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py:1037 __call__ outputs = call_fn(inputs, *args, **kwargs) /usr/local/lib/python3.7/dist-packages/keras/engine/functional.py:415 call inputs, training=training, mask=mask) /usr/local/lib/python3.7/dist-packages/keras/engine/functional.py:550 _run_internal_graph outputs = node.layer(*args, **kwargs) /usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py:1020 __call__ input_spec.assert_input_compatibility(self.input_spec, inputs, self.name) /usr/local/lib/python3.7/dist-packages/keras/engine/input_spec.py:234 assert_input_compatibility str(tuple(shape))) ValueError: Input 0 of layer conv2d is incompatible with the layer: : expected min_ndim=4, found ndim=2. Full shape received: (None, 1)

該当のソースコード

python

1import tensorflow as tf 2from keras.applications.inception_v3 import InceptionV3 3from keras.models import Model 4from keras.layers import Dense, GlobalAveragePooling2D 5from tensorflow.keras.optimizers import SGD 6from keras.regularizers import l2 7import numpy as np 8from PIL import Image 9import os 10 11for dir in os.listdir("/content/drive/MyDrive/data/train"): 12 dir1 = "/content/drive/MyDrive/data/train/" + dir 13 label = 0 14 15 if dir == "KenUn": # 巻雲はラベル0 16 label = 0 17 elif dir == "KensekiUn": # 巻積雲はラベル1 18 label = 1 19 elif dir == "KensouUn": # 巻層雲はラベル2 20 label = 2 21 elif dir == "KousekiUn": # 高積雲はラベル3 22 label = 3 23 elif dir == "KousouUn": # 高層雲はラベル4 24 label = 4 25 elif dir == "RansouUn": # 乱層雲はラベル5 26 label = 5 27 elif dir == "SousekiUn": # 層積雲はラベル6 28 label = 6 29 elif dir == "SouUn": # 層雲はラベル7 30 label = 7 31 elif dir == "SekiranUn": # 積乱雲はラベル8 32 label = 8 33 elif dir == "SekiUn": # 積雲はラベル9 34 label = 9 35 for file in os.listdir(dir1): 36 # label_listに正解ラベルを追加 37 label_list.append(label) 38 filepath = dir1 + "/" + file 39 # 画像を299x299pixelに変換し、2次元配列として読み込む 40 image =np.array(Image.open(filepath).resize((299, 299))) 41 print(filepath) 42 # 画像をimage_listに追加(値を-1~1に変換) 43 image_list.append((image/127.5)-1.0) 44 45# kerasに渡すためにnumpy配列に変換 46 47numpy_list=np.array([]) 48for i in range(len(image_list)): 49 image_list_numpy=np.append(numpy_list,image_list[i]) 50label_list = np.array(label_list) 51 52print(image_list_numpy) 53 54# 順番をシャッフル 55p = np.random.permutation(len(image_list)) 56image_list_numpy = image_list_numpy[p] 57label_list = label_list[p] 58 59# Inception v3モデルの読み込み ※最終層は読み込まない 60base_model = InceptionV3(weights='imagenet', include_top=False) 61# 最終層の設定 62x = base_model.output 63x = GlobalAveragePooling2D()(x) 64predictions = Dense(1, kernel_initializer="glorot_uniform", activation="sigmoid", kernel_regularizer=l2(.0005))(x) 65model = Model(inputs=base_model.input, outputs=predictions) 66for layer in base_model.layers: 67 layer.trainable = False 68# オプティマイザにSDGを使用 69opt = SGD(lr=.01, momentum=.9) 70# モデルをコンパイル 71model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["accuracy"]) 72 73print(len(image_list_numpy)) 74 75 76model.fit(image_list_numpy, label_list, epochs=1000, batch_size=64, verbose=1, validation_split=0.2)

試したこと

エラーメッセージで調べて以下を追加したのですが、これ自体がエラーを出したため全く分からなくなりました
image_list_numpy= image_list_numpy.reshape((-1,299,299,3))

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

イメージ説明
ここにより詳細な情報を記載してください。

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

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

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

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

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

jbpb0

2021/09/15 10:36

model.fit(... のすぐ上に print(image_list_numpy.shape) を追加して実行したら、何て表示されますか?
pan_p

2021/09/16 03:23

(273,) と表示されました 273は入力した画像の数のことだと思います
jbpb0

2021/09/16 04:17 編集

AIネットワークの入力側にKerasの「InceptionV3」を使ってるのだから、そこは (画像枚数, 画像縦画素数, 画像横画素数, 3) と表示されるようにしないといけないのです 参考 https://qiita.com/ha9kberry/items/4acb0c7e63f642227a92 の「データ取得」と「データ分割」
jbpb0

2021/09/16 04:40 編集

下記は、質問のコードの一部を簡略化したもので、サイズが3x3の画像を5枚扱っている場合です import numpy as np image_list = [] image=np.ones((3, 3)) image_list.append(image) image_list.append(image*2) image_list.append(image*3) image_list.append(image*4) image_list.append(image*5) print("image_list:") print(image_list) ## numpy_list=np.array([]) image_list_numpy=np.append(numpy_list,image_list[0]) print("image_list_numpy:") print(image_list_numpy) image_list_numpy=np.append(numpy_list,image_list[1]) print("image_list_numpy:") print(image_list_numpy) image_list_numpy=np.append(numpy_list,image_list[2]) print("image_list_numpy:") print(image_list_numpy) image_list_numpy=np.append(numpy_list,image_list[3]) print("image_list_numpy:") print(image_list_numpy) image_list_numpy=np.append(numpy_list,image_list[4]) print("image_list_numpy:") print(image_list_numpy) 上記コードを実際に実行して、「print()」で表示される結果を見たら分かりますけど、「image_list」にはちゃんとサイズ3x3の画像5枚のデータが格納されますが、「image_list_numpy」に格納されるデータは間違ってます
pan_p

2021/09/16 05:00

ありがとうございます エラーの原因がすごく分かりやすかったです しかし、image_list_numpyに一度配列を格納したのは、numpy行列に変換する際にエラーが出てしまったためです このやり方が使えないとなるとどうすればよろしいのでしょうか
jbpb0

2021/09/16 05:29

上のコメントのコードを実行した後に、引き続き下記のコードを実行してみてください image_list_numpy2 = np.array(image_list) print("image_list_numpy2:") print(image_list_numpy2) print("image_list_numpy2.shape:") print(image_list_numpy2.shape) そうすれば、「image_list_numpy2」にはサイズ3x3の画像5枚のデータが正しく格納されていることと、それの「shape」は (画像枚数, 画像縦画素数, 画像横画素数, 3) の内の、最後の「3」以外の条件を満たしていることが分かると思います 「shape」の最後の「3」をどうするのかは、調べて考えてみてください
pan_p

2021/09/16 06:51

参考に以下のコードをラベルリスト変換の前に追加したのですが、次元が大きいとのエラーが出てしまい解決方法がわからない状態です image_list_numpy2 = np.array(image_list) エラーメッセージ could not broadcast input array from shape (299,299,3) into shape (299,299)
jbpb0

2021/09/16 10:16

下記のように、「image」のサイズを299x299x3にしてもエラーは出ませんけど、そのエラーは何を実行した時に出るのでしょうか? import numpy as np image_list = [] image = np.ones((299, 299, 3)) image_list.append(image) image_list.append(image*2) image_list.append(image*3) image_list.append(image*4) image_list.append(image*5) ## image_list_numpy2 = np.array(image_list) print(image_list_numpy2.shape) 上記を実行したら、 (5, 299, 299, 3) と表示されます 「image」に入るデータが、上記のような「np.ones()」ででっちあげたものでも、質問のコードのように「np.array(Image.open(...」で画像ファイルを読み込んだものでも、サイズが299x299x3のnumpy配列ということに変わりないので、上記コードでできることが画像ファイルを読み込んだらできない、ということはないと思うのですが
jbpb0

2021/09/16 10:36

あと、質問とは関係ないですが、「keras」と「tensorflow.keras」を混ぜて使うのは良くないです どちらかに統一しましょう
pan_p

2021/09/16 11:43

ありがとうございます 実際にエラーメッセージが出た場所のスクショを補足情報のところに貼り付けましたので、見ていただければと思います
jbpb0

2021/09/16 12:36 編集

> VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences... と書かれてるので、おそらく「image_list」に「shape」が違うものが混ざってます というか、何をしてるのか意味がよく分からないのですが、「for i in range(len(image_list)):」で「len(image_list)」ができるということは、既に「image_list」にはデータが入ってるのですよね? それなのになぜ、さらに「image_list.append(image2*i)」でデータを入れるのでしょうか? 上記に目をつぶって、下記のようにしてもエラーは出ません import numpy as np image_list = [] image = np.ones((299, 299, 3)) image_list.append(image) image_list.append(image*2) image_list.append(image*3) image_list.append(image*4) image_list.append(image*5) ## image2 = np.ones((299, 299, 3)) for i in range(len(image_list)): image_list.append(image2*i) ## この行は本当はインデントが有ります image_list_numpy2 = np.array(image_list) print(image_list_numpy2.shape) 実行したら、 (10, 299, 299, 3) と表示されます (同じものが2回入ってるので) forループに入る前に既に「image_list」に入ってるデータの「shape」が(229, 229, 3)ではないのでは? 「image_list」に入れるデータは、全部「shape」を(229, 229, 3)で統一しないとダメです カラー画像と白黒(グレースケール)画像が混ざってたりしませんか?
guest

回答1

0

ベストアンサー

下記のコードをGoogle Colabで実行しても、エラーは出ませんでした

なお、画像ファイルを置いてるパス・ディレクトリ名は、当方の手元に有る画像に合わせて変えてます
また、使用した画像ファイルは全てカラーです

python

1import tensorflow as tf 2from tensorflow.keras.applications.inception_v3 import InceptionV3 3from tensorflow.keras.models import Model 4from tensorflow.keras.layers import Dense, GlobalAveragePooling2D 5from tensorflow.keras.optimizers import SGD 6from tensorflow.keras.regularizers import l2 7import numpy as np 8from PIL import Image 9import os 10 11 12image_list = [] 13label_list = [] 14for dir in os.listdir("/content/train"): 15 dir1 = "/content/train/" + dir 16 label = 0 17 if dir == "dogs": # 犬はラベル0 18 label = 0 19 elif dir == "cats": # 猫はラベル1 20 label = 1 21 for file in os.listdir(dir1): 22 # label_listに正解ラベルを追加 23 label_list.append(label) 24 filepath = dir1 + "/" + file 25 # 画像を299x299pixelに変換し、2次元配列として読み込む 26 #image =np.array(Image.open(filepath).resize((299, 299))) 27 # 画像を299x299pixelカラーに変換し、3次元配列として読み込む 28 image =np.array(Image.open(filepath).convert("RGB").resize((299, 299))) 29 print(image.shape) 30 print(filepath) 31 # 画像をimage_listに追加(値を-1~1に変換) 32 image_list.append((image/127.5)-1.0) 33 34print(len(image_list)) 35print(len(label_list)) 36 37image_list_numpy = np.array(image_list) 38label_list = np.array(label_list) 39print(image_list_numpy.shape) 40print(label_list.shape) 41 42p = np.random.permutation(len(image_list)) 43image_list_numpy = image_list_numpy[p] 44label_list = label_list[p] 45print(image_list_numpy.shape) 46print(label_list.shape) 47 48 49# Inception v3モデルの読み込み ※最終層は読み込まない 50base_model = InceptionV3(weights='imagenet', include_top=False) 51# 最終層の設定 52x = base_model.output 53x = GlobalAveragePooling2D()(x) 54predictions = Dense(1, kernel_initializer="glorot_uniform", activation="sigmoid", kernel_regularizer=l2(.0005))(x) 55model = Model(inputs=base_model.input, outputs=predictions) 56for layer in base_model.layers: 57 layer.trainable = False 58 59# オプティマイザにSDGを使用 60opt = SGD(lr=.01, momentum=.9) 61# モデルをコンパイル 62model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["accuracy"]) 63 64model.fit(image_list_numpy, label_list, epochs=1000, batch_size=64, verbose=1, validation_split=0.2)

【追記】
グレースケール画像を読み込んでもエラーにならないように、コードを変更しました

投稿2021/09/20 03:09

編集2021/09/20 03:52
jbpb0

総合スコア7651

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

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

jbpb0

2021/09/20 03:58 編集

上記のコードを、画像ファイルを置いてるパス・ディレクトリ名を質問者さんの画像ファイルの場所に合わせて変更して動かした時に、画像ファイルを読み込んでるforループ内の print(image.shape) の結果表示が、全ての画像で (299, 299, 3) となってるか、確認してみてください もし、使ってる画像にグレースケール画像があると、 print(image.shape) の結果表示が (299, 299) となり、下記のような、質問に貼られてる画像と同様なエラーが出ます ValueError: could not broadcast input array from shape (299,299,3) into shape (299,299) その場合は、画像ファイルを読み込んでデータを「image」に入れる際に、「shape」が(299,299)ではなく(299,299,3)になるようにする(グレースケールのデータをカラーのデータに変換する)必要があります 【追記】 回答のコードを、グレースケールのデータをカラーのデータに変換するように変更しました
pan_p

2021/09/20 04:23

本当にありがとうございます! 確認してみたところ、(299,299,4)となっている画像が何枚かあったため取り除きました また上記のRGB変換のコードを追加して実行し直したら、うまくいきました 解決してほっとしました
jbpb0

2021/09/20 04:31

> (299,299,4)となっている画像が何枚かあった なるほど、そちらでしたか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問