在Tensorflow.js中尝试LSTM模型时遇到输入形状问题

我在尝试使用Tensorflow.js创建我的第一个LSTM模型时遇到了问题,我认为主要是形状方面的问题。

假设输入数组为:

X = [ [    0,    0.0013304822998336796,    0.0015680684248040588,    0.000617723924922986,    0.002708481824661435,    0.0035162746495605024,    -0.00009503444998804067,    -0.004941791399382223,    -0.0030886196246138198,    0.0010928961748635224  ],  [    0,    0.00023727044084842497,    -0.0007118113225452749,    0.0013761685569213533,    0.0021828880558061314,    -0.0014236226450907719,    -0.006263939638399774,    -0.00441323019978157,    -0.00023727044084842497,    0.0033692402600484783  ], ... ]

输出数组为:

Y = [  [ 0.0028556470420255664 ],  [ 0.006330620210385884 ],  [ -0.0029661016949151797 ],  ...]

构建张量的方式如下:

const xs = tf.tensor2d(X, [X.length, X[0].length]);const ys = tf.tensor2d(Y, [Y.length, 1]);

然后模型及其训练如下:

const model = tf.sequential();model.add(tf.layers.lstm({units: 10, inputShape: [10] }));model.add(tf.layers.dropout({rate: 0.25}));model.add(tf.layers.dense({units: 1 }));model.add(tf.layers.activation({ activation: 'linear' }));model.compile({    optimizer: tf.train.adam(),    loss: 'meanAbsoluteError'});model.fit(xs, ys, {    batchSize: 4, epochs: 50, callbacks: {        onEpochEnd: async (epoch, log) => {            console.log("Epoch: ", epoch, " - ", log);        }    }});

一直遇到错误 "Error: Input 0 is incompatible with layer lstm_LSTM1: expected ndim=3, found ndim=2" ….. 尝试更改inputShape为其他值,在训练前没有错误,但在训练时出现不同的错误 "Error when checking input: expected lstm_LSTM1_input to have 3 dimension(s). but got array with shape 168418,10" ….. 所以我认为我的形状设置可能完全错了,哈哈,这是一个我试图从Python迁移到.js的模型,它正是我需要的,但语言不对….. 原始的Python模型是:

def build_lstm_model(input_data, output_size=1, neurons=20, activ_func='linear', dropout=0.25, loss='mae', optimizer='adam'):    model = Sequential()    model.add(LSTM(neurons, input_shape=( input_data.shape[1], input_data.shape[2])))    model.add(Dropout(dropout))    model.add(Dense(units=output_size))    model.add(Activation(activ_func))    model.compile(loss=loss, optimizer=optimizer)

训练代码为:

history = model.fit(X_train, y_train, epochs=50, batch_size=4)

在我的情况下,”inputShape” 到底是什么?张量构建的方式是否有误?我遗漏了什么?

谢谢,我真的很期待能让这个模型工作,并理解为什么它不工作。希望能在机器学习领域中实践一番。


回答:

keras.layers.LSTMinput shape 是(批次大小,时间步长,特征)。如你所见,RNN结构是为处理时间依赖数据设计的,所以如果你的数据不包含时间信息,最好不要使用它。另一方面,如果你的数据确实包含时间信息,那么请确保你的输入形状是一个3D(批次大小 + 时间步长和特征 = 1 + 2)的输入。如果你没有设置批次大小,keras会将其设置为None,这相当于batch size=1,所以不用担心你没有设置它。在你的案例中,你使用了inputShape: [10],这不是使用keras.layers.LSTM的正确格式。如果你仍然想尝试使用LSTM,请扩展你的输入维度,并且别忘了根据你的更改调整inputShape。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注