チュートリアル:複数種類の入力データを用いるネットワーク

Wednesday, May 23, 2018

App , Cloud

Posted by Yoshiyuki Kobayashi

本チュートリアルでは、複数種類のデータを入力とするニューラルネットワークを扱う方法についてご紹介します。この手法は例えば、複数の画像を元に認識を行う場合や、画像とベクトルの入力を元に認識を行う場合などに利用することができます。

 

1. 複数の画像を元に認識を行う

まずは、x、x2、x3の3枚の画像を元にyを推定する方法について解説します。

1.1 複数入力画像データを扱うデータセットの準備

Neural Network ConsoleのデータセットCSVは、複数種類のデータの扱いに対応しています。複数種類のデータを扱うには、データセットCSVファイルの列を単純にデータ種類の数だけ用意します。

x、x2、x3の3枚の画像を元にyを推定するには、以下のようにデータセットCSVファイルを作成します。

x x2 x3 y
./x_1.png ./x2_1.png ./x3_1.png 0
./x_2.png ./x2_2.png ./x3_2.png 1
./x_3.png ./x2_3.png ./x3_3.png 2

x、x2、x3の3枚の画像を元にyを推定する認識を行うデータセットCSVファイル

1.2 複数入力画像データを扱うネットワークの構築

複数の画像データを入力するには、入力画像データの数だけInputレイヤーを配置します。また、各InputレイヤーのSizeプロパティで各画像のサイズを、Datasetプロパティで入力する変数名(今回の場合x、もしくはx2、もしくはx3)を指定します。



Inputレイヤーの配置と、Size、Datasetプロパティの設定

Inputレイヤーでデータを入力した後は、任意のニューラルネットワークを構築できます。複数の入力を結合する際には、Concatenate(テンソルの結合)、Add2(2つのテンソルを要素毎に加算)、Mul2(2つのテンソルを要素毎に乗算)などのレイヤーを用いることができます。



Concatenateレイヤー、Mul2レイヤーを用いて中間出力を結合した例

Concatenateレイヤーを用いた結合を行う場合は、入力のAxisプロパティで指定する軸以外のサイズが、Add2、Mul2レイヤーを用いた結合を行う場合は、入力の要素が1である軸以外のサイズが同一である必要があります。

 

2 画像とベクトルの入力を元に認識を行う

続いて、画像xと、4次元のベクトルx2を入力とし、yを推定する方法について解説します。

2.1 画像とベクトルの入力を元に認識を行うデータセットの準備

画像xと、4次元のベクトルx2を入力とし、yを推定するには、以下のようなデータセットCSVファイルを作成します。

x x2__0 x2__1 x2__2 x2__3 y
./x_1.png 0.0 0.1 0.2 0.3 0
./x_2.png 0.1 0.2 0.3 0.4 1
./x_3.png 0.2 0.3 0.4 0.5 2

画像xと、4次元のベクトルx2を入力とし、yを推定するデータセットCSVファイル

データセットCSVファイルでベクトルを扱う際は、要素数分の列います。ます。今回、x2は4次元のベクトルですので、x2__0~x2__3の4列を用います。
ヘッダ(x2__0~x2__3)は、変数名(x2)+ダブルアンダースコア+ベクトルの次元Index(0~3)のフォーマットに従っています。例えばx2__1は、変数x2の次元Index 1の列であることを示します。

2.2 画像とベクトルの入力を元に認識を行うネットワークの構築

今回はxとx2の2つの入力を行うために、2つのInputレイヤーを配置します。1つめのInputレイヤーのDatasetプロパティに画像の変数名xを、Sizeプロパティに画像サイズを指定し、2つめのInputレイヤーのDatasetプロパティにベクトルの変数名x2を、Sizeプロパティにベクトルのサイズである4を指定します。



Inputレイヤーの配置と、Size、Datasetプロパティの設定

Inputレイヤーを配置したら、後段のニューラルネットワークを構築していきます。下記のネットワークでは、入力xに対してConvolutional Neural Networkを構築し、x2を最初のAffineの出力にConcatenateしています。



Concatenateレイヤーを用いて結合した例