Javascript 输入大小为1的训练会导致后续预测中出现NaN

Javascript 输入大小为1的训练会导致后续预测中出现NaN,javascript,tensorflow,keras,mnist,tensorflow.js,Javascript,Tensorflow,Keras,Mnist,Tensorflow.js,我正在学习MNIST的手写字符识别教程 我能够毫无问题地加载和识别手写数字,但现在我想在新图像上再次训练模型(特别是一次一个) 出于某种原因,当我选择一个等于1的训练大小时,我所有的预测都变为NaN 如果我选择一个>=2的值,它就可以正常工作 列车功能: async function train(model, data) { const TRAIN_DATA_SIZE = 1; // WHEN THIS IS 1, CAUSES PREDICT TO OUTPUT NaN co

我正在学习MNIST的手写字符识别教程

我能够毫无问题地加载和识别手写数字,但现在我想在新图像上再次训练模型(特别是一次一个)

出于某种原因,当我选择一个等于1的训练大小时,我所有的预测都变为NaN

如果我选择一个>=2的值,它就可以正常工作

列车功能:

async function train(model, data)
{
    const TRAIN_DATA_SIZE = 1; // WHEN THIS IS 1, CAUSES PREDICT TO OUTPUT NaN

    const [trainXs, trainYs] = tf.tidy(() =>
    {
        const d = data.nextTrainBatch(TRAIN_DATA_SIZE);
        return [
            d.xs.reshape([TRAIN_DATA_SIZE, 28, 28, 1]),
            d.labels
        ];
    });

    console.log(trainXs.dataSync());
    console.log(trainYs.dataSync());

    return model.fit(trainXs, trainYs);
}
nextTrainBatch
的代码为

预测的示例输出:

currentTensor = tf.tensor2d(inputs, [1, PIXELSSQUARED]);

const output = model.predict(currentTensor.reshape([1, 28, 28, 1]));
const prediction_value = Array.from(output.argMax(1).dataSync());
console.log(output.dataSync());
当培训规模为2或更大时:

Float32Array(10) [3.308702423154841e-9, 5.89648436744028e-8, 0.00005333929220796563, 0.8063259720802307, 7.401082784824764e-13, 1.1464327087651327e-7, 6.5924318955190575e-12, 0.1936144232749939, 0.000004253268798493082, 0.000001676815713835822]
当培训规模为1时:

Float32Array(10) [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]

该模型正在达到数值不稳定性。使用SGD之类的优化器可能会有所帮助。然而,使用1的批量大小实际上不是一个好主意,因为模型可能会围绕最佳值振荡

我希望用户在模型进行预测后选择正确的值,例如,进行预测、选择正确的输出、基于此信息进行再培训


如果要进一步训练,则需要具有与模型inputShape匹配的数据。因此,将收集预测值和用户选择的结果,并将其用于进一步训练模型

// the model has been trained
y = model.predict(x) // predict
假设用户将验证结果y。进一步训练

model.fit(x, y)

循环继续

模型正在达到数值不稳定性。使用SGD之类的优化器可能会有所帮助。然而,使用1的批量大小实际上不是一个好主意,因为模型可能会围绕最佳值振荡

我希望用户在模型进行预测后选择正确的值,例如,进行预测、选择正确的输出、基于此信息进行再培训


如果要进一步训练,则需要具有与模型inputShape匹配的数据。因此,将收集预测值和用户选择的结果,并将其用于进一步训练模型

// the model has been trained
y = model.predict(x) // predict
假设用户将验证结果y。进一步训练

model.fit(x, y)

循环继续

模型正在达到数值不稳定性。使用SGD之类的优化器可能会有所帮助。但是,使用1的批量大小实际上不是一个好主意,因为模型可能会围绕最佳值振荡。有没有更好的方法在我的模型经过培训后将用户/进一步的反馈合并到模型中?您所说的“合并用户”是什么意思?我的意思是-我希望用户在模型进行预测后选择正确的值,例如,进行预测,选择正确的输出,基于此信息重新培训如果您想进一步培训,您需要有与模型inputShape匹配的数据。因此,将收集预测值和用户选择的结果,并将其用于进一步训练模型。模型正在达到数值不稳定性。使用SGD之类的优化器可能会有所帮助。但是,使用1的批量大小实际上不是一个好主意,因为模型可能会围绕最佳值振荡。有没有更好的方法在我的模型经过培训后将用户/进一步的反馈合并到模型中?您所说的“合并用户”是什么意思?我的意思是-我希望用户在模型进行预测后选择正确的值,例如,进行预测,选择正确的输出,基于此信息重新培训如果您想进一步培训,您需要有与模型inputShape匹配的数据。因此,将收集预测值和用户选择的结果,并将其用于进一步训练模型。