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

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

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

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

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Q&A

解決済

1回答

2046閲覧

損失関数と正解率からの考察

namako_46

総合スコア13

Keras

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

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

1グッド

1クリップ

投稿2019/12/22 14:03

編集2019/12/22 15:23

ミニバッチ学習法で2クラスの画像分類を行いました。実行結果からグラフ(このグラフが妥当なものかはわからないですが…)を作ってみました。
正解率データはあまり差はありませんでしたが、増幅した場合(下)損失関数が非常に高くなりました。これは過学習が起きたということでしょうか。

イメージ説明

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 keras 6import numpy as np 7 8classes = ["kouroenkawa","kuroguchi"] 9num_classes = len(classes) 10image_width = 50 11image_height = 50 12 13#メインの関数を定義する 14def main(): 15 X_train, X_test, y_train, y_test = np.load("./orido.npy", allow_pickle=True) 16 X_train = X_train.astype("float") / 256 17 X_test = X_test.astype("float") / 256 18 y_train = np_utils.to_categorical(y_train,num_classes) 19 y_test = np_utils.to_categorical(y_test, num_classes) 20 21 model = model_train(X_train, y_train) 22 model_eval(model, X_test, y_test) 23 24def model_train(X, y): 25 model = Sequential() 26 model.add(Convolution2D(32,(3,3),padding='same', input_shape=X.shape[1:])) 27 model.add(Activation('relu')) 28 model.add(Convolution2D(32,(3,3))) 29 model.add(Activation('relu')) 30 model.add(MaxPooling2D(pool_size=(2,2))) 31 model.add(Dropout(0.25)) 32 33 model.add(Convolution2D(64,(3,3),padding='same')) 34 model.add(Activation('relu')) 35 model.add(Convolution2D(64,(3,3))) 36 model.add(Activation('relu')) 37 model.add(MaxPooling2D(pool_size=(2,2))) 38 model.add(Dropout(0.25)) 39 40 model.add(Flatten()) 41 model.add(Dense(512)) 42 model.add(Activation('relu')) 43 model.add(Dropout(0.5)) 44 model.add(Dense(2)) 45 model.add(Activation('softmax')) 46 47 opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6) 48 49 model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy']) 50 51 model.fit(X, y, batch_size=32, nb_epoch=100) 52 53 #モデルの保存 54 model.save('./orido_cnn.h5') 55 56 return model 57 58def model_eval(model, X, y): 59 scores = model.evaluate(X, y, verbose=1) 60 print('test Loss: ', scores[0]) 61 print('test Accuracy: ', scores[1]) 62 63if __name__ == "__main__": 64 main() 65
退会済みユーザー👍を押しています

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

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

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

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

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

hayataka2049

2019/12/22 14:10

グラフが掲載できていないようなので、再編集して載せてみてください。
namako_46

2019/12/22 14:22

軸のラベルを忘れていました。 X軸はバッチサイズです。
hayataka2049

2019/12/22 14:31 編集

それぞれどうやって計算しているのか(訓練データなのかテストデータなのか)、増幅のやり方などは追記しておくと回答しやすいかと思います。あとloss functionの種類とかも。
namako_46

2019/12/22 15:17

申し訳ありません。初心者の自分が口で説明するより画像でお見せした方が早いと思い、添付しようとしたのですが、なかなかうまくいかなかったので、コードを貼り付けました。 結果はtest lossと表示していたので、テストデータです。増幅は、-20°から20°を5°ずつの回転と反転をやりました。
hayataka2049

2019/12/22 15:20

コードならコードブロック内に入れておいてください。(<code>ボタンで挿入可能)
guest

回答1

0

ベストアンサー

まず、正解率が下がらない割に損失関数が上がったということは、微妙な判定になるものが増えたということを表しています。予測確率(出力層の出力)が[0.99, 0.01]ではなくて[0.6, 0.4]とかになっているということです。

2クラス分類でサンプル数が均等とすれば、チャンスレベル(ランダムに予測して0.5の確率で当たる場合)のロスは1.39くらいになるでしょうか(交差エントロピーの式から逆算可能です)。今回のデータだと、増幅ありのときの数字は1.1を切るくらいなので、予測確率は[0.6, 0.4]くらいに近いかと思います(exp(-0.55)くらいのはずなので)。それでargmaxした正解率では0.9当てているということですね。

以上は雑に逆算しているだけなので憶測に近いですが、それぞれで幾つかのデータに対してpredictしたときの予測値を見てみると裏付けが取れます。


解釈なんですが、

まずテストデータに増幅したデータが入っているのかどうかを考える必要があります。入っている場合は、予測が困難なものが増えたということなので、それの分だけロスが上がる可能性があります。

次に、テストデータに増幅したデータが入っている場合にも入っていない場合にも言えることですが、増幅した結果あまり役立たないような(本来予測したいデータとはあまりにも性質が違う)データが増えて、そういうデータにも適合した結果として本来予測したいデータに対しては過小適合になっているという可能性もあります。

定性的にはそういうことが起こり得るのですが、実際はそれだけで解釈するのは難しいです。とりあえず方向性としては過小適合だと思うので、その方向で対処すると良いと思います(よく見るlossとval_lossのグラフを描いてみてください)。


冷めた見方をすれば、一番関心があるのはテストデータ正解率のはずで、増幅の有無に関わらずだいたい0.9なので増幅は不要というか役に立っていない、という感じになると思います。あるいはエポック数を増やしたり、オプティマイザをいじったり、バッチサイズをいじったり、モデルを改良したりすることで効いてくるけど、今の条件では役に立っていない、とか。

投稿2019/12/22 17:19

hayataka2049

総合スコア30933

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

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

namako_46

2019/12/22 18:25

なるほど!納得しました。 丁寧なご説明大変恐縮です。 学習モデルの可視化したグラフ作ってみたいと思ったのですが、正直自分のにどう当てはめてコードを書けば良いか分かりませんでした…。 挿入させていただいたコードに手を加えて、ターミナルで実行すると自動的にグラフを作ってくれるという認識でよろしいでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問