luggage baggage

Machine learning, data analysis, web technologies and things around me.

Albumentations で TypeError: __init__() got an unexpected keyword argument 'keypoint_params' が出る場合の対処

深層学習で画像認識系のタスクを解くとき、画像データセットに対する augmentation が重要となる場合が多いです。ランダムクロップ、フリップ、リサイズ、回転、ブラーリング等々。このような定型的な処理をする際、私は Albumentations をよく使います。

GitHub - albu/albumentations: fast image augmentation library and easy to use wrapper around other libraries
Arxiv: https://arxiv.org/pdf/1809.06839.pdf


最近 keypoint detection 系のモデルを学習させる際に使おうとしたのですが、TypeError: __init__() got an unexpected keyword argument 'keypoint_params' が出てしまいちょっと困りました。この原因は、おそらく conda 経由でのインストールをしていたことのようです。確認してみると、

In [1]: import albumentations

In [2]: albumentations.__version__
Out[2]: '0.1.8'

ということで、記事執筆時点の最新版と比べてかなり古いものでした(keypoint 対応されたのが 0.2.0)。そこでこちらを remove して改めて pip install したところ、バージョンは 0.3.0 となり問題は解消しました。

pandas.Series を使うときには index に注意しよう

Python でデータ分析をする際、pandas.DataFrame を基本的な道具として使うことは多いと思います。また、DataFrame の各カラムは pandas.Series で自然に表現されており、新しいカラムを Series として書いた上で、DataFrame に追加することもあるでしょう(DataFrame の適当なカラムに対して rolling 関数を適用して移動平均を計算した際に返ってくる Series を追加する、とか)。この時、意図した順にデータを追加するためには、index に注意しておく必要があります。

続きを読む

重複あり名前リストから、スコア順に上位N人を取得しランキングを作成する(numpy.unique)

重複を含む配列があり、各々の要素に対してスコアが付随している時、スコアの大きい順に最大 N 個のユニークな要素を取得してランキングを作成する、というのを numpy.unique を使ってやる小ネタです。

続きを読む

cv::Mat を protocol buffer に格納する (C++ で OpenCV & protobuf)

この記事では、C++ で OpenCV を使いつつ、cv::Mat に格納されたバイナリデータを protocol buffer に格納しシリアライズする方法を書いていきます。画像認識系のアルゴリズムを作る際、カメラデバイス上では C++ を使ってフレームを取得し、サーバ上の Python 機械学習アルゴリズムに対して gRPC 通信でデータを送る、みたいなシチュエーションで使った方法となります。

続きを読む

メモ:行列式の補題(matrix determinant lemma)

論文を読んでいて matrix determinant lemma の証明が思い浮かばなかったのでメモ(情けない。。)。

内容としては、適当な次元の単位行列  I と、それと同じ次元のベクトル  u, v に対して
\begin{equation}
\det(I+uv^T) = 1 + v^Tu
\end{equation}が成り立つ、というシンプルなものですが、結論、英語版 wikipedia*1 に1行の証明が書いてあり、次の恒等式に対して単に行列式をとれば終了です。

\begin{equation}
\left(\begin{array}{cc} I & 0 \\ v^T & 1 \\ \end{array} \right) \left(\begin{array}{cc} I+uv^T & u \\ 0 & 1 \\ \end{array} \right) \left(\begin{array}{cc} I & 0 \\ -v^T & 1 \\ \end{array} \right) = \left(\begin{array}{cc} I & u \\ 0 & 1+v^Tu \\ \end{array} \right)
\end{equation}左辺の1つ目と3つ目の行列は三角行列で、対角要素が全て1のため行列式を取ると消えるのですね。

PRML でも式自体は書かれているものの、著者にとっては自明なのか証明が書いてなかったり、そもそも matrix determinant lemma という名称がテクニカルタームだということにも当初気が付かず、調べるのに時間を要したので、こちらで共有しておきます。

なお、PRML 上巻の (C.14) 式は、上の式で  u A,  v B と形式的に置き換えるだけで全く同様に成り立つことが示せます。

Mac のターミナル上で docker コンテナにて作業をすると勝手に折り返されたり表示がおかしくなる現象の対処

Mac で iTerm などを使ってターミナルを開き、(SSH 経由でサーバ上の)docker コンテナをおもむろに立ち上げた際、

  • 設定されているはずの列数よりもかなり少ないところで表示が折り返されてしまい、画面上で長めのコマンドを打つのが難しくなる
  • Python コンソールを立ち上げると、本来表示されるべき行が表示されない一方で入力の受け付けはしているので、適切に作業できない

という現象を度々経験していました。

後者の例としては、こんな感じの表示がされてしまっていました。
f:id:yoshidabenjiro:20181113222913p:plain
見ると分かる通り、本来は表示されるはずの行番号や入力済みの文字が見えていません(キャプチャが適当になってしまいましたが、NameError の後には何の行も出力されていない状態です)。一方で入力自体はされており、困惑します。

とは言うものの対処は簡単にできて、画面を一度全画面化してから全画面化を解除する、もしくはその逆、と操作するだけで解消します。
f:id:yoshidabenjiro:20181113223210p:plain
これは上の画像の状態から、全画面化解除 → 通常サイズ → 再度全画面化、としたものですが、次の行を表す [2] がちゃんと表示されていますね。

TensorFlow Probability で VAE (Variational AutoEncoder): TFP 入門所感、tfp.distributions の初歩

最近になり、TensorFlow の肩に乗って確率的プログラミングをするためのライブラリ TensorFlow Probability (TFP) v0.5 がリリースされました。私は画像系タスクを TensorFlow を使って解くことが多く、特にこの記事では、画像生成系タスクに取り組むためのツールとして TFP を実際に使った際に学んだ内容について記録しておきます。

TFP に入門してみた所感

今のところのざっくりとした感触は、総じてデータサイエンティスト/アナリストではなく機械学習エンジニア向けの確率的プログラミング言語だなという感じです(ある意味当然ですが)。いくつか項目を挙げると、

  1. eight schools 的な、いわゆる確率モデリングをするのであれば、もっとこなれた他のライブラリを使ったほうが良さそう
  2. VAE (Variational AutoEncoder: 変分オートエンコーダ), Flow-based generative models などニューラルネットの構築が必要となる確率モデルを実装する上では強力なツール
  3. GPU/TPU による高速化の恩恵を受けられる点も Good(私は未検証なので論文ベースの知見)

と思いました。

1番目についていうと、やはり TensorFlow 特有のやりづらさは引き継いでいるところがあります(下の方の「ありがちなミス」欄に書きます)。個人的には2番めの項目が TFP を使う主な動機になります。Pyro という PyTorch ベースの類似ライブラリもありますが、私は TensorFlow ユーザなのでいったん放置です。3番めについては、Google Brain より論文*1が出ており、

With NUTS, we see a 100x speedup on GPUs over Stan and 37x over PyMC3

ということなので、使い方によっては速度面で大きな恩恵を得られる可能性がありそうです。

この記事では、上の2番めの項目に挙げた「ニューラルネット+確率プログラミング」をやる良い事例として、公式に提供されている VAE (Variational AutoEncoder) のサンプルコードを理解できるように、確率分布の作り方・使い方を中心として TFP の基本事項を簡単にまとめます*2。特に重要だと思った batch_shapeevent_shape はある程度厚めに解説したつもりです。VAE の実装や実際に動かした結果は次の記事に集約したいと思います。

(2018.11.14 WIP ですがいったん公開。)

続きを読む