本記事では、Webブラウザで使用できる機械学習ライブラリである、Tensorflow.jsについてまとめました。
参考: TensorFlow.js
環境構築は、Vueを使っていた関係で、Nuxt v2.9 + Typescriptの環境構築を参考にしています。
特徴
-
Webで使える
画像のDOM要素をテンソルとしてインポートできる。=> ウェブカメラの情報が使える.など、、、 -
WebGLなどを使用したハードウェアアクセラレーション
-
Tensorflowとの互換性
-
データのプライバシー
データをサーバーに送る必要がない。また、クライアント側で学習も可能
インストール
npm install @tensorflow/tfjs-node
また,'WebGL2RenderingContext' was also declared here.のようなエラーが発生する場合は、以下もダウンロードが必要。
npm install -D '@types/webgl2'
以下が実行できるか試す
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としなければエラーが出た
});
以下のコマンドで実行
tsc ./path_to_ts.ts
node ./path_to_js.js
>>Tensor
[[0.6098874],]
基礎
以下、基礎的な操作をまとめています。
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;
});
レイヤーの構築
層を追加していく方法についてまとめています。
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は記事にしていきたいと思っています。