14_7:訓練

TensorFlow.jsではまた、訓練を実行し勾配をしきりに計算するAPIも提供されています。

演算とAPIを組み合わせ、出力と入力で自動的に微分する関数の例を示します。

勾配

tf.grad
tf.grads
tf.customGrad
tf.valueAndGrad
tf.valueAndGrads
tf.variableGrads

f(a,b)の勾配の例:

// f(a,b) = a*b
const f = (a, b) => a.mul(b);
// df/da = b, df/db = a
const grads = tf.grads(f);

const a = tf.tensor1d([1, 2]);
const b = tf.tensor1d([-1, -2]);
const [da, db] = grads([a, b]);

da.print();
/*
Tensor
    [-1, -2]
*/
db.print();
/*
Tensor
    [1, 2]
*/

オプティマイザー

tf.train.sgd
tf.train.momentum
tf.train.adagrad
tf.train.adadelta
tf.train.adam
tf.train.adamax
tf.train.rmsprop

オプティマイザーを、確率的勾配降下法(SGD)で構成する例です。

// 係数 a, b, c.
const xs = tf.tensor1d([0, 1, 2, 3, 4]);
const ys = tf.tensor1d([1.1, 3.9, 9.2, 15.8, 25.1]);

const a = tf.scalar(Math.random()).variable();
const b = tf.scalar(Math.random()).variable();
const c = tf.scalar(Math.random()).variable();

// y = a*x^2 + b*x + c
const f = x => a.mul(x.square()).add(b.mul(x)).add(c);
const loss = (pred, label) => pred.sub(label).square().mean();

const LEARNING_RATE = 0.01;
const optimizer = tf.train.sgd(LEARNING_RATE);

// モデルを訓練する
for (let i = 0; i < 10; i++) {
    optimizer.minimize(() => loss(f(xs), ys));
    console.log(`a: ${a.dataSync()}, b: ${b.dataSync()}, c: ${c.dataSync()}`);
}

// 推測する
const preds = f(xs).dataSync();
preds.forEach((pred, i) => {
    console.log(`x: ${i}, pred: ${pred}`);
});

もっと詳しく知りたい場合は、TensorFlow.js Training APIを参照してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA