🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
機械学習

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

Python

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

Q&A

解決済

1回答

7660閲覧

lossがマイナスになる

nyanryou

総合スコア20

機械学習

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

Python

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

0グッド

1クリップ

投稿2021/02/18 11:44

編集2021/02/20 06:35

tensorflowのチュートリアルで犬と猫を学習させるプログラムがあったので、それを書き換えて自分と妹を学習させようと思ったのですが、学習するたびにlossの値がマイナスになります。以下が実行したプログラムと結果とtensorflowのチュートリアルのURLです。
ほぼチュートリアル、マルパクリでファイルの場所だけ変更しました。
犬、猫で実行した場合lossがマイナスになることはないのですが、自分と妹の顔切り取り写真ではlossがマイナスになります。

顔切り取りした画像を明度を変更したり傾けたりして水増しし、5000枚くらいまでふやしました。また、画像の大きさは統一にしなければならないと思っていたので、顔の画像を200×200に統一しました。

まだ、tensorflowを触り始めたばかりということもあり、何をどういう動作をしているのか、どう調べればよいのかよくわかっていません。
投げやりの質問になったしまったのですが、本当にどうすればよいのかわからないため、ご教授お願い致します。

行ったこと

画像のサイズが200×200にしたため、おかしいデータになったのかのとおもい、IMG_HEIGHT = 200,IMG_WIDTH = 200に変更しました。
が、結果は変わりませんでした。
そもそも、IMG_HEIGHTが何を示しているのかも調べてみましたがよくわかりませんでした。

tensorflowのチュートリアル

python

1import tensorflow as tf 2from tensorflow.keras.models import Sequential 3from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D 4from tensorflow.keras.preprocessing.image import ImageDataGenerator 5 6import os 7import numpy as np 8import matplotlib.pyplot as plt 9 10PATH = 'C:/GraduationResearch/annotation/data' 11 12train_dir = os.path.join(PATH, 'train') 13validation_dir = os.path.join(PATH, 'validation') 14 15train_me_dir = os.path.join(train_dir, 'me') 16train_sister2_dir = os.path.join(train_dir, 'sister2') 17validation_me_dir = os.path.join(validation_dir, 'me') 18validation_sister2_dir = os.path.join(validation_dir, 'sister2') 19 20num_me_tr = len(os.listdir(train_me_dir)) 21num_sister2_tr = len(os.listdir(train_sister2_dir)) 22 23num_me_val = len(os.listdir(validation_me_dir)) 24num_sister2_val = len(os.listdir(validation_sister2_dir)) 25# num_father_val = len(os.listdir(validation_father_dir)) 26 27total_train = num_me_tr + num_sister2_tr 28total_val = num_me_val + num_sister2_val 29 30print(total_train) 31print(total_val) 32 33batch_size = 128 34epochs = 1 35IMG_HEIGHT = 150 36IMG_WIDTH = 150 37 38train_image_generator = ImageDataGenerator(rescale=1./255) 39validation_image_generator = ImageDataGenerator(rescale=1./255) 40print(train_image_generator) 41print(validation_image_generator) 42print("-------------------------------") 43 44 45train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size, 46 directory=train_dir, 47 shuffle=True, 48 target_size=(IMG_HEIGHT, IMG_WIDTH), 49 class_mode='binary') 50 51val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size, 52 directory=validation_dir, 53 target_size=(IMG_HEIGHT, IMG_WIDTH), 54 class_mode='binary') 55 56sample_training_images, _ = next(train_data_gen) 57 58def plotImages(images_arr): 59 fig, axes = plt.subplots(1, 5, figsize=(20,20)) 60 axes = axes.flatten() 61 for img, ax in zip( images_arr, axes): 62 ax.imshow(img) 63 ax.axis('off') 64 plt.tight_layout() 65 plt.show() 66 67model = Sequential([ 68 Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)), 69 MaxPooling2D(), 70 Conv2D(32, 3, padding='same', activation='relu'), 71 MaxPooling2D(), 72 Conv2D(64, 3, padding='same', activation='relu'), 73 MaxPooling2D(), 74 Flatten(), 75 Dense(512, activation='relu'), 76 Dense(1, activation='sigmoid') 77]) 78 79model.compile(optimizer='adam', 80 loss='binary_crossentropy', 81 metrics=['accuracy']) 82 83history = model.fit_generator( 84 train_data_gen, 85 steps_per_epoch=total_train // batch_size, 86 epochs=epochs, 87 validation_data=val_data_gen, 88 validation_steps=total_val // batch_size 89) 90 91acc = history.history['accuracy'] 92val_acc = history.history['val_accuracy'] 93 94loss = history.history['loss'] 95val_loss = history.history['val_loss'] 96 97epochs_range = range(epochs) 98 99plt.figure(figsize=(8, 8)) 100plt.subplot(1, 2, 1) 101plt.plot(epochs_range, acc, label='Training Accuracy') 102plt.plot(epochs_range, val_acc, label='Validation Accuracy') 103plt.legend(loc='lower right') 104plt.title('Training and Validation Accuracy') 105 106plt.subplot(1, 2, 2) 107plt.plot(epochs_range, loss, label='Training Loss') 108plt.plot(epochs_range, val_loss, label='Validation Loss') 109plt.legend(loc='upper right') 110plt.title('Training and Validation Loss') 111plt.show() 112 113model.save('catdig.h5')

![イメージ説明

解決法

dataファイルの中にme,sister2,fatherの3つが存在したため、labelが0,1,2と増えた。その結果、lossがマイナスになった。
me,sister2で学習させた場合0<loss<1の間に収まった。
多分学習できていると思う。

イメージ説明

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

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

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

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

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

miyabi_takatsuk

2021/02/18 12:10

質問タグに、Pythonと機械学習、画像解析などを入れた方がいいかと。 質問は編集できますので
nyanryou

2021/02/18 12:23

アドバイスありがとうございます!!
toast-uz

2021/02/19 23:43

事象としては正解ラベルに0〜1以外のものが入っているということですが、データ作成に間違いはなさそうなので、謎ですね。
guest

回答1

0

ベストアンサー

binary_crossentropyのlossがマイナスになるのは、モデルの出力またはラベルに0〜1以外の値が含まれている時です。モデルの出力にはsigmoidが入っていますので、ラベルの方に問題があると思います。

おそらくですが、画像ディレクトリに、犬猫など他のサブフォルダが含まれているままなのでないでしょうか?3つ以上のサブディレクトリがあると、flow_from_directoryclass_mode='binary'としていても、エラーにならずに、2以上のラベルがジェネレートされるようです(動かして確認しました)。

なお以下のコードを実行すると、どのようなラベルになっているか、具体的にわかります。

Python

1images, labels = next(train_data_gen) 2print(labels)

上記の推測が的中していた場合、サブディレクトリを2つだけにするか、classes=['me', 'sister2']というオプションを加えて明示的にサブディレクトリを指定するか、で問題解消すると思います。

なお、元のイメージサイズは揃えなくてよいです。target_sizeオプションで自動的に揃ったサイズに変換してくれますので。もちろん、アスペクト比が違いすぎる画像が混在すると、変換後が歪むので、学習効率が悪くなってしまいますが。

投稿2021/02/20 00:19

編集2021/02/20 00:28
toast-uz

総合スコア3266

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

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

nyanryou

2021/02/20 06:21

詳しく教えていただきありがとうございます!! dataファイルの中にme,sister2,fatherを入れていたのが原因でした。 labelも犬猫は0,1でしたが、me,sister2,fatherだと0,1,2が含まれていました。ファイルでラベル付けしているとはわかりませんでした。大変勉強になりました。 また、予想的中すごすぎです…。 fatherのファイルを消し学習してみたところlossがマイナスになることなく学習が出来ました! target_sizeのオプションも知らなかったので本当に助かりました!! ありがとうございます!
nyanryou

2021/02/20 06:30

すみません。何点かお聞きしたいことがあるのですがよろしいでしょうか… ・どの部分でファイルにラベル付けをしているのか ・今回はme,sister2で学習が成功しました。しかし、me,sister2,fatherの3つを学習させる場合どうすればよいのか。train_me_dir,train_sister_dir,train_father_dirのようにfatherファイルも指定されるように変更しましたが、labelが0,1,2となるせいか、やはりマイナスになります。複数ファイルでの学習がどこなのか知りたいです。 ・関係ないのですが、最近機械学習の勉強をしているのですが、どのように学んだのですか?解説などを見ても理解ができなくてわからない状態のままになってしまいます…。 お手数でなければご教授いただけたら幸いです。
toast-uz

2021/02/20 07:03

今回の例では、flow_from_directoryというメソッドが自動的にサブディレクトリをもとにラベルに変換しています。また3つのサブディレクトリを学習させるには、多クラス分類問題にする必要があります。 https://qiita.com/Phoeboooo/items/cfe8560fe8a285855340 など参考になると思います。 機械学習を学ぶには、現実に解きたい問題を解くのが一番です。まさに、今回の問題を多クラス分類になおしてみるのもその1つです。示したリンクのコードはやや古いので、それをコピペするのではなく参考にとどめて、今回のコードを自分で変更して多クラス分類に変えてみましょう。変更した部分の意味をよく確認しながら進めるとよいと思います。そういう一歩一歩で、機械学習がわかるようになります。勉強していけば、例えば、GANという手法を使ってあなたの顔写真に別の人の表情(笑い顔とか)を合成する、といったこともできますよ。興味にままにいろいろ試してみてください。
nyanryou

2021/02/20 07:30

返信ありがとうございます! 多クラス分類がんばってみます! 何でも少しずつ理解ですよね… ありがとうございました。大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問