Javascript 在inputshape上丢失(Tensorflow.js LSTM模型尝试)

Javascript 在inputshape上丢失(Tensorflow.js LSTM模型尝试),javascript,tensorflow,machine-learning,Javascript,Tensorflow,Machine Learning,我正试图在Tensorflow.js上使用我的第一个LSTM模型,但我几乎被形状所束缚(我想) 假设输入数组: X = [ [ 0, 0.0013304822998336796, 0.0015680684248040588, 0.000617723924922986, 0.002708481824661435, 0.0035162746495605024, -0.00009503444998804067, -0.0049417913

我正试图在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 ],
  ...
]
和输出阵列:

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);
        }
    }
});
Keek获取错误
“错误:输入0与层lstm_LSTM1不兼容:预期ndim=3,发现ndim=2”
。。。。。尝试将inputShape更改为其他内容,在训练前不给出错误,但在检查输入时给出不同的错误
“错误:预期lstm\u LSTM1\u输入具有三维。但在训练中获得了形状为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)
我的处境到底是什么样的?张量是以错误的方式形成的吗?我错过了什么


谢谢你,我真的很期待这个工作,并理解为什么它不工作。让我的手在机器学习上弄脏。

keras.layers.LSTM的
输入形状是(批量大小、时间步长、功能)。如您所见,RNN结构是为依赖时间的数据创建的,因此,如果您的数据不包含时间信息,最好不要使用它。另一方面,如果您确实有时间信息,那么请确保您的输入形状是3d(批量大小+时间步长,特征=1+2)输入。如果不设置批量大小,keras会将其设置为
None
,作为
batch size=1
,因此如果不设置,则无需担心在您的情况下,您只需使用
inputShape:[10]
,这不是使用
keras.layers.LSTM的格式如果您仍想尝试应用LSTM,请为您的输入扩展维度,并且不要忘记更改inputShape后的更改。

谢谢,让我走上了正确的道路!只是还不是100%确定,因为一些概念,如批量大小和时间步长,我们将尝试使用您提供给我的信息。。。。。。。我应该使用timestamp或datestring作为“时间步长”并将其作为时间戳,也进行规范化吗?根据我下面的例子,它确实需要是LSTM。假设你得到了一个类似于
[[1,2,3],[4,5,6]
的数组,它是一个二维数组,具有time1 is
[1,2,3]
和time2 is
[4,5,6]
的特性,你可以猜RNN输出(pred time3)将是
[7,8,9]
。这是使用
keras.layers.LSTM
的基本思想。正常化并不总是必要的,但在大多数深度学习模式中,这样做更好。只要试着修改它,并享受乐趣