创建新张量时出错:推断的形状与提供的形状不匹配 (TensorFlowJS)

Error creating a new Tensor: Inferred shape does not match provided shape (TensorFlowJS)

提问人:ajmcallister27 提问时间:11/16/2023 更新时间:11/16/2023 访问量:16

问:

我正在创建一个机器学习模型,可以区分乐器和正常对话之间的音频差异。我使用了 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;
    }

这使得数组的形状大小正确,但在尝试训练数组时无法按预期工作。如何修复它,使预期的形状与输入的形状相同?

JavaScript TensorFlow 音频 TensorFlow.js

评论


答: 暂无答案