三日坊主のプログラミング日誌

なんか色々書いておくところ。

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で時系列やる予定。

プライバシーポリシー お問い合わせ