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

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

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

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

機械学習

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

1回答

4823閲覧

機械学習の学習において、最初から精度が100%、損失関数の値がほぼ0になってしまいます。そして、何回目のエポックでもその値が変わりません

maronn20

総合スコア11

Keras

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

機械学習

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

2クリップ

投稿2020/10/08 00:47

編集2020/10/08 08:58

前提・実現したいこと

KerasのCNNで、顔認識AIを作って見た〜スクレイピングからモデルまで〜を参考にして顔認識のシステムを作成しようとしています。
参考サイトをもとにコードを書き、実行したらエラーは出ずに画像の収集、顔の切り出し、画像の水増し、学習が開始しました。
しかし、いざ学習の結果を見るとどのエポックでも「loss: 0.0000e+00 - accuracy: 1.0000 - val_loss: 0.0000e+00 - val_accuracy: 1.0000」となってしましまいます。
精度が100%になるのはおかしいと思いますし、画像の枚数が違うとはいえ参考サイトの精度は最大81%だったことを考えるとやはり何かがおかしいと感じました。
ただ、何がおかしいのかが機械学習初心者なため分かりませんでした。
バッチサイズが画像の枚数に比べて大きすぎるのかと思い変更しましたが上手く行きませんでした。
水増し画像などを見てもおかしいと思うことはなかったので、学習モデルに原因があると考えていますが、実際何が問題かは分かりません。
原因をご教授いただけると幸いです。
よろしくお願いいたします。

発生している問題

#どのエポックでも結果がこのままになってしまう loss: 0.0000e+00 - accuracy: 1.0000 - val_loss: 0.0000e+00 - val_accuracy: 1.0000

該当のソースコード

python

1#参考にしたサイトとほぼコードは同じです。 2#データのラベル付け、モデルの構築・学習・評価のコードはバッチサイズ以外変更しておりません 3 4from keras.utils.np_utils import to_categorical 5from keras.layers import Activation, Conv2D, Dense, Flatten, MaxPooling2D 6from keras.models import Sequential,Model 7import matplotlib.pyplot as plt 8import os 9import shutil 10import random 11import glob 12from scipy import ndimage 13import cv2 14import numpy as np 15from pykakasi import kakasi 16 17kakasi = kakasi() # Generate kakasi instance 18# 日本語をローマ字にする処理 19def exchange_word(text): 20 kakasi.setMode("H", "a") # Hiragana to ascii 21 kakasi.setMode("K", "a") # Katakana to ascii 22 kakasi.setMode("J", "a") # Japanese(kanji) to ascii 23 conv = kakasi.getConverter() 24 result = conv.do(text) 25 return result 26 27 28# 顔認識する対象を決定(検索ワードを入力) 29SearchName = ["石原さとみ"] 30# 画像の取得枚数の上限 31ImgNumber =600 32# CNNで学習するときの画像のサイズを設定(サイズが大きいと学習に時間がかかる) 33ImgSize=(250,250) 34input_shape=(250,250,3) 35 36for j in range(len(SearchName)): 37 SearchName[j] = exchange_word(SearchName[j]) 38 39# 教師データのラベル付け 40X_train = [] 41Y_train = [] 42for i in range(len(SearchName)): 43 img_file_name_list=os.listdir("./FaceEdited/"+SearchName[i]) 44 print("{}:トレーニング用の写真の数は{}枚です。".format(SearchName[i],len(img_file_name_list))) 45 46 for j in range(0,len(img_file_name_list)-1): 47 n=os.path.join("./FaceEdited/"+SearchName[i]+"/",img_file_name_list[j]) 48 img = cv2.imread(n) 49 if img is None: 50 print('image' + str(j) + ':NoImage') 51 continue 52 else: 53 r,g,b = cv2.split(img) 54 img = cv2.merge([r,g,b]) 55 X_train.append(img) 56 Y_train.append(i) 57 58print("") 59 60# テストデータのラベル付け 61X_test = [] # 画像データ読み込み 62Y_test = [] # ラベル(名前) 63for i in range(len(SearchName)): 64 img_file_name_list=os.listdir("./test/"+SearchName[i]) 65 print("{}:テスト用の写真の数は{}枚です。".format(SearchName[i],len(img_file_name_list))) 66 for j in range(0,len(img_file_name_list)-1): 67 n=os.path.join("./test/"+SearchName[i]+"/",img_file_name_list[j]) 68 img = cv2.imread(n) 69 if img is None: 70 print('image' + str(j) + ':NoImage') 71 continue 72 else: 73 r,g,b = cv2.split(img) 74 img = cv2.merge([r,g,b]) 75 X_test.append(img) 76 Y_test.append(i) 77 78X_train=np.array(X_train) 79X_test=np.array(X_test) 80y_train = to_categorical(Y_train) 81y_test = to_categorical(Y_test) 82 83 84 85 86 87# モデルの定義 88model = Sequential() 89model.add(Conv2D(input_shape=input_shape, filters=32,kernel_size=(3, 3), 90 strides=(1, 1), padding="same")) 91model.add(MaxPooling2D(pool_size=(2, 2))) 92model.add(Conv2D(filters=32, kernel_size=(3, 3), 93 strides=(1, 1), padding="same")) 94model.add(MaxPooling2D(pool_size=(2, 2))) 95model.add(Conv2D(filters=32, kernel_size=(3, 3), 96 strides=(1, 1), padding="same")) 97model.add(MaxPooling2D(pool_size=(2, 2))) 98model.add(Flatten()) 99model.add(Dense(256)) 100model.add(Activation("sigmoid")) 101model.add(Dense(128)) 102model.add(Activation('sigmoid')) 103# 分類したい人数を入れる 104model.add(Dense(len(SearchName))) 105model.add(Activation('softmax')) 106 107# コンパイル 108model.compile(optimizer='sgd', 109 loss='categorical_crossentropy', 110 metrics=['accuracy']) 111 112 113# 学習 114history = model.fit(X_train, y_train, batch_size=12, 115 epochs=25, verbose=1, validation_data=(X_test, y_test)) 116 117 118 119 120# 汎化制度の評価・表示 121score = model.evaluate(X_test, y_test, batch_size=6, verbose=0) 122print('validation loss:{0[0]}\nvalidation accuracy:{0[1]}'.format(score)) 123 124print(history.history["accuracy"]) 125#acc, val_accのプロット 126plt.plot(history.history["accuracy"], label="acc", ls="-", marker="o") 127plt.plot(history.history["val_accuracy"], label="val_acc", ls="-", marker="x") 128plt.ylabel("accuracy") 129plt.xlabel("epoch") 130plt.legend(loc="best") 131plt.show() 132 133#モデルを保存 134model.save("MyModel.h5")

試したこと

バッチサイズの変更。
学習させる画像がちゃんと人の顔を示しているかのチェック

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

トレーニング用画像の枚数:598枚
テスト用画像の枚数:149枚

windows10 home(64bit)
python 3.7.3
Keras 2.4.3
Keras-Preprocessing 1.1.2

Visual Studio Code内のターミナルで実行

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

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

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

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

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

meg_

2020/10/08 01:24

他の画像でテストしてみるとどうなりますか?(他の人物とか動物とか)
maronn20

2020/10/08 04:46

コメントありがとうございます。 すみません。 再度学習させようとしたらValueError: Negative dimension size caused by subtracting 2 from 1 for '{{node max_pooling2d_1/MaxPool}} = MaxPool[T=DT_FLOAT, data_format="NCHW", ksize=[1, 1, 2, 2], padding="VALID", strides=[1, 1, 2, 2]](conv2d_1/BiasAdd)' with input shapes: [?,32,125,1]. というエラーが出てしまい、そもそも学習出来なくなってしまいました。 学習モデルに関する部分は全くいじっていないので、どうしてよいか分からない状態です・・・。
maronn20

2020/10/08 06:54

エラー直りました。 なので、トレーニング用の画像はそのままにテスト用の画像を別人の顔にしました。 ですが、やはり結果は同じで loss: 0.0000e+00 - accuracy: 1.0000 - val_loss: 0.0000e+00 - val_accuracy: 1.0000 となってしましまいました。
meg_

2020/10/08 07:36

それは訓練ですよね?そうではなくて新たな画像で推定したら、訓練後のモデルでちゃんと判定できているかを確かめてみては?と思ったのです。
maronn20

2020/10/08 08:57 編集

勘違いしてました。 失礼いたしました。 早速犬の画像(https://aiacademy.jp/dataset/dog1.jpg)を使い下記のコードで一致具合を試したところ100という数値が出て、学習させた画像と100%一致する結果になってしましまいました。 犬と人間の顔は全く違うはずなので、やはり適切な学習ができていませんでした。 どうしたら良いのかアドバイスいただけると幸いです。 よろしくお願いいたします。 from keras.models import load_model from keras.preprocessing import image import numpy as np from PIL import Image vgg_model = load_model('MyModel.h5') img_width, img_height = 250, 250 # 画像を読み込んで予測する def img_predict(filename): # 画像を読み込んで4次元テンソルへ変換 img = image.load_img(filename, target_size=(img_height, img_width)) x = image.img_to_array(img) x = np.expand_dims(x, 0) #画像の人物を予測 pred = vgg_model.predict(x)[0] #結果を表示する print(pred*100) img_predict("dog1.jpg")
meg_

2020/10/08 10:53

参考サイトでは「女優4人」に分類しています。質問のコードでは一人の名前しかありませんが、実際のデータは何人かいるのでしょうか?
maronn20

2020/10/08 11:29

データ自体は一人のデータしか集めていません。 4人のうち最も類似している確率が高い人の判定ではなく、一人に対してどのくらいの割合で一致するのかで十分なので、一人にしています。
meg_

2020/10/08 11:44

一人であれば分類する必要がそもそもありません。一人の人で学習すれば”常にその人である”との回答(推定)しか返ってこないのでは?
maronn20

2020/10/08 11:47

「loss: 0.0000e+00 - accuracy: 1.0000 - val_loss: 0.0000e+00 - val_accuracy: 1.0000」が起きなくなりました! 人数についてご指摘いただいたので、種類を2人にしてみたら徐々に精度が上がっていくようになりました。 理由はまだ理解しきれていませんが原因が分かり上手く行ったので嬉しいです。 何度もご対応いただき誠にありがとうございます!
maronn20

2020/10/08 11:53

ご指摘の通りです。 出力が一つしかないのに、分類もくそもありませんね・・・。 理由も納得できました。 ありがとうございます。 大変お世話になったので、ベストアンサーを付与したいです。。 適当な文字を回答に表記していただけないでしょうか? よろしくお願いいたします。
guest

回答1

0

ベストアンサー

分類問題であるのにデータが一種類しかないため過学習(この場合そう呼んで良いのか分かりませんが)しています。そのため、どんな画像を与えても同じ回答(=訓練した女優である)しか得られません。

投稿2020/10/08 12:07

meg_

総合スコア10767

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問