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

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

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

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

Q&A

解決済

1回答

1279閲覧

Conv2dのValueError

keita_kkk

総合スコア17

Keras

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

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

0グッド

0クリップ

投稿2021/07/25 03:35

前提・実現したいこと

pythonで"ディープラーニングを使用して「あなたにそっくりな女優判別プログラム」を作ったおはなし"
リンク:https://qiita.com/k_eita/items/a50a4cae0aa2598422e4
というものを参考にしてシステムを作成しています。
numpyファイルを読み込もうとしていたら以下のエラーメッセージが発生しました。

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

2021-07-25 12:20:23.131227: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN)to use the following CPU instructions in performance-critical operations: AVX AVX2 To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. (0,) Traceback (most recent call last): File "c:/Users/Owner/Documents/anaconda_vs/appale_project/use_cnn.py", line 97, in <module> main() File "c:/Users/Owner/Documents/anaconda_vs/appale_project/use_cnn.py", line 37, in main model = model_train(X_train, Y_train, X_val, Y_val) File "c:/Users/Owner/Documents/anaconda_vs/appale_project/use_cnn.py", line 45, in model_train model.add(Conv2D(32, (3, 3), padding = 'same', input_shape = X.shape[1:])) File "C:\Users\Owner\anaconda3\envs\cnn_env\lib\site-packages\tensorflow\python\training\tracking\base.py", line 457, in _method_wrapper result = method(self, *args, **kwargs) File "C:\Users\Owner\anaconda3\envs\cnn_env\lib\site-packages\tensorflow\python\keras\engine\sequential.py", line 206, in add layer(x) File "C:\Users\Owner\anaconda3\envs\cnn_env\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 926, in __call__ input_list) File "C:\Users\Owner\anaconda3\envs\cnn_env\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 1092, in _functional_construction_call input_spec.assert_input_compatibility(self.input_spec, inputs, self.name) File "C:\Users\Owner\anaconda3\envs\cnn_env\lib\site-packages\tensorflow\python\keras\engine\input_spec.py", line 196, in assert_input_compatibility str(x.shape.as_list())) ValueError: Input 0 of layer conv2d is incompatible with the layer: : expected min_ndim=4, found ndim=1. Full shape received: [None]

該当のソースコード

python

1from inspect import CORO_SUSPENDED 2from re import escape 3import numpy as np 4import matplotlib.pyplot as plt 5import keras 6from keras.models import Sequential 7from keras.layers import Conv2D, MaxPooling2D 8from keras.layers import Activation, Dropout, Flatten, Dense 9from keras.utils import np_utils 10from keras.utils import plot_model 11import os 12 13#numpyファイルの読み込み 14in_npy = "appale_rgb.npy" 15 16#出力するモデル名を指定 17out_model = "appale_out.h5" 18 19#CNN設定 20CATEGORY_NUM = 5 21BATCH_SIZE = 32 22EPOCHS = 15 23LEARNING_RATE = 0.0001 24 25def main(): 26 #画像データの読み込み 27 X_train, X_val, Y_train, Y_val = np.load(in_npy) 28 #正規化を行う(最大値:256で割って0~1に収束) 29 X_train = X_train.astype("float")/ 256 30 X_val = X_val.astype("float") / 256 31 #ラベルをベクトルに変換 32 Y_train = np_utils.to_categorical(Y_train, CATEGORY_NUM) 33 Y_val = np_utils.to_categorical(Y_val, CATEGORY_NUM) 34 35 #学習の実行 36 model = model_train(X_train, Y_train, X_val, Y_val) 37 38def model_train(X, Y, Xv, Yv): 39 #モデルの定義 40 model = Sequential() 41 42 print(X.shape) 43 44 model.add(Conv2D(32, (3, 3), padding = 'same', input_shape = X.shape[1:])) 45 model.add(Activation('relu')) 46 47 model.add(Conv2D(32, (3, 3))) 48 model.add(Activation('relu')) 49 model.add(MaxPooling2D(pool_size = (2, 2))) 50 model.add(Dropout(0.25)) 51 52 model.add(Conv2D(64, (3, 3), padding = 'same')) 53 model.add(Activation('relu')) 54 55 model.add(Conv2D(64, (3, 3))) 56 model.add(Activation('relu')) 57 model.add(MaxPooling2D(pool_size = (2, 2))) 58 model.add(Dropout(0.25)) 59 60 model.add(Flatten()) 61 62 model.add(Dense(512)) 63 model.add(Activation('relu')) 64 model.add(Dropout(0.5)) 65 model.add(Dense(CATEGORY_NUM)) 66 model.add(Activation('softmax')) 67 68 #モデルの可視化 69 plot_model(model, to_file='model_' + str(EPOCHS) +'.png') 70 71 #最適化処理 72 opt = keras.optimizers.rmsprop(lr = LEARNING_RATE, decay = 1e-6) 73 74 #モデル最適化の宣言 75 model.compile(loss= 'categorical_crossenttopy', optimizer = opt, metrics = ['accuracy']) 76 77 #学習 78 result = model.fit(X, Y, batch_size = BATCH_SIZE, epochs = EPOCHS, validation_data = (Xv, Yv)) 79 80 #モデルデータの保存 81 model.save('./ + out_model') 82 83 #グラフ表示 84 plt.plot(range(1, EPOCHS + 1), result.history['acc'], label = "train-acc") 85 plt.plot(range(1, EPOCHS + 1), result.history['loss'], label = "train-loss") 86 plt.plot(range(1, EPOCHS + 1), result.history['val_loss'], label = "val-loss") 87 plt.title(out_model) 88 plt.xlabel('Epochs') 89 plt.ylabel('Accuracy') 90 plt.legend() 91 plt.show() 92 93 return model 94 95if __name__ == "__main__": 96 main() 97

試したこと

・print(X.shape)と入力し、中身を確認  結果:(0,)
・try-exeptによりエラー場所の確認    結果:model_train関数内、最初のConv2d

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

・Python3.7.10 64bit
・仮想環境 anaconda3
・keras 2.4.3
・tensorflow 2.3.0
・matplotlib 3.3.4

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

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

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

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

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

jbpb0

2021/07/25 07:39 編集

> ・print(X.shape)と入力し、中身を確認  結果:(0,) 「def main():」の X_train, X_val, Y_train, Y_val = np.load(in_npy) のすぐ下に print(X_train.shape) を追加して実行したら、どうなりますか? 【追記】 複数のnumpy配列を読み込むやり方は、 > X_train, X_val, Y_train, Y_val = np.load(in_npy) と違うのでは? 参考 https://www.haya-programming.com/entry/2018/12/28/004211
keita_kkk

2021/07/25 12:15

返信ありがとうごさいます。 やってみたところ同様に(0,) となりました。
jbpb0

2021/07/25 12:31 編集

私の一つ前のコメントの最後に書いた参考Webサイトを見てください 【追記】 複数のnumpy配列を格納したファイルのファイル名の拡張子は「npy」ではなく「npz」のはずですが、「appale_rgb.npy」には何が格納されているのでしょうか?
jbpb0

2021/07/26 02:52 編集

> 複数のnumpy配列を格納したファイルのファイル名の拡張子は「npy」ではなく「npz」のはず 以前のやり方で、「npy」ファイルに複数のnumpy配列を格納する方法があったのを思い出しました 「def main():」中の X_train, X_val, Y_train, Y_val = np.load(in_npy) を、 X_train, X_val, Y_train, Y_val = np.load(in_npy, allow_pickle=True) と変えて実行したら、「X_train」とかに値が格納されませんでしょうか? https://numpy.org/doc/stable/reference/generated/numpy.load.html によると、numpyバージョン1.16.3からデフォルトが「allow_pickle=False」に変わったので、それよりも古いバージョンの頃のコードでは「allow_pickle=True」を付けてないのだと思います ただし、上記Webページの説明によると、デフォルトを変えた理由にはセキュリティもあるとのことなので、「allow_pickle=True」を付ける方法はあまり良くないのかもしれません (今回のケースは、自分で作った「npy」ファイルを読み込むのだから、セキュリティの心配はありませんが)
keita_kkk

2021/07/26 03:09 編集

npzファイルで保存した結果、 ===error=== type:<class 'ValueError'> Traceback (most recent call last): File "c:/Users/Owner/Documents/anaconda_vs/appale_project/use_cnn.py", line 30, in main X_train, X_val, Y_train, Y_val = np.load(in_npy) ValueError: not enough values to unpack (expected 4, got 1) 変化しました。どうやら数があっていないようです。
jbpb0

2021/07/26 03:11 編集

> npzファイルで保存した結果 の場合は、 https://www.haya-programming.com/entry/2018/12/28/004211 に書かれてる通りに、 data = np.load(in_npy) X_train = data["arr_0"] X_val = data["arr_1"] みたいにします (Y_train 以下も同様に、「arr_数字」の数字を順番に増やします)
keita_kkk

2021/07/26 03:19

data= np.load(in_npy) X_train = data["arr_0"] X_val = data["arr_0"] Y_train = data["arr_0"] Y_val = data["arr_0"] としてやってみたところ ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=2 と最初と同様のエラーが出ました。しかし、 found ndim=2と増えています。
jbpb0

2021/07/26 03:21 編集

> 「arr_数字」の数字を順番に増やします をやってください
keita_kkk

2021/07/26 04:37

X_train = data["arr_0"] X_val = data["arr_1"] Y_train = data["arr_2"] Y_val = data["arr_3"] と増やしてみたところ、 KeyError: 'arr_1 is not a file in the archive' となりました。
jbpb0

2021/07/26 05:17 編集

data = np.load(in_npy) print(data.files) を実行したら、正常にデータが格納されてたら ['arr_0', 'arr_1', 'arr_2', 'arr_3'] と結果表示されるはずですが、そうなりますでしょうか? > npzファイルで保存 を行なった時に、 X_train, X_val, Y_train, Y_val の4つを全部「np.savez()」のパラメータに指定していましたでしょうか? np.save("./" + out_npy, data) ↓ 変更 np.savez("./" + out_npy, X_train, X_val, Y_train, Y_val) 参考 https://note.nkmk.me/python-numpy-load-save-savez-npy-npz/ の「複数のndarrayをnpzで保存: np.savez()」
keita_kkk

2021/07/26 05:20

np.save("./" + out_npy, data) ↓ np.savez("./" + out_npy, X_train, X_val, Y_train, Y_val)としたところ 無事['arr_0', 'arr_1', 'arr_2', 'arr_3']と表示されました。 しかし、 ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=1 のままとなります。
jbpb0

2021/07/26 05:28

X_train = data["arr_0"] X_val = data["arr_1"] Y_train = data["arr_2"] Y_val = data["arr_3"] でデータを取り出したすぐ後で、 print(X_train.shape) 等を行なって、取り出した4つのデータのshapeを調べてください また、データをファイルに格納する np.savez("./" + out_npy, X_train, X_val, Y_train, Y_val) の直前(または直後)でも、同様に4つのデータのshapeを調べてください 両者は4つ全部で一致しますでしょうか? なお、データをファイルに格納するコードを実行する時と、ファイルからデータを読み込むコードを実行する時は、別のPythonプロセスで行なってください そうしないと、両者のデータが混ざってしまうかもしれません ・データをファイルに格納するコードで、shapeを確認して記録 ・Pythonを完全に落として再起動 ・データをファイルから読み込むコードで、shapeを確認して、記録したshapeと比較
keita_kkk

2021/07/26 06:04

どちらの場合も全て(0,)でした
jbpb0

2021/07/26 06:33 編集

> どちらの場合も全て(0,)でした データをファイルに格納するコードでshapeを確認して(0,)なら、ファイルに格納する方法以前の問題です np.save()かnp.savez()かは関係ありません 4つのデータがちゃんと画像から作れてませんので、その原因を見つけて直してください 【追記】 https://qiita.com/k_eita/items/a50a4cae0aa2598422e4 の「gen_data.py」の「# numpyの配列形式に変換」と書いてあるところのすぐ上に下記を追加して実行したら、どのように表示されますか? print(len(X_train)) print(len(X_val)) print(len(Y_train)) print(len(Y_val))
keita_kkk

2021/07/26 14:43

全て0となりました。
jbpb0

2021/07/26 15:14 編集

「gen_data.py」を実行したら、たとえば open_img:./faces/yui_aragaki/yui_aragaki_00001.jpg のような「open_img:」で始まる行が、用意した画像の枚数と同じ回数表示されるはずなのですが、表示されましたでしょうか?
keita_kkk

2021/07/28 00:51

特に何も表示されませんでした。
jbpb0

2021/07/28 01:40 編集

https://teratail.com/questions/350999 で、コードを追加して、カレントディレクトリに「appale_rgb.npy」があるか確認しましたよね それと同じやり方で、「gen_data.py」の image_dir = "./faces/" で指定したディレクトリがカレントディレクトリにあるか、確認してください もし無ければ、当然画像を読み込むことはできませんので、そこの矛盾を直してください なお、上記は「faces」と書いてますが、そこは質問者さんが実際に作ったディレクトリ名に読み替えてください また、 image_dir = "./faces/" で指定したディレクトリには、 category = ["yui_aragaki", "tsubasa_honda", "tomomi_itano", "maki_horikita", "kasumi_arimura"] で指定したディレクトリがあり、それらの中に画像ファイルがあり、画像ファイル名には規則があります それらが全て合ってるのが前提なので、参考Webページのそのあたりが書かれてるところを参照して、そこも合わせてください もちろん、こちらも質問者さんが作った実際のディレクトリ名やファイル名に合わせて読み替えてください 全てを正しく直せば、「gen_data.py」の実行時に「open_img:」で始まる行が、用意した画像の枚数と同じ回数表示されるはずですし、「# numpyの配列形式に変換」と書いてあるところのすぐ上に追加したコード (print(len(X_train)) 等) の結果も0にはならないはず そうならなければ、まだどこかが間違っているので、それを見つけて直してください
keita_kkk

2021/07/28 06:32

出来ました!ありがとうございます! しかし、学習時にエラーが出てしまい原因を調べていますが解消出来ず困っています。 宜しければhttps://teratail.com/questions/351646より答えていただけると幸いです。
keita_kkk

2021/07/28 06:35

2021/07/28 10:34 編集のjbpb0様のコメントを回答にしていただければ、ベストアンサーとし解決済みにしたいと思います。
guest

回答1

0

ベストアンサー

参考にしてるWebページの「gen_data.py」の先頭に

python

1import os 2print(os.listdir("./"))

を追加して実行したら、カレントディレクトリにあるファイルやディレクトリの名前が表示されますが、その中に

python

1image_dir = "./faces/"

で指定したディレクトリがあるか、確認してみてください
もし無ければ、当然画像を読み込むことはできませんので、そこの矛盾を直してください

なお、上記は「faces」と書いてますが、そこは質問者さんが実際に作ったディレクトリ名に読み替えてください

画像を読み込むことができるように矛盾が直せれば、「gen_data.py」の実行時に「open_img:」で始まる行が、用意した画像の枚数と同じ回数表示されるはずです

投稿2021/07/28 11:21

jbpb0

総合スコア7653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問