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

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

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

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

NumPy

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

機械学習

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

Python

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

解決済

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

pan_p
pan_p

総合スコア3

Keras

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

NumPy

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

機械学習

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

Python

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

1回答

0評価

0クリップ

473閲覧

投稿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

import tensorflow as tf from keras.applications.inception_v3 import InceptionV3 from keras.models import Model from keras.layers import Dense, GlobalAveragePooling2D from tensorflow.keras.optimizers import SGD from keras.regularizers import l2 import numpy as np from PIL import Image import os for dir in os.listdir("/content/drive/MyDrive/data/train"): dir1 = "/content/drive/MyDrive/data/train/" + dir label = 0 if dir == "KenUn": # 巻雲はラベル0 label = 0 elif dir == "KensekiUn": # 巻積雲はラベル1 label = 1 elif dir == "KensouUn": # 巻層雲はラベル2 label = 2 elif dir == "KousekiUn": # 高積雲はラベル3 label = 3 elif dir == "KousouUn": # 高層雲はラベル4 label = 4 elif dir == "RansouUn": # 乱層雲はラベル5 label = 5 elif dir == "SousekiUn": # 層積雲はラベル6 label = 6 elif dir == "SouUn": # 層雲はラベル7 label = 7 elif dir == "SekiranUn": # 積乱雲はラベル8 label = 8 elif dir == "SekiUn": # 積雲はラベル9 label = 9 for file in os.listdir(dir1): # label_listに正解ラベルを追加 label_list.append(label) filepath = dir1 + "/" + file # 画像を299x299pixelに変換し、2次元配列として読み込む image =np.array(Image.open(filepath).resize((299, 299))) print(filepath) # 画像をimage_listに追加(値を-1~1に変換) image_list.append((image/127.5)-1.0) # kerasに渡すためにnumpy配列に変換 numpy_list=np.array([]) for i in range(len(image_list)): image_list_numpy=np.append(numpy_list,image_list[i]) label_list = np.array(label_list) print(image_list_numpy) # 順番をシャッフル p = np.random.permutation(len(image_list)) image_list_numpy = image_list_numpy[p] label_list = label_list[p] # Inception v3モデルの読み込み ※最終層は読み込まない base_model = InceptionV3(weights='imagenet', include_top=False) # 最終層の設定 x = base_model.output x = GlobalAveragePooling2D()(x) predictions = Dense(1, kernel_initializer="glorot_uniform", activation="sigmoid", kernel_regularizer=l2(.0005))(x) model = Model(inputs=base_model.input, outputs=predictions) for layer in base_model.layers: layer.trainable = False # オプティマイザにSDGを使用 opt = SGD(lr=.01, momentum=.9) # モデルをコンパイル model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["accuracy"]) print(len(image_list_numpy)) model.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/ツールのバージョンなど)

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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)で統一しないとダメです カラー画像と白黒(グレースケール)画像が混ざってたりしませんか?

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Keras

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

NumPy

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

機械学習

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

Python

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