Deep Learning for Time Series No.2
2020年初投稿です。
コロナで殆どの就活が止まり、推薦で進んでいた某JTBCは落ち、 泣きっ面にJASSMな中の人です。
お祈りメールを受ける30分前に前回の Deep Learning for Time Series No. 1 にスターがついたって通知が来て、こんな事やってたなって思い出したので、ちまちま書いていきます。
今回のお題は、CNNを使ってセンサーデータを分類するタスク。
準備
前回と同じく、SensorDatasetCollection の中に入ってるUCR HARデータセットを使います。 インストールは以下のようにして下さい。
続きを読むDeep Learning for Time Series - No. 1
Deep Learning for Time Series
いつものようにネットの海を漂っていたら、Deep Learningで自然言語以外の時系列データやりたいけどサンプルなさすぎて何から手を出したらいいのか分からない的な投稿を見かけたので、自分の知見を書いていくシリーズ。
今回は多変量時系列データ相手にDeep な Learning をする回
準備
自分が今年の前半ごろにかけて書いてたライブラリで SensorDatasetCollection ってのがあります。途中で論文の実装とか色々忙しくなって放ったらかしになってるやつです。(Contribution Welcome!)
とりあえずコイツをAnaconda等で仮想環境を作ってインストールしておいて下さい。Google Colab だったら、
!git clone https://github.com/KawashimaHirotaka/SensorDatasetCollection.git
%cd SensorDatasetCollection/
pip install .
として下さい。
ノートブック環境でないのなら、
git clone https://github.com/KawashimaHirotaka/SensorDatasetCollection.git
cd SensorDatasetCollection/
pip install .
あとは、PyTorch と NumPy が入ってれば問題ありません。
RNNでやる
とりあえず、時系列データってことでRNNが真っ先に浮かぶと思います。これの利点は最初から時系列データを入力に想定している点です。 ただ問題点もあって、長い系列データを学習するのが苦手です(seq_len = 300以降くらいから怪しくなってくる気がする)。 これが原因で、NLP界隈はCNNやTransfomer系が幅をきかせているのは周知の通りだと思います。(最近始まったKaggleのTensorFlow 2.0 Question Answering のスタータノートがBERTっての怖い)
だからと言って説明を省く訳にもいかないのでズラズラ書いていきます。
使うデータ
ここでは、Sensor Dataset Collection の中に入っている UCI HAR Dataset ってやつを使います。詳しくは元のページの説明を見て頂いて。簡単に説明すると30名の被験者にスマホを持ってもらって6種類の活動を行ってもらうって実験内容です。そして処理はは固定長Sliding Windowです。ちなみに、センサの数は2つの加速度センサと1つのジャイロですので9次元の多変量時系列データとなっています。
ここでの目的は、 与えられた部分時系列から対応するラベルを予測する分類問題 を解くことです。
では早速やっていきましょう。
ネットワークの構造は次の通りで、一層のLSTMと一層の全結合層で構成されています。 分類はRNNの出力の最後の時刻の特徴を全結合層に渡しています。
class Network(nn.Module): def __init__(self, in_size, hidden_size, n_class): super(Network, self).__init__() self.rnn = nn.LSTM(in_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, n_class) def forward(self, x): out, state = self.rnn(x) out = self.fc(out[:, -1, :]) return out
ちなみにニューラルネット への入力は [batch, seq_len, features] の3次元配列が時系列では基本です。 後半はただの分類問題のコードなので説明は不要ですね。
次回は、CNNで時系列やる予定。
Comet.ml with PyTorch
室屋さんが優勝し、Matt Hallが初の総合優勝をして15年の歴史を閉じたRedBull AirRaceを見てきた。 腕を焦がしながら撮影した写真のRaw現像が全然終わる気配がしないので、気分転換に久々に記事を書こうと思う。
今回のお題は Comet.ml www.comet.ml
Comet.ml
自分の所属している研究室は一応機械学習を専門にしていることもあり 自分の趣味ついでに様々な開発環境・実験管理サービス等々を色々手を出して遊んでみたりしている。
今まで、TensorBoard や Visdom をいじったり、 MLflow も触ったりもした。
ただ、自分の開発環境として、
- 手元のMacBook Proでモデルを実装
- GCPなどのクラウドサービス or 研究室のGCPマシンにコードを転送・学習・評価
- パラメータを変更して処理を繰り返す
が基本でクラウドで回しながら研究室でも回したりと様々な環境で同時並行で行うことが結構あるため、 ログの管理が面倒くさかったりする。そこで、見つけたのが Comet.ml で非常に良いサービスだったので紹介しようと思う。
Pricing
機械学習界隈のGitHubを目指すサービスで、一昔前のGitHubのように 無料版だと プライベートなプロジェクトを作れず、様々な制約がある。 そして、有料版が半端なく高い。 (一人につき$39/月 〜)
大口顧客(?)には CERN*1 や Google がいる。
ただ、学生や研究者であれば$179/月のサービスを無料で使うことが出来る!!
という事で、この優しさを全身に受けながら布教をしていきたいと思う。
続きを読むHello, Jetson Nano
日頃の行いが良いせいか、それとも教授からの雑な扱いを不憫に思った神様が気を利かせてくれたのか、 日経Linuxの懸賞に当たり、NVIDIA Jetson Nanoを頂戴しました!!
さて、夏休みの自由研究として、このJetson Nanoで遊んでいきたいと思う。
Setup
基本的には、NVIDIA公式のサポートページ developer.nvidia.com
とQiitaの記事 qiita.com
を参考にしています。
Hardware
Jetson Nanoを動かす為には本体に加えいくつかの周辺機器が必要です。
今回使用した物は以下の通り。
- Micro SD 32GB ✳︎ 節約の為に32GBを選択。大きい方がいいです。
- 5V 4A ACアダプター
- ジャンパーピン
- Wi-Fiアダプタ
これに加え当然インターネットに繋がったPCが必要です。
ACアダプターとジャンパーピンは秋月で買ってきた。人多かった。
Software
SDカードにNVIDIAがカスタムしたOSを書き込んでいきます。選択肢は2つ位あるんですが、HeadlessでやりたいのでJetCardを選びました。 github.com
ファイルサイズがかなりデカイので、DLと書き込みに時間がかかります。気長に待ちましょう。
Boot
書き込んだSDカードと電源、そしてUSB-microUSBをそれぞれ接続します。 USB-microUSBの片方はMacに接続します。
Jetson Nanoに電源を入れればmicro-USB近くのLEDが光ります。
それを確認すればあとはTerminalで ssh jetson@jetson.local
を打てば接続可能です。
ちなみに、nvidia-smi
は入っていませんが、CUDAはちゃんと動きます。
では早速、MNISTを動かしていきます。
PyTorchでMNIST
JetCardを使った方法では、PyTorch 1.1.0 や TensorFlow 1.13.1+nv19.5 がデフォルトで入っています。もちろんDocker 18.06.1-ceも入っています。(2019/08/10現在)
ただ、Docker自体は runtime=nvidia
が動作しない?
ソースコード
Vim も入ってるのでゴリゴリ書いてもいいのですが、せっかくなのでPyCharm ProfessionalのSSH リモートインタープリタで書いてみます。
コードは以下の通りです。
せっかく4コアCPUなので num_workers=4
にしてます。
コア数だけ見ると、MacBook Pro 13inch 2016年よりも多い...
処理時間
433.01 secなので大体7分。まあ、Batch size = 128 にしてるのでしょうがない気もするが。
総評
Edge向け機器だけあってやっぱり(1080Tiとかに比べて)計算時間は遅かったが、 悪夢のNVIDIAドライバーガチャをしなくても簡単に利用可能なイメージを配布してくれるのは本当ありがたい。
まあ、クラウドで学習して、ONNXにして、TensorRT使って高速化が基本なのかなぁと。
色々遊んでみようと思う。
氷菓 面白かった。合掌 www.netflix.com
あと、高木さん2最高。 www.netflix.com
Swift for TensorFlowでMNIST -Fully Connected NN- (更新予定)
今回はS4TFでMNISTを解く。Convは次回予定。
前提 ディレクトリ構造は次のようになっているとする。
├── Resources │ ├── t10k-images.idx3-ubyte │ ├── t10k-labels.idx1-ubyte │ ├── train-images.idx3-ubyte │ └── train-labels.idx1-ubyte ├── main.swift └── utils.swift
MNISTは公式のコードを参考にいくつかの変更を加えて書いています。
まず、 utils.swift
内のコードは公式が公開している該当コードと変わりありません。
変更点は、Swift for TensorFlow の Dataset API を一応利用している点です。
工事中...