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

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

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

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

Q&A

解決済

1回答

2885閲覧

2クラス分類での精度について

omeko24

総合スコア13

Python

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

0グッド

1クリップ

投稿2018/11/02 07:12

編集2018/11/02 07:26

機械学習を勉強しているのですが学習精度が上がらず学習ができていないように思えます。
画像データ数の少なさが原因でしょうか?
今現在訓練用に1クラス100枚程度検証用に40枚程度です。
githubの2クラス分類のコードを実行しました。

import os from keras.models import Sequential from keras.layers import Convolution2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras.preprocessing.image import ImageDataGenerator nb_epoch = 50 result_dir = 'results' if not os.path.exists(result_dir): os.mkdir(result_dir) def save_history(history, result_file): loss = history.history['loss'] acc = history.history['acc'] val_loss = history.history['val_loss'] val_acc = history.history['val_acc'] nb_epoch = len(acc) with open(result_file, "w") as fp: fp.write("epoch\tloss\tacc\tval_loss\tval_acc\n") for i in range(nb_epoch): fp.write("%d\t%f\t%f\t%f\t%f\n" % (i, loss[i], acc[i], val_loss[i], val_acc[i])) if __name__ == '__main__': # モデルを構築 model = Sequential() model.add(Convolution2D(32, 3, 3, input_shape=(150, 150, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(32, 3, 3)) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Convolution2D(64, 3, 3)) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(64)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 訓練データとバリデーションデータを生成するジェネレータを作成 train_datagen = ImageDataGenerator( rescale=1.0 / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1.0 / 255) train_generator = train_datagen.flow_from_directory( 'data/train', target_size=(150, 150), batch_size=32, class_mode='binary') validation_generator = test_datagen.flow_from_directory( 'data/validation', target_size=(150, 150), batch_size=32, class_mode='binary') # 訓練 history = model.fit_generator( train_generator, samples_per_epoch=2000, nb_epoch=nb_epoch, validation_data=validation_generator, nb_val_samples=800) # 結果を保存 model.save_weights(os.path.join(result_dir, 'smallcnn.h5')) save_history(history, os.path.join(result_dir, 'history_smallcnn.txt'))

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

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

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

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

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

hayataka2049

2018/11/02 07:14

質問文の再編集画面を開き、<code>ボタンで挿入できるコードブロックの中にコードを入れてください
hayataka2049

2018/11/02 07:17

あと、もう少し何かありませんか? 対象画像の性質とか、loss・accuracy vs epochのグラフがあると多少判断しやすいです。また、現状だと丸投げの質問と判断されても仕方ないので、試行錯誤してみたこととかあったら書くと良いです。
omeko24

2018/11/02 07:31

画像は自分で集めた犬猫画像でやっています
guest

回答1

0

ベストアンサー

epoch29 loss0.112849 acc0.960774 val_loss2.466711 val_acc0.603604

訓練データの精度が 0.960774 なので、収束はしています。
しかし、バリデーションデータの精度が 0.603604 なので、汎化性能が出ていません。

今現在訓練用に1クラス100枚程度検証用に40枚程度です。
画像は自分で集めた犬猫画像でやっています

犬猫はいろいろな品種がいますし、100枚しかデータがないようですと、汎化性能を出すのは難しいです。
Deep Learning の CNN で画像分類を行う場合、フルスクラッチ学習 (1から学習すること) では少なくとも数千枚 ~ 数万枚が必要です。
学習済みの重みを使う転移学習を用いれば、必要なデータ量を減らせますが、それでも100枚では厳しいと思います。

自分で集めるのが面倒であれば、Kaggle Cats and Dogs Dataset のような公開されてる犬猫のデータセットを使ってはどうでしょうか?こちらには犬猫の画像がそれぞれ1万枚以上あります。


上記データセットを使った犬猫の分類を学習するサンプルコードが過去の質問にあるので、参考にしてください。
Deep Learningの画像の2クラス分類をしたい

投稿2018/11/02 09:42

tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問