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