Javascript 使用分类交叉熵作为optimizer.minimize-tensorflow.js的损失函数
以下(大致)来自tensorflow教程的示例,用于培训模型的代码如下: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 =
// 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;
});