ダークサイドにようこそ!

ダンスしたりアプリ開発したり旅したりしているBBOYのブログ

【CNN】畳み込み層の次元数に気をつける話【Conv1DとConv2D】

機械学習における畳み込みニューラルネットワーク(CNN)といえば画像認識!というイメージが先行しすぎて、畳み込みにおける次元数の違いをあんまり意識しなくなるんじゃないかという危惧を抱きこちらにメモしておく。

といっても、畳み込みにおける次元数の違いを良い感じにまとめてくれているStack OverflowのQAがあったので先に貼っておきます。

stackoverflow.com


画像系だと基本2次元の畳み込みを使うので、あまり使っている人もいないのではないかという1次元の畳み込み参考記事はこちら。例として時間軸に対する畳み込み。

qiita.com


2次元の畳み込み例はこちら。音声解析系ですが画像に対する畳み込みと同じようなプロセスが可能です。

hahaeatora.hateblo.jp


3次元の畳み込みは使ったことないのですが、こちらの方が加速度センサーデータの学習に使われていました。やろうとしていることは私のダンスAIとほぼ同じ。

bluewidz.blogspot.com

hahaeatora.hateblo.jp


個人的に混乱しそうな点

やるのは画像認識だけだから2次元の畳み込みで十分!的な人はいいと思うんですが、使い分ける必要のある方は混乱するかも。その原因の一つとして畳み込み層の入力の形(input_shape)なのではないかと思います。

1次元の畳み込み層だと入力の形が(steps, input_dim)です。よく見かける2次元の畳み込みだと(rows, cols, channels)です(KerasのConv2Dではdata_format引数の指定によって順番が変わるので注意)。白黒画像だとチャンネル数が1になるので、その辺りが適当だと1次元畳み込みの入力の形を見て「ああ、ピクセルサイズ入れるのね〜」となってしまいそう、学習データも2次元の行列として用意してしまうと実際に入力できてしまうから。
ただし、実際には1次元の畳み込みだと単一の次元でしか畳み込みしないわけなので意図しない学習結果になるのではないだろうか。エラーも出ないから「ハイパーパラメータの調整がおかしいのか?」「前処理が足りないのか?」みたいな余計な部分に時間を取られてしまいそう(考えすぎ?)。
結局のところ自分はその辺りハマらずにすんでいるわけなので上記は単なる憶測なのだが(爆)、初めてCNNを扱う人でコピペをメインにモデル構築しているとその辺り怪しいのではないだろうか。

逆にセンサーデータのような時系列の変化の情報を扱う場合は基本的には1次元の畳み込みで十分なわけだが、あえて2次元の畳み込みを用いるとセンサーデータをプロットした画像を学習するイメージになるので、より多くの特徴を学習することになるのだろうか(加速度であればxyzの3軸をプロットしているわけだし)。さらにセンサーの種類を増やすなら今度は3次元の畳み込みにしてみるとか。

最後に私も使っているKerasのConvolutionalレイヤーのリファレンスを貼っておきますよ……
keras.io