检查输入时出错:预期 embedding_Embedding1_input 的形状为 [1103],但得到的数组的形状为 [1103,1]

Error when checking input: expected embedding_Embedding1_input to have shape [,1103], but got array with shape [1103,1]

为了了解 Tensorflow.js 用于未来的项目,我正在尝试处理 this tutorial,同时还将示例从 Python 转换为 NodeJS。其中一部分是通过创建具有预测器输入和标签输出的训练集来生成训练数据。我看不出这些层的训练集形状不对。

模型创建如下所示:

model = tf.sequential();
model.add( tf.layers.embedding( {
    inputDim: total_words + 1,
    outputDim: 10,
    inputLength: max_length,
} ) );
model.add( tf.layers.lstm( {
    units: 100,
    kernelRegularizer: tf.regularizers.l2( {
        l2: 0.0001
    } )
} ) );
model.add( tf.layers.dropout( {
    rate: 0.1
} ) );
model.add( tf.layers.dense( { units: total_words, activation: 'softmax' } ) );
const optimizer = tf.train.rmsprop( learningRate );
model.compile( { optimizer: optimizer, loss: 'categoricalCrossentropy' } );

训练循环如下所示:

for ( let i = 0; i < sets.length; ++i ) {
    let predictor = tf.tensor1d( sets[ i ].predictor );
    let label = tf.scalar( sets[ i ].label );
    await model.fit( predictor, label, {
        epochs: epochs,
        callbacks
    } );
    predictor.dispose();
    label.dispose();
}

如果有人问我如何生成训练集:

async function GenerateTrainingSets( paddedInputSequence, maxInput ) {
    let sets = [];
    for ( let i = 0; i < maxInput - 1; i++ ) {
        let predArray = [];
        for ( let preds = 0; preds < sets.length + 1; preds++ ) {
            predArray.push( paddedInputSequence[ preds ] );
        }
        let sizeDifference = maxInput - predArray.length;
        for ( let pads = 0; pads < sizeDifference; pads++ ) {
            predArray.push( 0 );
        }
        sets.push( {
            predictor: predArray,
            label: paddedInputSequence[ i + 1 ]
        } )
    }
    return sets;
}

预测变量是相同长度的一维数组 (1103),标签是标量(整数)。

模型期望输入形状 [null, total_words + 1](batchsize 为 null)。输入至少应该是一个二维张量。如果不是(1d tensor),则在-1轴上展开。

如果要从单个向量进行预测,可以在轴 0 上扩展输入张量。


let predictor = tf.tensor2d( sets[ i ].predictor, [1, total_words + 1] ); // total_words + 1 should be 1103