Javascript 使用分类交叉熵作为optimizer.minimize-tensorflow.js的损失函数

Javascript 使用分类交叉熵作为optimizer.minimize-tensorflow.js的损失函数,javascript,machine-learning,tensorflow.js,Javascript,Machine Learning,Tensorflow.js,以下(大致)来自tensorflow教程的示例,用于培训模型的代码如下: // The weights and biases for the two dense layers. const w1 = tf.variable(tf.randomNormal([784, 32])); const b1 = tf.variable(tf.randomNormal([32])); const w2 = tf.variable(tf.randomNormal([32, 10])); const b2 =

以下(大致)来自tensorflow教程的示例,用于培训模型的代码如下:

// The weights and biases for the two dense layers.
const w1 = tf.variable(tf.randomNormal([784, 32]));
const b1 = tf.variable(tf.randomNormal([32]));
const w2 = tf.variable(tf.randomNormal([32, 10]));
const b2 = tf.variable(tf.randomNormal([10]));

function model(x) {
  return x.matMul(w1).add(b1).relu().matMul(w2).add(b2);
}
const xs = tf.data.generator(data);
const ys = tf.data.generator(labels);
// Zip the data and labels together, shuffle and batch 32 samples at a time.
const ds = tf.data.zip({xs, ys}).shuffle(100 /* bufferSize */).batch(32);

const optimizer = tf.train.sgd(0.1 /* learningRate */);
// Train for 5 epochs.
for (let epoch = 0; epoch < 5; epoch++) {
    await ds.forEachAsync(({xs, ys}) => {
    optimizer.minimize(() => {
      const predYs = model(xs);
      const loss = tf.losses.softmaxCrossEntropy(ys, predYs);
      loss.data().then(l => console.log('Loss', l));
      return loss;
    });
  });
  console.log('Epoch', epoch);
}
培训代码是

let input = getNextTrainBatch(BATCH_SIZE,TRAIN_DATA_SIZE, data);
model.optimizer.minimize(() => {
        const predict = model.apply(input[0]);
        const loss = tf.metrics.categoricalCrossentropy(input[1],predict);
        return loss;
});
在这个设置中,当我运行代码时,我得到一个错误
Uncaught(in promise)error:Tensor被释放。
如果我将
model.apply(输入[0])
放在
model.optimizer.minimize
之外,我会得到错误

Uncaught(in promise)错误:找不到任何变量与损失函数y=f(x)的结果之间的连接。请确保使用变量的操作在传递给minimize()的函数f中。

我认为第二个错误是由于分类交叉熵位于tf.metrics之下而不是tf.loss之下,但是tf.loss类中没有分类交叉熵。我不知道该怎么做/如果我能用分类交叉熵来解决这个问题

注意:我正在使用
“@tensorflow/tfjs”:“1.0.2”
作为依赖项中的tensorflow,如果版本重要的话

编辑: 我意识到,我需要使用
tf.loss.softmaxCrossEntropy
,而不是
tf.metrics.categoricalCrossEntropy
,作为实际损失函数。然而,我仍然得到了与以前相同的2个错误,尽管有这个改变

let input = getNextTrainBatch(BATCH_SIZE,TRAIN_DATA_SIZE, data);
model.optimizer.minimize(() => {
        const predict = model.apply(input[0]);
        const loss = tf.metrics.categoricalCrossentropy(input[1],predict);
        return loss;
});