今日の kaggle / MNIST は準備だけ

イデア

上記のようなことを考えたので, これまでの学習データ, 予測データを見直して, 精度を高める戦略を考えた.

正しい答えに対する確率と, 予測された最大の確率を調べる

これまでの予測データを使って, 正しい答えに対する確率 (青い線) と, 予測された確率 (tf.keras.Sequential.predict_proba() の出力) の最大値 (赤い線) をプロットした. データは正しい答えに対する確率で逆順にソートしている. 1 枚目は訓練データ全体 (42000 データ) をグラフにしたもの. 2 枚目は,後ろから 500 データ分のグラフである.

正しい答えと間違った答えの確率

正しい答えと間違った答えの確率(拡大)

確率が 0.5 を下回ると, 誤答が出てくる. 自信を持って間違えている (赤い線の値が大きい) 場合と, 迷っている (青い線の値と赤い線の値が同じくらい) 場合があることが分かる.

訓練データは答えが分かっているので, 正しい答えに対する確率が低い画像を識別できる. しかしテストデータは (当たり前だが) 正答が分からないので, テストデータから間違っていそうなデータだけ抽出して再予測することはできない.

対策として考えられるのは,

  • 最大の確率が例えば 0.8 以下の全ての画像に対して, 再予測する (自信を持って間違えているデータは,あきらめる)
  • 全部のテストデータに対して再予測し, 1 回目の予測結果とアンサンブル学習をする (最初の予測で正答が得られているデータの確率が低下する恐れがある)

確率の低い画像データ

ここで, 正答の確率が低いデータを見てみる. 以下は確率の低い 150 個分の画像である. 左上が確率が高いほう, 右下が確率が低いほうで, 画像の上の数字は, 左側が正しい答え, 右側が確率が最大だった答えとなっている.

確率の低い画像データ

これらの画像データで学習すれば, これらの画像データに対する正答率は向上する. しかし, もともと確率が高かった正答の画像を, 誤った結果にしてしまう危険性もある.

確率の低いデータのラベルの分布

「どんな数字の予測を間違えているのか?」を調べた. 以下は, 正答の確率の低い画像データ (低いほうから 150 個) で, ラベルごとの個数をプロット. x 軸は正答のラベル, y 軸は個数.

確率の低いデータのラベルの分布

1, 4, 7, 9 のデータで, 誤りが多い.

まとめ (次の戦略)

前述したが, 大きく 2 つのやり方が考えられる (カッコ内はデメリット)

  1. 最大の確率が例えば 0.8 以下の全ての画像に対して, 再予測する (自信を持って間違えているデータは,あきらめる)
  2. 全部のテストデータに対して再予測し, 1 回目の予測結果とアンサンブル学習をする (最初の予測で正答が得られているデータの確率が低下する恐れがある)

1 番目のやり方は, 自信を持って間違えているデータが間違えたままになってしまうので, 私としてはイマイチだ. 2 番目のやり方をベースにして, アンサンブルのやり方を工夫する (例えば, 通常のモデルから 3 回分, 確率の低いデータで学習したモデルから 2 回分の予測を出すなど, 重みづけしたアンサンブルにする, など) ことを考えようと思う.

続きは明日 (か?)

蛇足

同じことは Github にも書いてある . Markdown は本当に便利だ.

ジョギング続けてます

新型コロナウイルスの影響で人が集まるところには行きづらい。でも健康のためには体を動かしたいので,早朝にジョギングをしている。週末だけでなく,平日も在宅勤務の日は時間に余裕があるので,走っている。おかげで,昨年 (2020 年) の走った距離は年間 1600km を越え,自己ベストとなった。

年ごとの累積走行距離のグラフ

上記のグラフで赤色が今年 (2021 年) だが,今のところ昨年を上回るペースで走れていて,良い。先週には 新しいシューズ も買い,走る気満々である。

一方,課題としては,こちらも頑張りたいと考えている 献血 との両立が難しいこと。おおまかな献血のスケジュールを立てつつ,長距離やスピードを出して走りたいタイミングとずらしながら,ジョギングと献血の両立を図りたい。

本日の kaggle / MNIST の進捗 ; 0.99553

本日の成果

kaggle / MNIST の本日のスコアは 0.99553。前回の 0.99532 を微妙に上回り,順位は 上位 9.5% くらいになった。

ポイント

モデル

CNN model for kaggle / MNIST

Tensorflow のチュートリアルスクリプトをベースに,少しずつパラメータを増やしてきた。これ以上増やしても,損失関数やスコアは変わらない感じがしている。

1 層目で (7, 7) と比較的大きなフィルタを使い,大きな領域の特徴をつかむのが良い気がしている。

ImageDataGenerator

Parameters of ImageDataGenerator for kaggle / MNI…

keras.processing.image.ImageDataGenerator を使って,学習時に画像データをランダムに変形させた。過学習を防ぐという意味で,スコアに効いている感じがする。

学習率 (Learning rate) の低減

Callbacks for kaggle / MNIST

keras.callbacks.ReduceLROnPlateau を使い, val_loss が変化しなくなったら学習率を下げるようにした。ただし,学習率が 1e-4 を下回ると変化が無くなるように見えるので,下限を 5e-5 にしている。

アンサンブル学習

スクリプトは無いが,アンサンブル学習の考え方を用いて,5 回,新規にモデルを作って学習し,その結果から予測をした。 「ニューラルネットワークを使ったEnd-to-Endなアンサンブル学習 - Qiita」を参考に,ソフトとハードの両方を試したが,ソフトでスコアが向上した。実は各予測の相関係数は 0.99 を上回っていて,一般的には「効果が無い」条件であったが,それでもわずかに改善できた (たまたま?)。

今後

今のところ,次の一手を見つけられないのと,上位 10% に入れたので,ペンディングにしていた Titanic に戻ろうかと思う。

本日の Kaggle / MNIST の進捗 ; 0.99532

CNN (Convolutional Neural Network) の構造は変えずに,出力フィルタの数を倍にしただけ。先週も同じことを試していて,そのときは更新できなかったけど,今回は偶然 (?) 更新できたみたい。ただ,出力フィルタを倍にしたほうが 0.995 台を出しやすいような気もしている。

今日は上記以外に,Test Time Augumentation (参考 ; CIFAR-10でaccuracy95%--CNNで精度を上げるテクニック-- - Qiita) もトライしたが,結果的にはスコアは向上しなかった。現在,通常の Data Augumentation をやっているので,Test Time Augumentation の効果が表れてこないのかもしれない。

次はアンサンブル学習 (参考 ;ニューラルネットワークを使ったEnd-to-Endなアンサンブル学習 - Qiita) をトライしようと思っている。

以下は,本文に関係ない gist のテスト。

test of gist (public)

言葉の軽さ

昨日,緊急事態宣言が出た。が,街の人出が減ってないということで,外出自粛を求める政治家の発言が,ニュースで流れていた。

ここ数年,政治家はその場しのぎとも言える発言を繰り返してきたせいで,言葉 という自らの武器の威力を衰えさせてしまった。政治家の言葉が軽くなってしまった。緊急事態宣言が出ても人出が減らない要因の 1 つは,そんなこともあるのではないか?

もちろん,新型コロナウイルスには感染したくないので,予防はする。ただ,緊張の糸が切れそうなときに,糸が切れてしまうかどうかに対しては,政治家の言葉の重みが効いてくるのではないか?

政治家じゃない私も,日々の言動を大事にしようと思う。

緊急事態宣言が出た

緊急事態宣言が出た。飲食店へ規制は前からニュースで取り上げられていたけど,出勤者の 7 割削減や,20 時以降の外出自粛は厳しいな,と感じた。

本日 1/7 時点では対象が一都三県で,自分の居住地域ではないが,関西にも緊急事態宣言が出ると,自分の生活にも影響が出る。

2021 年・謹賀新年

2020 年振り返り

2020 年 4 月に単身で大阪に赴任となり,その数日後の緊急事態宣言。その後,5 月いっぱいは在宅勤務 (出社ゼロ) となり,6 月以降は出社率 50% くらい。年初に「今年はこれをやりたいな」と思っていた以下のようなことは,ことごとくできなかった。

  • ラソン大会参加継続。フルマラソン参加
  • 子供と一緒に通っている空手で黒帯にチャレンジ
  • 頻繁に帰省
  • などなど

一方,そんな状況だったからこそできたことも多かった。

  • 独りの時間が増えた
    • Arduino でたくさん遊んだ
    • プラバンで正多面体などたくさん作った
    • 美術館・博物館へ通った
    • 大会こそなかったが,ランニングは継続した
    • レーザカッターで木材加工した
    • 機械学習の勉強をした。kaggle にも参加した
    • 毎晩柔軟体操をしたら,ちょっとだけ柔らかくなった
  • 不要不急の外出が制限された
    • ラジオを聞きまくった (メインは FM802)。最近の流行りの曲が分かるようになった
    • 不要不急ではない という献血通いを再開した
    • 家族とはネットでコミュニケーション (ネットで将棋・オセロなど)

「やろう」と思っていたことはできなくて,そのために迷惑をかけた人もいたのだが,やりたかったことの背景にある 「新しいことへのチャレンジ」は,結果的にはできたのではないか? と思う。その点を考えれば,2020 年が完全にダメダメな 1 年だったわけではなく,それなりの 1 年だったと言える。

ちょっと話が変わるが,アイリスオーヤマシャープ がマスクを生産・販売して話題になった。これだって,計画的なものではなく,その場その場でやるべきことを考えた結果の素晴らしい行動だと思う。そういうやり方もあるのだな,と勉強になった 1 年であった。

2021 年はどうする?

上で「その場その場でやるべきことを考える」と書いたが,一方で計画を立てることも大事である。やりたいことがあり,仮に今はすぐにできなくても,やれる条件になったときにすぐにやれるように準備するためには,計画を立てる必要がある。

と言い訳をしたうえで,やりたいことを列記する。そうは言っても,ベクトルの方向性は 2020 年と同じなのが,ちょっと想像力が足りないんじゃない? という気もする。

  • ラソン継続。大会が開催されたときに フルマラソン に参加できるように準備する
  • 自宅で空手の稽古を継続。動画を見ながら,新しい型にもチャレンジ
  • 献血もやるけど,実はマラソン献血の両立が難しい。貧血にならないように,両者のスケジューリングに注意
  • kaggle 継続。賞金付きコンペに出るほどの腕ではないけど,1 つでも上位 10% に入りたい
  • 毎日ちょっとでも本を読む (Twitter で,私よりも明らかに忙しい人が,「毎日ちょっとでも本を読む」とつぶやいていたのを見たので…)

はてなブログをはじめるにあたって

Arduino のプログラム,走った距離のデータとグラフ,kaggle 向けのプログラムやデータなどを GitHub に保存しているが,文章 Markdown で書きまくっていたら,Markdown の便利さに魅了されてしまった。会社の報告書も,もう Markdown でいいんじゃない? と思えてきた。

これまで GoogleBlogspot を使ってきたが,もはや手で HTML を入力するのが面倒になってしまった。新年だし,Markdown でブログを書けるサービスを探し,今日からはてなブログを使うことにした。これも,今年から継続できれば,と思っている。