Blogは株式会社BuySellTechnologiesのエンジニア達が知見・発見を共有する技術ブログです。nmu0テクノロジー開発部の村上です。現在はアーキテクチャ周りを担当しています。弊社で社内向けにお酒判定iOSアプリを作成したので、そこで使った技術を3回に渡って紹介したいと思います。iOSで使える形に変換CoreMLモデルをSwiftのPlaygroundで検証してみるお酒画像は公開されていないので、今回はその代わりに犬猫判定器を作ろうと思います。お気づきの方もいるかと思いますが、これは私がfast.aiで勉強して、その教材として犬猫判定が使われているからです。fast.aiは理論面も実際の現場での応用面も押さえて説明しているので、これから勉強する人には非常にオススメです。興味がない人は飛ばしてしまって大丈夫ですが、何か参考になればと思います。今回の開発の要件として、以下の3つがありました。開発期間は一人で約一ヶ月そこで、以下のように対処しました。Hub、RxSwift、Eurekaなどはそのうち紹介する機会があるかもしれません。巷ではGoogleのTensorflowが有名ですが、今回はFacebookが中心に開発しているPytorchを使いました。逆に言うとまだプロダクションではあまりPytorchは使われていませんしかし利点1の弊害として、学習ループを自分でforループで書かないといけません。そこで今回はPytorchを使いやすいインターフェースでラップしたskorchを使用します。(バージョンは0.3です)skorchはインターフェースをscikit-learnと揃えているので、scikit-learnを使ってきた人は特に楽だと思います。learning)という手法を使います。自前のデータだけでは画像が足りないので、既存の画像で学習したモデルが公開されていてそれを使うことで画像の不足を補います。解きたい問題が異なるので、そのモデルの一部を再学習して自分の問題に合わせるのが転送学習です。平たくいうと、人間が未知の物体でも色や輪郭を掴めるように、画像から物体の特徴を理解するような普遍的な部分は問題が違っても流用出来るということです。ダウンロードしてください。dogscats/trainを見ると、dogディレクトリとcatディレクトリが含まれています。Pytorchのdataloaderは、dog/1.jpg、dog/2.jpg、cat/1.jpg、cat/2.jpgのようにラベルごとにディレクトリが分かれていると、自動的にアルファベット順に、catは0、dogは1とラベリングして、それぞれに対応付けて画像を読み込んでくれます。画像ロード時に画像を加工することも出来ます。後述するモデルではImageNetという画像データセットで事前に学習されたモデルを使うので、そのモデルの作成時の作法に合わせて以下の加工が必要です。augmentationと呼ばれる、データを人工的に増やす手法です。微妙に角度を変えたり、左右を反転させたりして、データを増やしています。ポイントとしては、実際にありえそうな変換に抑えることです。天井に張り付いた猫の写真はめったにないと思うので、上下反転はかえって精度が落ちます。今回はvgg16というモデルの学習済みのものを使用します。Pytorchのvisionライブラリに色々なモデルが用意されているので、他のモデルでも大丈夫です。https://pytorch.org/docs/stable/torchvision/models.htmlvgg16は、CNN部分とFCN部分とに分かれています。モデルを出力すると、それぞれfeaturesとclassifiersと表されています。流れとしては、features部分はそのまま使うように学習をオフにするclassifiers部分の最後の層を置き換えて、犬猫の2値分類に変えるSoftmax層を一番最後に追加Skorchのインターフェースに合わせるためで、Pytorchなら不要ですモデルをprintして構造を確認しながら行うと良いと思います。基本的にはskorchのチュートリアル通りです。validデータを使って、一番lossが小さいモデルを得られるようにしています。注意点は、train_split=predefined_split(image_datasets['valid'])部分です。validデータを明示的に与えています。skorchでは、labelデータと画像データを別々に与えている場合、自動的にtrainとvalidを分けてくれます。今回はPytorchのImageFolderを使っているのでその機能が使えませんし、trainとvalidを自前で持っています。よってpredefined_splitというメソッドを使って対処しているということです。y=None)fitを叩くと、以下のような結果が順次更新されていきます。このようにわかりやすく表示されるのがskorchを使う利点の一つです。Checkpointの引数でvalid_loss_bestを指定しているので、valid_lossが最も小さいepochのモデルが保存されます。最後に、実際に作成したモデルの精度をtestデータでチェックしてみます。classifierを初期化して、上で学習したデータをロードしています。predict_probaやpredictは、人によってはscikit-learnでお馴染みのメソッドかなと思います。13:44バイセルテクノロジーズではエンジニアを募集しています!興味がありましたら以下のリンクからご応募ください。上で実行する高速エンハンス開発を可能にするテスト手法フルスクラッチで開発。マイクロサービスについてSpinnakerをTLS(SSL)対応させる月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。