はじめてのTensorflow.js 

本記事では、Webブラウザで使用できる機械学習ライブラリである、Tensorflow.jsについてまとめました。


参考: [TensorFlow.js](https://www.tensorflow.org/js)

環境構築は、Vueを使っていた関係で、[Nuxt v2.9 + Typescriptの環境構築](https://qiita.com/yoh_zzzz/items/9e2611b7a994427474f6)を参考にしています。

## 特徴

+ Webで使える
 画像のDOM要素をテンソルとしてインポートできる。=> ウェブカメラの情報が使える.など、、、

+ WebGLなどを使用したハードウェアアクセラレーション

+ Tensorflowとの互換性

+ データのプライバシー
 データをサーバーに送る必要がない。また、クライアント側で学習も可能

## インストール

```bash
npm install @tensorflow/tfjs-node
```

また,'WebGL2RenderingContext' was also declared here.のようなエラーが発生する場合は、以下もダウンロードが必要。

```bash
npm install -D '@types/webgl2'
```

## 以下が実行できるか試す

```ts
import * as tf from '@tensorflow/tfjs-node';

const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [2]}));

model.compile({loss: 'meanSquaredError', optimizer: 'adam'});

const xs = tf.tensor2d([[0, 0], [0, 1], [1, 0], [1, 1]], [4, 2]);
const ys = tf.tensor2d([0, 1, 1, 0], [4, 1]);

model.fit(xs, ys).then(() => {
 (model.predict(tf.tensor2d([[0, 1]], [1, 2])) as tf.Tensor).print(); //as tf.Tensorとしなければエラーが出た
});
```

以下のコマンドで実行

```bash
tsc ./path_to_ts.ts
node ./path_to_js.js

>>Tensor
     [[0.6098874],]
```

## 基礎

以下、基礎的な操作をまとめています。

```ts
import * as tf from '@tensorflow/tfjs-node'; 

const t1 = tf.tensor1d([1, 2, 3]); 
t1.print(); 
// Tensor
//    [1, 2, 3]

const t2 = tf.tensor2d([1, 2, 3, 4], [2, 2]);
t2.print();
// Tensor
//    [[1, 2],
//     [3, 4]]

const t = tf.tensor1d([1, 2, 3]);

// 非同期
t.data().then(b => {
  console.log(b); // Float32Array(3) [1, 2, 3]
});

// 同期
console.log(t.dataSync()); // Float32Array(3) [1, 2, 3]

// Operation
const t3 = tf.tensor([1, 2, 3, 4]);
const t4 = tf.tensor([10, 20, 30, 40]);

t3.add(t4).print();
// Or
tf.add(t3, t4).print();
//Tensor
//[11, 22, 33, 44]


//メモリー開放
console.log(tf.memory()); //メモリー情報を検査
// -> {unreliable: true,  numTensors: 7, numDataBuffers: 7, numBytes: 104}
const a = tf.tensor([1, 2, 3]);
console.log(tf.memory()); 
// -> {unreliable: true, numTensors: 8, numDataBuffers: 8, numBytes: 116}
a.dispose();
console.log(tf.memory()); 
// -> {unreliable: true,  numTensors: 7, numDataBuffers: 7, numBytes: 104}

//上記のメモリー開放は手作業でめんどくさい => tidyを用いて、関数の実行後、クリーンアップ
const a1 = tf.tensor([1, 2, 3]);

const y = tf.tidy(() => {
  const result = a1.square().log().neg();
  return result;  
});
```

## レイヤーの構築

層を追加していく方法についてまとめています。

```ts
import * as tf from '@tensorflow/tfjs-node'; 

//レイヤー

const model = tf.sequential({
  layers: [
    tf.layers.dense({inputShape: [784], units: 16, activation: 'relu'}),
    tf.layers.dense({units: 10, activation: 'softmax'}),
  ]
 });

/* レイヤー構築後にレイヤを追加
const model = tf.sequential();
model.add(tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
*/

//機能ごとにレイヤーを構成
const input = tf.input({shape: [784]});
const dense1 = tf.layers.dense({units: 16, activation: 'relu'}).apply(input);
const dense2 = tf.layers.dense({units: 10, activation: 'softmax'}).apply(dense1);
const model2 = tf.model({inputs: input, outputs: dense2 as tf.SymbolicTensor});

model2.summary()
/*
_________________________________________________________________
Layer (type)                 Output shape              Param #   
=================================================================
input1 (InputLayer)          [null,784]                0         
_________________________________________________________________
dense_Dense3 (Dense)         [null,16]                 12560     
_________________________________________________________________
dense_Dense4 (Dense)         [null,10]                 170       
=================================================================
Total params: 12730
Trainable params: 12730
Non-trainable params: 0
_________________________________________________________________
*/

//アクティベーションなど
const input2 = tf.tensor([-2, 1, 0, 5]);
const output = tf.layers.activation({activation: 'relu'}).apply(input2);
(output as tf.Tensor).print(); // [0, 1, 0, 5]
```
# まとめ

TypeScriptを使っている関係か、as tf.Tensorとしてprintを使用したりしています。TypeScriptは、かなり初心者(はじめて2日くらい)なので、問題点の指摘やアドバイスをいただければ、嬉しいです。また、今後継続して、Tensorflow.jsは記事にしていきたいと思っています。