2 月の最後に思うこと

使い古された表現だが,2 月は早かった。明日はもう 3 月か

春の気配を探しに外へ出ようとも思ったけど,緊急事態宣言で不要不急の外出は…というのが常に頭にあり,外出しても素直に楽しめない感じがしたので,遊び目的の外出はほぼ無かった。ただ,今朝のジョギングで初めて気付いたのだが,ジョギングコースを少しだけ外れたところに梅の花が咲いていた。ワンパターンの行動の中でも,変化を感じることはできたのだなと,思い知った。

関西の緊急事態宣言は,本日 2/28 で解除になる。ただ,12 月以前の生活パターンに戻ってしまうと感染者が増えるので,何かを変えないといけないと思うのだが,それが何なのかが私には分からない。関西広域連合 は 2/27 の委員会で「『関西・コロナ収束に向けて』頑張ろう宣言」を出しているが,そんなふんわりしたメッセージで感染拡大を抑えられるのか?

いずれにせよ,緊急事態宣言は解除となり,外へ出る機会は少し増える。もう 1 か月経てば 2021 年度も始まるので,何かしら視野や考えの範囲を意図的に広げていきたいと思う。

ImageDataGenerator のパラメータの最適化 (2)

はじめに

kaggle の digit-recognizer の学習時に, ImageDataGenerator を使っている. このパラメータの最適化のために, 前のブログ「ImageDataGenerator のパラメータの最適化 (1) - Diary of Masahiro SATO」では, GPyOpt を使いベイズ推定で最適なパラメータを求めようとした. しかし, 変形を小さくする方向 にパラメータが最適化されてしまい, 意図したような結果にならなかった.

そこで今回は, ランダムサーチ で最適なパラメータを求めてみる. 結果的には, 割とうまくいったと思う.

スクリプト

Parameters optimization of ImageDataGenerator usi…

44 行目からが, ランダムサーチのスクリプトである. 77 行目の while 文内で, 88 ~ 92 行目でランダムな値を設定している. 113 行目で学習し, 120 ~ 122 行目で accuracy, val_accuracy, loss, val_loss をファイルに保存し, また val_loss の最小値を取り出している. 133 ~ 139 行目でパラメータと val_loss の最小値をリストに保存. 144 行目は, while 文の開始時から duration 秒だけ経過したら break するようにしている (72 行目で duration は 7 時間にしている. これは, 8 時間経過すると kaggle のセッションが止まってしまうため)

結果

val_loss が最小になったのは, 以下の組み合わせのときだった.

パラメータ
rotation_range 11
width_shift_range 0.13
height_shift_range 0.25
shear_range 0.37
zoom_range 0.17

rotation_range, width_shift_range, zoom_range は小さめの値になったが, それ以外 (height_shift_range, shear_range) はそれなり (どれなり?) の値になったような気がする.

上記のパラメータにおける, 損失関数を下に示す. loss (右側の青色) を見ると若干, 過学習気味かもしれないが, まぁ良しとしましょう.

loss function of min val_loss

まとめ

ImageDataGenerator のパラメータの最適化をランダムサーチで行った. 結果として, 若干, 過学習気味ではあるが, 良いパラメータが得られた.

しかし「過学習気味」ということを真面目に考えると, やはり, 得られたパラメータの 3 つが小さめの値になった ということが気になる. 単に val_loss を最小にするということではなく, 損失関数の変化を見ながら val_loss の小さいパラメータの組み合わせを選択するというデリケートな作業が必要なのかもしれない.

次にやるとしたら, グリッドサーチで真面目にパラメータを振って, 損失関数を見比べながら最適なパラメータの組み合わせを探すことかな?

ImageDataGenerator のパラメータの最適化 (1)

はじめに

kaggle の digit-recognizer の学習時に, ImageDataGenerator を使っている. これは, 学習時にデータ拡張することで, 学習する画像の範囲を広げたり, その結果として過学習を防ぐことができる. 主なパラメータは, 下記の通りである. その結果, どのように変形されるかは, 画像から感じてほしい.

  • ratation_range
  • width_shift_range
  • height_shift_range
  • shear_range
  • zoom_range

https://raw.githubusercontent.com/satomshr/kaggle_mnist_cnn/main/CNN1r/05/image_data_generator.png

大きく変形させると, 過学習は防げるが, 学習そのものの精度も悪くなる可能性がある. 一方で変形が少ないと, データ拡張の効果が薄れる. そこで最適なパラメータを探索する必要が出てくる.

ここでは ベイズ推定 による最適化を試みる. 結論を先に言うと, うまくいかなかった. この後のブログでランダムサーチなどの別のやり方を試みる予定である.

スクリプト

Parameters optimization of ImageDataGenerator usi…

ベイズ推定は GPyOpt を使った. GPyOpt は kaggle のノートブックに入ってないので, 8 行目で pip でインストールしている.

50 行目の関数 image_data_generator_opt_f() が, GPyOpt で最小化する関数である. 122 行目の return を見れば分かるが, 学習の全 epoch の val_loss の最小値を返すようにしており, val_loss を最小にするパラメータを求めるようにしている.

125 行目で各パラメータの探索範囲を設定している. 注意してほしいのは, shear_range のパラメータで, このとき私は勘違いをしていて 0.1 から 0.4 という 小さい範囲 を設定している. 本来であれば, rotation_range と同じようにもっと大きな範囲を指定すべきである.

132 行目が GPyOpt の初期化 (7 回計算する), 134 行目で最適化計算 (13 回) をしている.

結果

rotation_range width_shift_range hight_shift_range shear_range zoom_range val_loss
1 19.19686431951373 0.20901088144099314 0.38405454186111176 0.23996402282257057 0.10206638888533845 0.022220429033041
2 28.816929542901924 0.39100920908804004 0.2770841119453179 0.34061018253006625 0.11146590049130006 0.023088127374649048
3 43.43410413174117 0.2834173438742231 0.27375949896818885 0.15555809611038365 0.3424101150282481 0.029848376289010048
4 17.01003601991092 0.38785226660815364 0.30289497170727797 0.2637924404969271 0.1803972318546122 0.02294338308274746
5 10.755445837282691 0.39576001559070983 0.39205077518912257 0.38281055792921836 0.396320750705659 0.028119152411818504
6 33.27088427662058 0.3605383199770277 0.13505776272360873 0.13831266468917783 0.17340673816256794 0.025382887572050095
7 49.3506844198074 0.2978424133940589 0.2990829261451698 0.14435462701646262 0.1211438599851377 0.032194338738918304
8 23.09093999418877 0.4 0.1 0.1 0.4 0.0249733105301857
9 18.550498114931145 0.1 0.1 0.4 0.4 0.02369987592101097
10 18.63230824366345 0.4 0.4 0.1 0.1 0.023234009742736816
11 18.1519017887764 0.1 0.4 0.1 0.1 0.020590541884303093
12 18.10422186453 0.1 0.4 0.1 0.1 0.021966272965073586
13 17.718261335584014 0.1 0.4 0.1 0.1 0.023602882400155067
14 18.759275901922862 0.1 0.4 0.1 0.1 0.02378304861485958
15 18.276551985644694 0.1 0.4 0.1 0.1 0.023956721648573875
16 18.742473332615006 0.1 0.4 0.4 0.1 0.022985640913248062
17 18.388879177471168 0.1 0.4 0.4 0.1 0.0249274130910635
18 19.806055360855435 0.1 0.4 0.1 0.1 0.02428913302719593
19 27.73900197039526 0.1 0.4 0.1 0.1 0.02649843692779541
20 18.01584412083525 0.4 0.1 0.1 0.1 0.021857010200619698

11 行目の val_loss が最小値になっており, そのときのパラメータは次のとおりである.

  • rotation_range ; 18.15
  • width_shift_range ; 0.1
  • height_shift_range ; 0.4
  • shear_range ; 0.1
  • zoom_range ; 0.1

width_shift_range, shear_range, zoom_range の 3 つのパラメータは, 振った範囲で最小の値となっており, データ拡張しないほうが学習結果が良い という, 当たり前な結果になってしまった. GPyOpt はきちんと仕事をしていると思うが, 結果としてはイマイチなパラメータが出てきた.

まとめ

ImageDataGenerator のパラメータの最適化をベイズ推定 (GPyOpt) で行ったところ, データ拡張の効果を小さくするほうが良いという, 当たり前な結果になってしまった. val_loss は小さくなっているかもしれないが, 過学習の懸念がある.

次は, ランダムサーチ で最適値を見つけられないか, トライする 予定である.

ノート考

はじめに

これまでに使ってきたノートを, 思い付くままに振り返る. ここでいう ノート とは勉強や仕事の内容を書いていくもののことで, スケジュール帳のようなものはちょっと横に置いておく.

中学生時代の数学のノート

中学 1 年のとき, 数学の先生から「ノートは 100 枚 (200 ページ) を使うこと」と言われた. そんな分厚いノートがあるのかと思いながら文房具屋さんへ行くと, 確かにあった. 厚さは 10mm くらい. 分厚いノートを使う理由は, 1 年間同じノートを使い続けることで, 過去に学んだことを振り返ることができるというものだった (と思う).

この先生は, 図形の勉強をするときは「無地のノートを持ってこい」と言い, そのときだけは無地のノートを使った. 大学ノートの罫線に囚われずに図形を描いたりするためだった (と思う).

仕事のノート

B5 → A4

多分, 学生時代はずっと B5 のノートを使い続けてきたと思うが, 会社に入って, あるときから A4 のノートを使いだした. A4 のほうが使い勝手が良いから, という理由ではなく, 日本仕様の B 版よりも, グローバル仕様の A 版のほうが better ではないか? と思ったからである.

罫線

私の書く字は小さいので, B 罫をずっと使ってきた. あるとき, さっきの数学の図形の話のような理由で, 無地のノートを使ったこともある. 無地だと好きなところに書くことができるというメリットはあるが, 後から見たときにちょっと見づらくて, 無地のノートは続かなかった.

その後, 5mm 方眼を使うようになった. これも中学生時代の理科の先生から「理科のノートは方眼が良い. グラフなどが書きやすいから」と言われたのが頭に残っていて, 5mm に変えた. 線や表は書きやすいが, 線や表を書く機会は実はあまりない. また高さ 5mm で文字を書くのは, 普通の人にはちょっと狭いと思う. ただ私の小さい字には割とサイズが合うので, 5mm 方眼を使い続けている.

最近, ノートを変えました

上記のような流れで, A4, 5mm 方眼のノートを使い続けてきたが, 最近, A5 の 5mm 方眼のノートに変えた. 理由はいろいろあるのだが, 在宅勤務をするようになり, 通勤時にパソコンや電源ケーブルを鞄に入れるようになると, 鞄のスペースが狭くなってきた. そんな中, A4 のノートのサイズが大き過ぎるように感じて, A5 に変えた.

A5 にすることで, 1 テーマ 1 ページという区切りで書くようになり, ちょっと見やすくなっている気がする. ただ当然ながら横幅が短くなっているので, 従来なら 1 行で書けたことが 2 行にまたがったりするのが, 少しイラっとする. すぐになれると思うけど.

コクヨMUJI も, 表紙が黒い のはなぜだろう? 名前とか書いても, 見えないのだ.

ひと月ぶりに会社やスーパー以外に行った日の日記

イントロ

気分転換に, ひと月ぶりに, 自宅, 会社, スーパー以外ということで, 昨日 2/6 に梅田に行ってきた.

献血

400ml 献血をした. 予約して行ったので, 10:20 頃に献血ルームに入り, 11:00 には献血ルームを出た. 採血時間は 5 分程度. 献血ルームの待合室も空いていて, 密を避けられた.

飲み物は, ホットレモンティーを 2 杯頂いた. 昨年の 400ml 献血時にもらった引換券で, トミカを頂いた.

2 月, 3 月はジョギングに精を出し, 4 月からは当面は成分献血で行く予定. 新型コロナウイルスのワクチン接種後に, 一定期間, 献血ができなくなるとすると, 日本全体で今以上に血液不足になる時期ができる. 私としてはうまいこと日程調整して, 献血, ジョギング, 新型コロナウイルス対策を両立させたい.

40 周年記念・ピングー展

大丸梅田 で開催中の ピングー展 へ行ってきた. 混んでたら延期しようと思ったけど, (私にとっては) 幸いにして空いていた.

クレイ・アニメーションの 1 コマ 1 コマのためにたくさんの人形や顔などが準備されており, その素朴な絵柄の裏に, 緻密な創作活動があったことを再認識した. 一方で, 顔などの決まった形に対しては型があったり, 様々な工夫もされていた.

ジュンク堂・大阪本店

少し足を延ばして ジュンク堂・大阪本店 へ. 久しぶりに, 時間に余裕のある中で, 本屋さんをブラブラ.

1 冊目, 「応仁悪童伝」(木下昌輝). 先月発売された木下昌輝の新刊であり, (多分) 初の書下ろし. 前作の「戀童夢幻」に続き, 陽の当たりにくい人の話. 少しずつ読んでいく.

2 冊目, 「デザインのひきだし」(No.42). 先週あたりから発売された本 (雑誌?) だが, ネットでは瞬殺状態. 私にとっては「ど真ん中」という話題ではないのだが, ネットで話題になってたのでミーハー的なノリと, 作り手の想いの強い本は面白いと思うので, 買ってみた.

3 冊目. 「フライパンパスタ」(若山曜子). フライパンだけでパスタを作ろうというレシピ本. 在宅勤務の昼食は麺類が多く, 特にパスタ率が高い. パスタは調理はさほど難しくないのだが, パスタを茹でる鍋と具を作るフライパンの 2 つを使うので, 調理作業が忙しく, かつ後片付けの量も多い. そこでフライパン 1 つで作れる, というのは魅力的だ.

この本は, 店内をブラブラしていて, たまたま見つけた. リアル書店のありがたさ, 面白さである.

カレー

献血終了後に阪急グランドビルの BINDU でナンとカレーを食べ, ラッシーを飲んだ. このカレーの味はともかく, 「もたっ」とした感じはどう出すのだろうと, 不思議に感じた.

大丸梅田東急ハンズ をブラブラしていたら, 印度カリー子 さんのスパイスセットを見つけたので, 購入. 近々, 作ってみる予定.

最後

御座候 のお店があったので, 赤と白を 2 個ずつ購入. 半分は昨日, 残り半分は今日のおやつ.

久しぶりに, 時間にさほど縛られずにブラブラできた. 3/7 の緊急事態宣言解除 (できる?) まで, たまには気分転換を挟みながら, また頑張ろう.

10 日ぶりに会社へ行った日の日記

先週, 10 日ぶりに会社へ行った.

10 日ぶりに最寄り駅へ行ったのだが, ガード下の居酒屋さんは, 緊急事態宣言期間の 2/7 まで休業となっていた. 酒類提供が 19 時まででは, 酒類提供がメインの居酒屋では商売にならないのだろう. お昼から食事提供 + 夜にはお酒も出しますよ, というお店は開いていた. 緊急事態宣言の影響の重さを実感した.

電車の混雑具合は, 感覚的にはあまり変わっていなかった. 学校は続いているし, 企業は在宅勤務に向けて急ブレーキを踏めていないのではないか? と感じた.

大阪府 新型コロナウイルス感染症対策サイト | 大阪府 新型コロナウイルス感染症対策サイト によれば, 大阪では 1 月以降は陽性者数が減っている. この先, 緊急事態宣言が解除されても, これまでの生活パターンに戻ってしまうと, 次の波が来るかもしれない. 生活パターンを変えないといけないのか?

在宅勤務考

先週 (2021-W04) は,月曜日が出勤,火曜日から金曜日までが在宅勤務だった。月末ということもあり,座り続けて報告書を作成したりしていたせいか,肩や腰が少し痛い。いつもは,そうならないように,1 時間ごとに立ったりしていたのだが,それを忘れてしまうと同じ姿勢が続いてしまい,体にはあまり良くない。

また淡々と作業をするときは在宅勤務だと割り込みが入らなくて良いのだが,考え事・悩み事があると独りで悶々と考えてしまい,気分転換するのが難しい。会社にいるときは,気分転換したり,そのついでに他の人の作業を覗いたり雑談したりと,気分転換ができるし,歩いているうちにいい考えが浮かぶ (or あきらめがつく) こともある。しかし自宅だと,行く場所と言ってもトイレと台所くらいで,あまり気分転換にならない。在宅勤務で考え事をするときは,特にそれが答えが見つかりにくいようなもののときは,気分が沈まないように気を付けるようにしなければ,と感じた。