Bengali.AIの解説をYoutubeでやってみました
皆さんこんにちは
お元気ですか。動画編集処理スキルがなさすぎて非常に困惑しております。
さて少し前のコンペティションになりますが、Bengali.AIのコンペティションの解説をYoutubeでやってみました。
※Bengali.AIのコンペのページはこちらです。
コロナで集まって反省会するのも難しいご時世ですので、このYoutubeの流れに乗ってみるのもありかなと思ってはじめてみました。
堅苦しく集まって見るよりも、なにかの暇つぶしのお供ぐらいで見てもらえればと思います。
Bengaliはベンガル語の手書き文字画像から3種からなるベンガル語の構成要素を当てるコンペです。
ベンガル語は3つの構成要素から成り立ち、組み合わせで文字が完成します。
学習には存在しない文字があり、工夫しがいのあるコンペだったように思えます。(おかげで、Shake upが激しいコンペの一つになりました)
SlideshareとYoutubeは次の通りです。
気が向いたら他のコンペもやりますので、要望があればぜひ、教えて下さい。(小麦は多分、やります。Tweet?知らない子ですね)
では。また、お会いしましょう。
CMakeを使ってビルドのみしている人のためのCMake入門
皆さんこんにちは
お元気ですか。ついに自宅のパスタがなくなりそうです。
さて、本日のテーマはcmakeです。
大半の人のcmake、実はこんな感じなのではないでしょうか。
- インストール時にお世話になる(おまじない)けど、何もわからない(文字通り)
- 仮に見たとしても何をやっているのかわからない。
私もある程度、これらに該当する人なわけです。
しかし、このおまじない系はまると長時間はまってとても困るといった問題がありました。
ということで改めてcmakeをきちんと勉強しておこうと思った次第です。
CMake
CMakeが何かはWikipediaにも書いてあります。
CMakeはコンパイラに依存しないビルド自動化のためのフリーソフトウェアであり、様々なオペレーティングシステムで動作させることができる。CMakeは階層化ディレクトリや複数のライブラリを利用するアプリケーションをサポートするよう設計されている。
環境によってもコンパイル方法(g++/clangなど)が異なるため、それぞれで設定を書く必要があります。
また、C++特有の依存関係を記述していくのは大変です。
それらを一括してCMakeは管理してくれます。
CMakeを使ってC++のコンパイルを行ってみる。
構成の準備
次のサイトのサンプルを参考にします。
derekmolloy.ie
helloworld.cpp/CMakeList.txtは同じディレクトリに配置してください。
1. helloworld.cpp
#include<iostream> int main(int argc, char *argv[]){ std::cout << "Hello World!" << std::endl; return 0; }
プログラムはただの「Hello World!」出力用のプログラムです。
2. CMakeLists.txt
cmake_minimum_required(VERSION 2.8.9) project (hello) add_executable(hello helloworld.cpp)
cmake_minimum_requiredはcmakeの最低要求のバージョン
projectはプロジェクト名を示します。(挙動には関係ありません。)
今回の場合、add_executableはhelloworld.cppからhelloのファイルを作ります。
CMakeを試す
試してみましょう、次のコマンドで実行します。
mkdir build && cd build cmake ..
buildディレクトリ作成もおまじないのようにさらっと記述されています。
これは、cmakeした結果のファイルが生成されるので、それ用です。
構成管理ツールでの管理を考えた時に、buildディレクトリを無視すればよいだけなので、管理しやすそうです。
cmakeが完了するとCMakeCache.txtなど、様々なファイルが生成されます。
これらはmakeを使う時に必要なファイル群です。
最後にmakeを実行すれば、実行ファイルの生成がされます。
後は実行ファイルをそのまま実行できます。
その他CMakeについて
CMakeでよく利用されるOption
特によく利用されるOptionは-Dです。
cmakeで環境を示す変数を指定しますが、-D Optionを付与することで、それよりも優先させることができます。
複数の環境を利用していると、デフォルトよりも特定の環境を指定したいこともあります。
その場合に-D Optionを利用して強制的に書き換えることもあります。
どんな変数が設定できるのかは「cmake .. -L」を実行すれば、確認可能です。
CMakeで作成されるMakefileのコマンド
CMakeで作成されるMakefileでよく利用されるコマンドをここでは紹介します
CMakeで作られたMakefileのおまじないの一種として「make -j8」やら「make install」といったコマンドがあります。
「make」では、ソースコードのビルドが行われます。殆どの場合はC++のコンパイルですね。
また、「make install」を行うことで、規定のディレクトリに配置されます。これによって外部からでも呼び出し可能になります。
途中までのビルド結果を消したい場合は「make clean」を利用すれば良いでしょう。
ちなみに、よく使うOption「make -j」は並列数を指定できます。許せる限りのCPUコア数を数値として入れると良いでしょう。
ただし、コア数に対してジョブが多すぎると逆効果になるため、慎重に。(一度メモリ不足か何かで誤ってえらい目にあったことがあります)
最後に
おまじない(※僕だけかもしれない)を真面目に解説してみました。
一度はまったときにあれっと思うので、このようなことを勉強しておくのも時には必要でしょう。
その場合にぜひ、見てほしいと思います。
NGBoostを使ってみた
皆さんこんにちは。
お元気ですか。自粛ムードはまだまだ続きそうですね。
本日は少し前の発表された勾配ブースティングの手法NGBoostを紹介しようと思います。
NGBoostについて
NGBoostとは?
NGBoostは予測の不確実性をも推定する勾配ブースティングのアルゴリズムです。
従来までは、例えば温度を推定する場合、30度しか出ませんでした。
しかし、このNGBoostでは、どの程度30度らしいかも推定できます。
Kaggleよりも業務でフォールバックの機能として使えるので、便利で使い方の幅も感じるところです。
インストール
他のライブラリ同様、pipコマンド一発でインストールできます。
pip install https://github.com/stanfordmlgroup/ngboost.git
使い方
分類
from ngboost import NGBClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error from ngboost.distns import k_categorical X, Y = load_iris(True) X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2) ngb = NGBClassifier(Dist=k_categorical(3)).fit(X_train, Y_train) Y_preds = ngb.predict(X_test) Y_dists = ngb.pred_dist(X_test)
Distの引数にk_categoricalを与える必要があります。
このk_categorialには、分類数と同じ値を与えることが必要です。
Y_distsで各クラスの確率値を獲得できます。
回帰
from ngboost import NGBRegressor from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error X, Y = load_boston(True) X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2) ngb = NGBRegressor().fit(X_train, Y_train) Y_preds = ngb.predict(X_test) Y_dists = ngb.pred_dist(X_test) # test Mean Squared Error test_MSE = mean_squared_error(Y_preds, Y_test) print('Test MSE', test_MSE) # test Negative Log Likelihood test_NLL = -Y_dists.logpdf(Y_test).mean() print('Test NLL', test_NLL)
こちらもサンプル通りです。
NGBRegressorには特に引数を与えなくとも、実行ができます。
分類と同様、pred_distメソッドにより分布を計算できます。
最後に
NGBoostをとりあえず使ってみました。
ただ、使ったばかりもあり、性能や精度の比較はまだ検討できていないです。
そのため、有用であればコンペでも使いたいと思っています。
Pythonの環境を管理・再現する
皆さんこんにちは
お元気ですか。3月末というのに、雪積もっていてすごかったです。
さて、本日はPythonでの環境の管理方法を紹介します。
今まではAnacondaを利用しており、それを利用してimport/exportする方法もあります。
これに加えて最近はPipenvも増えたようでもあり、それら紹介をします。
なぜ、環境の管理をする必要があるのか?
誰もが同じ環境を再現し、環境による問題を起こさないためです。
仕事やOSSで複数人でのプロジェクトで環境を統一しないと、依存ライブラリのバージョンによる問題が発生することもあります。
そのため、環境を統一することは非常に重要です。
環境構築の方法
本章では、大きく分けて3つの方法を紹介します。
1. requirement.txt
2. Anacondaの仮想環境
3. Pipenv
requirement.txt
古来からある方式であるrequirement.txtです。
未だにライブラリでも多く採用されている方式の一つです。
requeirement.txtはライブラリの名前が一覧で書いており、それを読み込むことで必要なライブラリをインストールできます。
requirement.txtの作り方は次の通りです。
pip freeze > requirement.txt
読み込み方は次の通りです。
pip install -r requirement.txt
この方法ですが、pipコマンドが実行できれば、実行可能なのがメリットです。
AnacondaやPipenvでもpipが利用できるので使えます。
ただ、Pythonのバージョンは管理できていないので、そこは一つネックになるポイントです。
Anacondaの仮想環境
Anacondaを用いて、仮想環境を作成できます。
基本的な利用方法は次の通りです。
nonbiri-tereka.hatenablog.com
Anacondaによる仮想環境の構築は次のコマンドで作成可能です。
conda create -n py38 python=3.8
その仮想環境の情報を出力するには次のコマンドを実行します。
conda env export > condatest.yml
出力されたファイルを読み込む方法は次の通りです。
conda env create -n py38_re -f condatest.yml
仮想環境ごと環境構築ができるのでPythonのバージョンも管理できるのが強みです。
ただし、Anacondaそのものをインストールせねばならず、ディスクの容量も必要とする点がネックでしょうか。
Pipenv
Pipenvが最近は利用されるようになっています。
まずは、pipenvをインストールします。
pip install pipenv
次にpipenvを利用した環境構築を行います。
pipenv --python 3.7 # python3.7での環境構築 pipenv install numpy scipy matplotlib
逆にPipenvの環境を取り込み、構築する場合は次の通りです。
Pipfileがあるディレクトリで、次のコマンドを入力します。
pipenv install
pipenvは導入までの時間が非常に早く、手軽に構築できるのが良い点だと感じました。
正直どれが一番なのか
どれも一長一短ですが、Pipenvが楽そうです。
Anacondaだとそのインストール自体も必要になり、導入コストが非常に高いと感じています。
また、requirement.txtのみだと、同一PC内での複数環境での管理が難しくなるので、避けたほうが良いと思っています。
最後に
これらそれぞれに利点欠点もあるため、ケースバイケースで考慮すべきでしょう。
このあたりは使いながら検討する必要があると感じています。
PyTorchで高精度・高性能のEfficientNetを利用する
皆さんこんにちは
お元気でしょうか。
本日はEfficientNetをPyTorchで利用します。
私も頻繁に利用しますが、時々忘れてしまうのでメモ
EfficnetNetについて
EfficientNetとは?
幅、深さや解像度に関係性を導き出されたニューラルネットワークのアーキテクチャ。
SoTAを出したが、従来より8.4倍小さく、6.1倍の高速化を実現しています。
EfficientB0-B7(今はそれ以上もあった気もしますが)まで存在し、精度・性能により使い分けできます。
Kagglerたちは最近このニューラルネットワークをソリューションに利用するようになりました。(ResNetより増えている気がする)
arxiv.org
EfficientNet-Pytorchの使い方
モデルの初期化方法
モデルの初期化方法は学習済モデルの有無により、変わります。
学習済モデルがないバージョン
model = EfficientNet.from_name("efficientnet-b5")
学習済モデルを利用するバージョン
model = EfficientNet. from_pretrained("efficientnet-b5")
Fine-turning
ImageNetと同じクラスの問題を解く要望はほぼ皆無だと思います。
学習済のモデルを元にfineturningを行いましょう。
基本的には最終層を変更するのみなので、私は次のようにモデルを構築して学習を行っています。
n_class = 100 model = EfficientNet. from_pretrained("efficientnet-b5") model._fc = nn.Linear(2048, n_class)
後は通常通りモデルを学習すれば良いです。
最後に
EfficientNetは精度も高く性能もそれなりに良いです。
PNASNetなどよりも圧倒的に利用しやすい感じがしているのでResNetなどとのアンサンブルに有効です。