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

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

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

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

機械学習

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

Python

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

Q&A

解決済

1回答

6130閲覧

kerasで学習モデルを作成したいがエラーが発生してしまう。

genosuke

総合スコア12

Keras

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2019/12/06 05:46

前提・実現したいこと

人物画のリアルタイム顔検出をしたいため、モナリザの学習モデルの作成をしようと以下のプログラムを実行したところ、

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージにそのまま解決方法が書かれておりますし、過去に同じような質問もあります。

投稿2019/12/06 12:25

fiveHundred

総合スコア9797

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

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

genosuke

2019/12/06 16:05

ご回答ありがとうございます。 過去の質問通りにloss='categorical_crossentropy',の部分を loss=='sparse_categorical_crossentropy'に変更するとValueErrorは出なくなりましたが、また別のエラーで、 tensorflow.python.framework.errors_impl.InvalidArgumentError: Received a label value of 1 which is outside the valid range of [0, 1). Label values: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 [[node loss/activation_9_loss/sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (defined at C:\Users\Taisei\Anaconda3\envs\opencv\lib\site-packages\tensorflow_core\python\framework\ops.py:1751) ]] [Op:__inference_keras_scratch_graph_2819] Function call stack: keras_scratch_graph と表示されてしまい学習が進まないです。 もし解決策がお分かりでしたらご回答お願いいただけないでしょうか。。 何度も申し訳ございません。
fiveHundred

2019/12/07 00:43

「=」は1つで十分(質問者が間違えたのだと思う)ですが、そのようにしておりますか?
fiveHundred

2019/12/07 00:58

…と思ったけれど、categoriesが1種類(nb_classesが1)しかないですね。 categorical_crossentropyやsparse_categorical_crossentropyは「複数のクラスのうちどれなのか」というときに使うものなので、以下のようにする必要があります。 - 2つ以上のクラスにする(例:「人間である」「そうでない」、「人物Aである」「人物Bである」など) - 1つの出力値だけが必要なのであれば、最後のActivationを'softmax'から他のもの(例:'sigmoid')にし、lossも変更する(例:'binary_crossentropy') (そもそも、モナリザの画像だけでは学習できない気がしますがどうなのでしょう)
genosuke

2019/12/07 05:04

ご回答ありがとうございます。 Activationとlossを教えていただいた通りに変更すると無事学習させることができました! 本当にありがとうございます!! せっかくなので2つ以上のクラスにした場合も試したいと思います。 ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問