
14章 CNN:笑顔が終わらない!(後編)
はじめに
シリーズ「Python機械学習プログラミング」の紹介
本シリーズは書籍「Python機械学習プログラミング PyTorch & scikit-learn編」(初版第1刷)に関する記事を取り扱います。
この書籍のよいところは、Pythonのコードを動かしたり、アルゴリズムの説明を読み、ときに数式を確認して、包括的に機械学習を学ぶことができることです。
Pythonで機械学習を学びたい方におすすめです!
この記事では、この書籍のことを「テキスト」と呼びます。
記事の内容
この記事は「第14章 画像の分類-ディープ畳み込みニューラルネットワーク」の「14.4.3 CNN 笑顔分類器を訓練する」のモデルの訓練処理が長時間かかっていることを書きます。
後編では、Google Colabの処理の顛末を書きます。
14章のダイジェスト
14章は、CNN:畳み込みニューラルネットワークで画像を分類するタスクにチャレンジします。
PyTorchで画像データを処理する章です。
まず、特徴マップ、畳み込み層とプーリング層の計算の概念を学び、続いて、PyTorchでCNNを実装します。テーマは2つ。1つ目は手書き数字の分類タスク(おなじみのMNISTデータセット)。2つ目は写真画像から笑顔を分類するタスクです。
前編・中編のダイジェスト
「14.4.3 CNN 笑顔分類器を訓練する」の節では、20万人以上の有名人の顔データベースである「CelebAデータセット」を使って、顔画像が笑顔かどうかを判定する分類器をディープ畳み込みニューラルネットワークで作成します。
訓練する分類器の名前は「笑顔分類器」。
16,000枚の顔画像で30回(エポック)の訓練処理を始めましたが、4回の訓練に2時間かかりました。残り26回の訓練におよそ13時間を要する見込みです。笑顔の終わりが見えません!
GPUを求めてGoogle Colabで訓練を再開するも、Google環境特有のエラーに悩まされて、未だ訓練が完了に至っていません。
前編はこちらのリンクから。
中編はこちらのリンクから。
Google Colabを使ってみて
1. 画像ファイルの読み込みが途切れる
笑顔分類器の訓練コードの実行中にエラーが発生します。
3回ほど繰り返し訓練コードを実行しましたが、いずれも同じエラーが発生します。
エラー発生時には次のような画面表示になります。

OSError: [Errno 5] Input/output error: './data/celeba/img_align_celeba/012895.jpg'
画像データファイル'012895.jpg'が読み込めない、という主旨のエラーのようです。
そして、すかさず画面に次の表示が現れます。

Googleドライブがタイムアウトとなって、画像ファイルが読み込みできない事態は発生したのです。
毎回、'012895.jpg'ファイルでエラーが発生するので、読み込みファイル数の制限などがあるのでしょうか?
黄色文字の「詳細」をクリックします。
Google Colaboratory の「よくある質問」ページが開いて、次の箇所が黄色く表示されます。

多くのアイテムが含まれているフォルダ内のアイテムにアクセスすると、OSError: [Errno 5] Input/output error のようなエラーが発生することがあります。
CelebAの画像・約20万ファイルをGoogleドライブに格納していることが、エラーの主因のようです。
対処方法は・・・、見つかりません。
実は、ごくたまに、このエラーが発生しないこともあります。
ネット情報では、12時間後にGoogleドライブを再使用するとよい、などの情報がありました。
しばらくGoogleドライブを使った訓練を見合わせようと思いました。
2. 訓練の実行速度が遅い
1.のファイル読み取りエラーが発生しないケースで、笑顔分類器の訓練コードを何度か実施しました。
いずれの訓練も30分以上経っても最初の1エポックが完了しませんでした。
Google Colab の連続使用の上限は12時間と言われています。
30エポックの訓練はおそらく12時間で完了しないでしょう。
また、この程度の処理速度ではGPU非搭載のパソコンと同等であり、わざわざGoogle Colabで訓練する意味がありません。
もしかすると、超深夜時間帯などの処理速度が上がると想定される時間帯をピンポイントで狙って訓練処理をしないかぎり、笑顔分類器は完成しないかもしれないです。
このことも、しばらくGoogle ColabのGPUを使った訓練を見合わせようと思った理由です。
3. 結論
残念ですが、訓練の継続と記事の継続を断念することにします。
Google Colabでサクサク訓練できた暁には、改めて、記事を起こします。
終わり!
まとめ
今回は、Google ColabのGPUを利用して訓練することを断念する意見表明になってしまいました。
サクッとGoolge ColabとGoogleドライブを使いこなせるようになりたいです。
# 今日の一句
print('Google'.replace('G', 'C').replace('g', '').replace('e', ''))
楽しくPython機械学習プログラミングを学びましょう!
おまけ数式
noteでは数式記法を利用できます。
今回は畳み込みの出力サイズを求める床関数の式を紹介します。
入力ベクトルのサイズを$${n}$$、フィルタのサイズを$${m}$$、パディングを$${p}$$、ストライドを$${s}$$とし、$${\boldsymbol{y=x*w}}$$の結果としてられる出力のサイズ$${o}$$を次のように求めます。$${\lfloor \cdot \rfloor}$$は床関数$${floor()}$$を表します。
$$
o= \left\lfloor \cfrac{n+2p-m}{s}\right\rfloor +1
$$
おわりに
AI・機械学習の学習でおすすめの書籍を紹介いたします。
「最短コースでわかる ディープラーニングの数学」
機械学習やディープラーニングなどの手法を理解する際に、数学的な知識があると、いっそう深い理解につながると思います。
でも、難しい数式がびっしりと並んでいる書面を想像すると、なんだかゾッとします。
そんな数式にアレルギーのある方にとって、この「ディープラーニングの数学」は優しく寄り添ってくれて、「数学的」な見方を広げてくれるのではないでしょうか。
この書籍は、機械学習/深層学習の基礎的なテーマを、Pythonのコードを動かしながら、そして数学的な見解も実感しながら、楽しく学ぶことができると思います。
機械学習/深層学習の入門者にとって、次のようなトピックの理解を深くするチャンスとなるでしょう。
損失関数とその微分
活性化関数
交差エントロピー関数
誤差逆伝播
勾配降下法(最急降下法)
ちなみに、私が初めて手にした機械学習/深層学習の書籍が、このディープラーニングと数学でした。思い出深い一冊です。
サンプルコードが動かなかった時に、著者の赤石先生とTwitterでやりとりさせていただいたことは、とても嬉しい出来事でした。
今もときどき、自分の理解を整理する際に、ページを捲ります。
最後まで読んでくださり、ありがとうございました。