提问人:ajmcallister27 提问时间:11/16/2023 更新时间:11/16/2023 访问量:16
创建新张量时出错:推断的形状与提供的形状不匹配 (TensorFlowJS)
Error creating a new Tensor: Inferred shape does not match provided shape (TensorFlowJS)
问:
我正在创建一个机器学习模型,可以区分乐器和正常对话之间的音频差异。我使用了 tensorflow.org 的一个教程,该教程使用实时麦克风数据训练模型。我想在预先录制的数据上训练我的模型,所以我修改了代码以改用音频文件。在它尝试用数据训练张量之前,这一直工作正常。
我正在尝试创建一个用于训练的新张量,但我收到了与形状不匹配相关的错误。预期形状为 (2,1000,192,1),但推断的形状为 (3000,128)。我怀疑我准备输入数据的方式或训练逻辑可能存在问题。
切换到预先录制的音频文件时,我必须调整张量的形状以适合录制的文件。在包含频谱图数据的数组中,我在末尾添加多个零数组以填充空间。但是,它添加了 16 个太多值,并导致形状不匹配。我通过删除最后 16 个值来解决这个问题。
这是我的训练代码:
const NUM_FRAMES = 1000;
const INPUT_SHAPE = [NUM_FRAMES, 192, 1];
async function train() {
if (examples.length) {
toggleButtons(false);
const ys = tf.oneHot(examples.map(e => e.label), 2);
const xsShape = [examples.length, ...INPUT_SHAPE];
const xs = tf.tensor(flatten(examples.map(e => e.vals)), xsShape);
await model.fit(xs, ys, {
batchSize: 16,
epochs: 10,
callbacks: {
onEpochEnd: (epoch, logs) => {
document.querySelector('#console').textContent =
`Accuracy: ${(logs.acc * 100).toFixed(1)}% Epoch: ${epoch + 1}`;
}
}
});
tf.dispose([xs, ys]);
toggleButtons(true);
}
}
function flatten(tensors) {
const maxSize = INPUT_SHAPE[0] * INPUT_SHAPE[1] * INPUT_SHAPE[2] * tensors.length;
console.log(maxSize);
let result = tensors.reduce((acc, arr) => acc.concat(arr), []);
if (result.length * 128 < maxSize) {
let i = 1;
let length = Math.floor((maxSize - (result.length * 128)) / 128);
console.log(length);
while (i < length) {
const filler128 = Array(128).fill(0);
result.push(filler128);
i++;
}
const filler = Array(maxSize - (result.length * 128)).fill(0);
result.push(filler);
}
result[result.length - 1].slice(0, -16);
console.log(result);
return result;
}
这使得数组的形状大小正确,但在尝试训练数组时无法按预期工作。如何修复它,使预期的形状与输入的形状相同?
答: 暂无答案
评论