2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

一年前に作成した(失敗した)二値分類モデルのリベンジ備忘録

Posted at

本記事はSLP KBIT AdventCalendar 2022の10日目の記事になります。

記事概要

にゃんぱすー。一年前(筆者がB1のとき)のSLPサークルの活動の一部にて、人間の男女の二値分類モデルの作成に取り組んでいたのですが、当時の私は「写経」→「動いた!楽しい!」(←かわいい)というレベルで、やってることのおよそ半分も理解できていませんでした。なので今回の記事では再度勉強がてら、以前作成したモデルがうまくいかなかった原因を探って自身の成長を体感するという回です。なお、コードを載せていると冗長になるので説明したいところだけを抜粋します、ご了承ください。

旧コードの現状結果確認

まず過去に作成したコードを実行したところ以下のような結果を得られました。lossは損失関数の値、accuracyは正答率でvalはテストデータの結果を表しています。

loss accuracy val_loss val_accuracy
0.6929 0.5274 0.6936 0.4859

accuracyが約0.5と非常に意味のないモデルになっています。モデルの構成は以下の通りです。
kyuumodel.png
これを踏まえた上で精度の低さの原因を探る作戦を立てます。

以降では一年前に作成したコードと画像データを旧コード、旧データ、新規に作成するコードと画像データを新コード、新データと呼称します。
また、旧コード/旧データの結果を0番、次章で述べる作戦の「1. 2. ...」にあたる数字をそれぞれの結果の番号(n番)とします。

作戦

基本方針は対照比較の手法で検証していくのですが、過学習状態などの例外的な結果が得られる可能性が考えられるので、結果が微妙な場合は一般的に良いとされている方を優先的に採択していきます。(本来ならデータセットを使ってモデルの検証までしたかったけれど時間的制約の関係で今回はパス)
具体的な手順は以下です。

  1. 旧画像データをきれいにして0番と比較 → データの不備の有無
  2. 新たに画像データを用意して1番と比較 → データの不備の改善
  3. 新規コードを作成し新データで実行したものを2番と比較 → コードの優劣

検証

8割超えたら満点です。

1番

まず旧データから以下のような顔画像以外が切り取られたノイズ画像が多数散見されたためそれらを除去しました。
8_8.jpg

データ数は訓練データが282→280、テストデータが177→88になりました。データ数が少ないので意味はないと思いますが、検証なので一応実行したところ以下ような結果が得られました。

loss accuracy val_loss val_accuracy
0.6963 0.4737 0.6946 0.4598

1番と比較するとaccuracyは下がっていますがこれはそもそものデータ数の不足によるものだと考えられるので、とりあえず2番を実行したいと思います。

2番

学習に用いるデータ数は多ければ多いほどいいというわけでもないと思いますが、あまりにも少なかったので訓練データを3256(1628x2)、テストデータを510(255x2)に増やしました。なお訓練データは傾斜やモザイク処理などにより500枚ほど水増ししています。
このデータを使用した旧コードの結果は以下です。

loss accuracy val_loss val_accuracy
0.6892 0.5261 0.7858 0.3153

これもまたよくわからない結果になりました。別の条件で試してみるために3番にて新コードで実行します。

3番

モデルを構成するコードを変えて新データで実行します。新モデルの構成は以下の通りです。
newmodel.png
圧倒的にパラメータを増やし、dropout層などを用いることでよりパラメータが適切になるようにしました。これを利用した結果は以下の通りです。

loss accuracy val_loss val_accuracy
0.2921 0.8753 0.5512 0.7843

一気によくなりました。定かではありませんが、学習に必要なパラメータ数が足りていなかったということが推測されます。(今回はやりませんがちゃんとしたデータセットを使用して比較してみたい)
また余談ですが旧データを新コードで実行すると以下のようになりました。

loss accuracy val_loss val_accuracy
0.0345 0.9966 0.9815 0.6102

過学習状態になっていますね。逆に言えばきちんと過学習状態になっているということなので、旧モデルよりも正常に動作していると考えられます。

終わりに

目標としていた8割を超えることはできませんでしたが一年前よりは向上したのでよしとします。また欲を言えば、モデルを構成する手法を変えたり、ハイパーパラメータの調整やデータ数をもっと増やして実行するなどしてまともなモデルになるようにしたかったのですが、時間が足りなかったのでそれはまた別の機会に試したいと思います。
かなり自己満足の記事になりましたが、最後まで読んで下さりありがとうございました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?