機械学習はデータの取得から始まります。データは今の場合、[-1, 0, 1, 2, 3, 4]という配列と、[-3, -1, 1, 3, 5, 7]という配列です。これを、
const [xs, ys] = await getData();
というコードで取得しています。この例のデータは簡単な配列ですが、機械学習のデータは通常、もっと巨大で外部にあります。多くの場合、相応の時間がかかるので、取得が終わるまで、待つ必要があります。その待機をここでは、JavaScriptの新しい機能であるawait関数とasync式で行っています。
// データを取得する。データは多くの場合外部にある。
const getData= async()=>{
// 訓練用データ
const trainData = tf.tensor2d([-1, 0, 1, 2, 3, 4], [6, 1]);
// 教師用データ
const labelData = tf.tensor2d([-3, -1, 1, 3, 5, 7], [6, 1]);
return [trainData, labelData];
}
データには2種類あり、訓練する方は訓練用データと呼ばれます。これは今の場合、y = 2x -1のxに代入される数値に当たります。もう1つは、教師用データ、ラベルデータと呼ばれ、今の場合、y = 2x -1 のyに当たります。
TensorFlow.jsの身になって言うと、「訓練用データが-1のとき教師用データは-3で、0のとき-1、1のとき1、2のとき3、3のとき4、4のとき7かあ。これらをうまく満たす係数は何だろう」と考えるわけです(無論、実際に考えたりはしません。舞台裏では面倒な計算を高速で行っています)。
tf.tensor2d()は、数学の行列に当たるJavaScriptの2次元配列を持つtf.Tensorオブジェクトを作成するメソッドです。引数に[-1, 0, 1, 2, 3, 4]と[6, 1]を与えると、
[[-1], [0 ], [1 ], [2 ], [3 ], [4 ]]という配列を持つtf.Tensorオブジェクトを返します。
tf.TensorはTensorFlow.jsの根幹を成すオブジェクトで、コンピュータのGPUによる高速計算に使用されます。たとえばconsole.log(trainData);を実行すると、次の結果が得られます。
[[-1], [0 ], [1 ], [2 ], [3 ], [4 ]]は6行1列の行列に相当します。これは、要素数が1の配列を6個もつJavaScriptの配列です。
tf.Tensorが持っているデータは、tf.Tensorのprint()メソッドでコンソールに出力して調べることができます。
trainData.print();
教師用データに関しても同様で、tf.tensor2d()を使って、[[-3],[-1],[1 ],[3 ],[5 ],[7 ]]という2次元配列をデータとして持つtf.Tensorオブジェクトを作成し、変数に割り当てています。
getData()関数では、作成した訓練用データと教師用データ用のtf.Tensorオブジェクトを返します。これにより、変数xsとysにそれぞれ、訓練用データと教師用データが割り当てられます。
以上でデータが取得できました。
tf.Tensorオブジェクトは、GPUの中を流れ、機械学習に必要な多量の計算を高速に行うために使用されます。Tensorは日本語ではテンソルと読まれます。テンソルはスカラーやベクトル、行列、それ以上の次元を持つ形式全部を含んだ概念を言いますが、TensorFlow.jsの場合ではJavaScriptの(多次元)配列と見なすことができます。