Я строю небольшую программу для предсказания некоторого числа с плавающей точкой из 1d массива чисел с плавающей точкой.До сих пор я использовал dense
слои для достижения этой цели:
const model = sequential();
model.add(layers.dense({units: 32, inputShape: [numCols,]}));
model.add(layers.activation({activation: 'relu'}));
model.add(layers.dense({units: 4}));
model.add(layers.dense({units: 1}));
Где моя xs
форма ввода равна [numRows, numCols]
(например, [132, 100]
- в наборе данных из 132 примеров: [[1, 2, 3, ...], [4, 5, 6, ...], ...]) и мой вывод ys
представляет собой одно значение [num]
(например, [17.50]
).
Но я хотел попробовать LSTM, чтобы проверить, будет ли он работать лучше.Проблема заключается в том, что слоям для LSTM нужна трехмерная матрица, и я не был уверен, как это сделать.
Я пробовал следующее:
const trainXs = xs.clone()
.reshape([numRows, numCols, 1]);
Выше были преобразованы мои входные данные[[1, 2, 3, ...], [4, 5, 6, ...], ...]
до [[[1], [2], [3], ...], [[4], [5], [6], ...], ...]
.
И слои:
const model = sequential();
model.add(layers.simpleRNN({
units: 32,
inputShape: [numCols, numRows], // [100, 132]
recurrentInitializer: 'glorotNormal',
returnSequences: true
}));
model.add(layers.simpleRNN({
units: 32,
recurrentInitializer: 'glorotNormal',
returnSequences: true
}));
Но вышеперечисленное не выполнится со следующей ошибкой:
Error: Error when checking input: expected simple_rnn_SimpleRNN1_input to have shape [,100,132], but got array with shape [132,100,1].
Янемного запутался, и я не уверен, как мне следует изменить мой 2d-тензор, чтобы соответствовать требованиям слоев LSTM.
Обновление :
Вызов Fit:
model.fit(trainXs, trainYs, {
epochs: 1000,
batchSize: 12,
validationData: [testXs, testYs] // Test data has the same shape as trainXs/trainYs
});
В данный момент у меня только один слой:
model.add(layers.simpleRNN({
units: 32,
inputShape: [1, numCols, numRows],
recurrentInitializer: 'glorotNormal',
returnSequences: true
}));