前提・実現したいこと
人物画のリアルタイム顔検出をしたいため、モナリザの学習モデルの作成をしようと以下のプログラムを実行したところ、
ValueError: You are passing a target array of shape (765, 1) while using as loss categorical_crossentropy
. categorical_crossentropy
expects targets to be binary matrices (1s and 0s) of shape (samples, classes). If your targets are integer classes, you can convert them to the expected format via:
from keras.utils import to_categorical
y_binary = to_categorical(y_int)
Alternatively, you can use the loss function sparse_categorical_crossentropy
instead, which does expect integer targets.
とこのようなエラーメッセージが表示され、学習が進まない状況です。
原因がわかる方どこに問題があるのか教えていただけると助かります。
発生している問題・エラーメッセージ
Using TensorFlow backend. (32, 32, 3) gakusyu.py:32: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(16, (3, 3), input_shape=(32, 32, 3..., padding="same")` model.add(Convolution2D(16, 3, 3, border_mode="same", input_shape=in_shape)) 2019-12-06 14:14:10.771488: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 gakusyu.py:36: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(16, (3, 3), padding="same")` model.add(Convolution2D(16, 3, 3, border_mode="same")) gakusyu.py:46: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(32, (3, 3), padding="same")` model.add(Convolution2D(32, 3, 3, border_mode="same")) gakusyu.py:50: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(32, (3, 3), padding="same")` model.add(Convolution2D(32, 3, 3, border_mode="same")) gakusyu.py:58: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(64, (3, 3), padding="same")` model.add(Convolution2D(64, 3, 3, border_mode="same")) gakusyu.py:62: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(64, (3, 3), padding="same")` model.add(Convolution2D(64, 3, 3, border_mode="same")) gakusyu.py:72: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(128, (3, 3), padding="same")` model.add(Convolution2D(128, 3, 3, border_mode="same")) gakusyu.py:105: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`. model.fit(X, y, batch_size=50, nb_epoch=100) Traceback (most recent call last): File "gakusyu.py", line 124, in <module> main() File "gakusyu.py", line 22, in main model = model_train(X_train, y_train) File "gakusyu.py", line 105, in model_train model.fit(X, y, batch_size=50, nb_epoch=100) File "C:\Users\Taisei\Anaconda3\envs\opencv\lib\site-packages\keras\engine\training.py", line 1154, in fit batch_size=batch_size) File "C:\Users\Taisei\Anaconda3\envs\opencv\lib\site-packages\keras\engine\training.py", line 642, in _standardize_user_data y, self._feed_loss_fns, feed_output_shapes) File "C:\Users\Taisei\Anaconda3\envs\opencv\lib\site-packages\keras\engine\training_utils.py", line 284, in check_loss_and_target_compatibility ' while using as loss `categorical_crossentropy`. ' ValueError: You are passing a target array of shape (765, 1) while using as loss `categorical_crossentropy`. `categorical_crossentropy` expects targets to be binary matrices (1s and 0s) of shape (samples, classes). If your targets are integer classes, you can convert them to the expected format via: from keras.utils import to_categorical y_binary = to_categorical(y_int) Alternatively, you can use the loss function `sparse_categorical_crossentropy` instead, which does expect integer targets.
該当のソースコード
Python
1from keras.models import Sequential 2from keras.layers import Convolution2D, MaxPooling2D 3from keras.layers import Activation, Dropout, Flatten, Dense 4from keras.utils import np_utils 5import numpy as np 6 7# 分類対象のカテゴリ 8root_dir = "C:\python code" 9categories = ["output"] 10nb_classes = len(categories) 11#image_size = 50 12 13# データをロード --- (※1) 14def main(): 15 X_train, X_test, y_train, y_test = np.load("monariza.npy") 16 # データを正規化する 17 X_train = X_train.astype("float") / 256 18 X_test = X_test.astype("float") / 256 19 y_train = np_utils.to_categorical(y_train, nb_classes) 20 y_test = np_utils.to_categorical(y_test, nb_classes) 21 # モデルを訓練し評価する 22 model = model_train(X_train, y_train) 23 model_eval(model, X_test, y_test) 24 25# モデルを構築 --- (※2) 26def build_model(in_shape): 27 model = Sequential() 28 29 print(in_shape) 30 #畳み込み層の作成 31 #1層目の追加 1024個の層を最初に作り、フィルター3*3のフィルターを16個作成 32 model.add(Convolution2D(16, 3, 3, border_mode="same", input_shape=in_shape)) 33 model.add(Activation("relu")) 34 35 #2層目の畳み込み層 36 model.add(Convolution2D(16, 3, 3, border_mode="same")) 37 model.add(Activation("relu")) 38 39 #プーリング層 40 model.add(MaxPooling2D()) 41 42 #Dropoutとは過学習を防ぐためのもの 0.5は次のニューロンへのパスをランダムに半分にするという意味 43 model.add(Dropout(0.5)) 44 45 #3層目の作成 46 model.add(Convolution2D(32, 3, 3, border_mode="same")) 47 model.add(Activation("relu")) 48 49 #4層目の作成 50 model.add(Convolution2D(32, 3, 3, border_mode="same")) 51 model.add(Activation("relu")) 52 53 #プーリング層 54 model.add(MaxPooling2D()) 55 model.add(Dropout(0.5)) 56 57 #5層目 58 model.add(Convolution2D(64, 3, 3, border_mode="same")) 59 model.add(Activation("relu")) 60 61 #6層目 62 model.add(Convolution2D(64, 3, 3, border_mode="same")) 63 model.add(Activation("relu")) 64 65 #プーリング層 66 model.add(MaxPooling2D()) 67 68 #Dropout 69 model.add(Dropout(0.5)) 70 71 #7層目 72 model.add(Convolution2D(128, 3, 3, border_mode="same")) 73 model.add(Activation("relu")) 74 75 #Dropout 76 model.add(Dropout(0.5)) 77 78 #平坦化 79 model.add(Flatten()) 80 81 #8層目 全結合層 FC 82 model.add(Dense(100)) 83 model.add(Activation("relu")) 84 85 #Dropout 86 model.add(Dropout(0.5)) 87 88 #8層目 引数nub_classesとは分類の数を定義する。 89 model.add(Dense(nb_classes)) 90 model.add(Activation('softmax')) 91 92 #ここまででモデルの層完成 93 94 #lossは損失関数を定義するところ 95 model.compile(loss="categorical_crossentropy", 96 metrics = ["accuracy"], 97 optimizer = "adam" 98 ) 99 return model 100 101 102# モデルを訓練する --- (※3) 103def model_train(X, y): 104 model = build_model(X.shape[1:]) 105 model.fit(X, y, batch_size=50, nb_epoch=100) 106 107 #学習モデルの保存 108 json_string = model.to_json() 109 #モデルのファイル名 拡張子.json 110 open('C:\python code\monariza2.json', 'w').write(json_string) 111 112 # モデルを保存する --- (※4) 113 hdf5_file = "C:\python code\monariza-model.hdf5" 114 model.save_weights(hdf5_file) 115 return model 116 117# モデルを評価する --- (※5) 118def model_eval(model, X, y): 119 score = model.evaluate(X, y) 120 print('loss=', score[0]) 121 print('accuracy=', score[1]) 122 123if __name__ == "__main__": 124 main()
試したこと
インターネットで解決策を探しましたが見つかりませんでした。
補足情報(FW/ツールのバージョンなど)
ソースコードや手順はすべてこちらのサイトから参考にさせていただいてます。
https://ai-coordinator.jp/face-recognition#i-6
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/06 16:05
2019/12/07 00:43
2019/12/07 00:58
2019/12/07 05:04