TemplateDoesNotExitの解決
今日やったこと
- TemplateDoesNotExitの解決
TemplateDoesNotErrorの解決
ついに無限に続くと思っていたTemplateDoesNotExitのエラーが解決できた!!!
結論から言うと、Templatesフォルダの配置された場所が間違っていました。
原因かなと思った場所
- urls.pyに指定されたindex.htmlまでのパスが間違っている(通っていない)
- templatesフォルダのパーミッションにより読み取りが許可されていない
- エラーメッセージにあったloader.get_templateでindex.htmlがゲットできていない
- スペルミス
ひたすらここでtry&errorを繰り返していましたが、template does not exitエラーを解決するサイト【1】を眺めていた時にアプリケーション内の階層構造を見て発狂しました。
参考にした方の階層構造は以下のようになっていました。
※階層構造は簡略化して表示しています。
classaiはアプリケーション本体のディレクトリです。画面に表示する要素をまとめるtemplatesディレクトリが同じ階層に配置されていました。しかし、表示する要素を決めるviews.pyは、同じ階層にあるtemplatesフォルダから参照しています。なので以下のような階層構造にする必要があった。
アプリケーションフォルダ内に配置したことでアプリケーション画面が表示されました。
これから
推論する画像をアップロードしたあとのresult画面がkerasのバージョンエラーによって不具合を起こしているようなので、その修正から始めます。
Webアプリ開発-モデル構築編-
・・・ちょっと酔ってます。
ブログ書いている途中に寝落ちしてしまった(_ _).。o○
今日やったこと
- FlickrAPIを使った画像データの自動取得
- VGG16をファインチューニングさせた深層学習モデルの構築
- Djangoサーバを起動し実行テスト
FlickrAPIを使った画像データの自動取得
今回のWebアプリは、多クラス分類を行う。分類対象であるクラスは「grape」「blueberry」「blackberry」の3種類。それぞれの学習データは、FlickrAPIを使ってスクレイピングのような自動取得をする。参考文献【1】は、コマンド引数を1つ指定して検索ワードして検索していました。しかし、FlickrAPIによる自動取得は全く関係のない画像も取得してくる。検索対象を絞り込むため空白を用いて検索対象を絞り込みたかった。なので自分のプログラムではコマンド引数を複数にして、空白を挟んだ検索を可能にしました。ソースコードはGitHubを使えるようになったら見れるようするう。
VGG16をファインチューニングさせた深層学習モデルの構築
モデルのファインチューニングでも学習に時間がかかるので、GPUが無料で使えるGoogleColaboratoryを使用した。colaboratoryにあるtensorflow(tf)のバージョンは1.15.0なので、一旦tfをuninstallして2.0.0を再インストールした。
CNNにおける上位層は、どの画像にも同様な処理(エッジ検出など)が行われている。層が深くなるにつれ対象とする特有のパターンを検出する。よって、最終層に近い畳み込み層のパラメータだけを更新し、浅い層の共通処理は変えない。
train_dataのaccuracyは約93%,validation_dataのaccuracyは約88%となった。genratorは未使用なので精度向上は見込める。
Djangoを起動し実行テスト
ここが本当に苦労した。。。webアプリ画面(index.html)の実行結果↓
url.pyのPATHの指定も独特で、path(""...)のようにクォーテーションの中に何もないとhttp://127.0.0.1:8000/で'...'に書かれたアプリ用ディレクトリのurlpatternsにあるviews.pyにアクセスしてるっぽい。コマンド上のエラーログを見る限りviews.pyまでは通っているものの、templatesフォルダからhtmlファイルを読み出せていない様子。
サーバ起動中は、ファイルが編集されるたびに更新される仕様みたい。
わかったこと
参考サイトの記述ミスとかライブラリのバージョンに振り回されながらエラーを修正して行く過程で、Djangoのリクエストに対するアプリ内のルーティングやそれぞれのpythonファイルの役割が理解できた。
アプリの作り方は、一気に全てを完成させて動作テストや結合テストをするのではなく、早い段階から都度確認するほうがスムーズに開発が進むと感じた。
いろいろなサイトを参考にしてるうち、qiitaに開発の流れ・githubにソースコードを載せておきたいと思った。(もしかしたら誰かの参考になるかも?)
参考文献
【2】Djangoで機械学習アプリケーション ~Webアプリ作成~ - Qiita
【3】【Tensorflow・VGG16】転移学習による画像分類 - Qiita
Django・PyCharm・仮想環境(venv)
今日やったこと
- Djangoの階層ごとの役割
- PyCharmの環境構築
Django
これまでは、何かwebアプリケーションをつくるときHTML+CSS+JavaScript(もしくはPHP)で行なってきた。今までつくってきた予測モデルや深層学習モデルはpythonであるため、上記の作り方ではBrythonなどを利用しなければならなかった。
Djangoはサーバ、データベース、フロントエンドの作成を一気に行えるうえに、アプリケーションごとに仮想環境を構築してバージョンエラーにも悩まされない理想的な環境開発が行える代物だ。必要なライブラリもGUIで準備できるので、初めてでも開発が用意だといえる。
しかし、アレンジを加えるには、階層で割り振られたファイルの役割を理解して管理する必要があるだろう。
PyCharmの環境構築
Djangoで使う.pyファイルを編集するエディタは、サーブレット/JSPでの統合開発環境(名前忘れた)のようなものが最適に感じた。PyCharmはそれに合致している。環境構築は慣れれば楽だけれど、最初は仮想環境の設定やライブラリ管理はわからないことが多かった。
課題
- tensorflowやPILがインストールできない。
- tensorflowの独特なoperationノードの仕組みがわからなかった
- Dockerでパッケージ化したり、Githubで管理する方法
1つ目は、pythonのversionが3.7だとダメで3.6にダウングレードすればできそう。2つ目はこれから学んでいく。3つ目はアプリ開発ができたら!
近況
近況
今週(先週)は、試験・就職活動・料理・研究室のOBOG会など、勉強する時間はあれど日記をつける余裕がなかった(と言い訳させてください)。
先週やったこと
EDAメインのKernelを読みデータの傾向の捉え方とseabornの活用の仕方を知ることができたが、特徴量生成に関しては実際に試さないと身につかなそうだった。
また、今までnotebook形式で分析を行なったが、実際の現場ではデプロイする必要があるためスクリプトにも慣れる必要がありそう。Brythonは環境が変わるとうんともすんとも言わずストレスMaxなのでDjangoで開発をしていく。
JetsonNanoは21日に発売されるJetsonNano入門書を購入次第、冬休み期間に何かしらのデバイスを作ってみる。
これから
最終面接が年明けになりそうなので、大学の講義が終わったら実家に帰省。冬休みは毎日活動日記をつけつつ、分析だけでなく実装・デプロイにもチャレンジしていきたい。
Kaggle 【12/7】
近況
以前から興味があったDjangoを調べ、アプリ開発のための環境をDockerで構築するための勉強をしていました・・・。使いこなせるようになるにはまだまだ時間がかかりそうです(汗) また、今週はAI業界には「過学習」「PFN、ChainerからPyTorchへ移行」など大きなニュースがありました。深層学習フレームワークの利用推移がどう変わるのか気になります。
今日やったこと
- PUBG Finish Placement Predictionへの参加
- バリデーション手法 (k-分割交差検証)
- ハイパーパラメータ探索
PUBG Finish Placement Prediction
データ準備、欠損値処理、カテゴリ変数の処理、スケーリング、モデル構築、モデル評価、etc...。シンプルなテーブルコンペに必要な最低限の手法は身についたと思う。アンサンブル学習やスタッキングに手をつけるにはまだ早いので、最も重要な「EDA」と「特徴量生成」に移るため生のデータに近い、そしてデータを見るモチベーションが一番保てそうなゲームに関するコンペに参加しました。(PUBGは未経験ですが)
また、予測値を0から1に収めなければいけないということもこのコンペの大きな特徴だといえます。
k-分割交差検証
バリデーションは今まで「train_test_split」を使っていましたが、これだけでは過学習により汎化性能が上がりません。そこで訓練データをあらかじめ決めておいた数のレコードに分割する。各レコードを必ず1度だけ検証データとし、他のレコードを訓練データとすることで、モデルの汎化性能をあげることができます。図で見るとすぐ理解しやすい。
また、分類タスクでは目的変数がまとまっていることが原因でモデルの学習がうまくいかないことがあり、その対策法もすることができました。その場合、交差検証を行う際、ただシャッフルするだけでなく、目的変数の比率を同程度にして検証を行う「層化k分割交差検証」という方法で解決できるようです。
ハイパーパラメータ探索
モデルのパラメータをあらかじめ複数設定し、最も精度の高いパラメータを保持する"グリッドサーチ"。ランダムにパラメータを設定し、最良なパラメータを探す"ランダムサーチ"。PUBGコンペで初めて使ってみましたが、欲が深すぎてパラメータを設定しすぎた結果、メモリが足りず強制終了してしまいました。かなりの時間を使ってしまいましたが、kaggleのメモリ制限やパラメータ設定の優先度など、実感できたことも多くあったので良しとします。
困ったこと
- 欠損値の見落とし
- TerminatedWorkerError(GridSearchCVの記述ミス)
- kernelの計算リソース
とりあえず必要な処理を施してモデルを構築すると「このデータには欠損値、もしくは無限大のデータがあります。」のようなエラーが出ました。いつものようにデータ全体(train+test)から欠損値の有無を確認しましたが、どのカラムもFalseになっていたので、欠損値はないものだと思い込んで他の原因を探っていました。しかし、原因は欠損値でした。目的変数を除いたうえで欠損値を確認していたため、目的変数の欠損値を見落としていました...。
また、グリッドサーチやバリーデーションのため計算量が膨大になったことで、メモリが圧迫され「The kernel appears to have died. It will restart automatically.」と、途中で強制終了したり、放っておいたらPCが落ちていて計算が中断されていたりするなど何時間も費やしてしまいました。メモリの節約方法などもあるようなので、新たな課題もたくさん見つかりました。
感想
いろいろなことにかなりの時間を費やしてしまいましたが、得られたこともありました。すんなりと簡単なモデルを作り提出できることが分かったので、次は先人たちのkernelを参考に「EDA」を深く知っていきたいと思います!!