Конвертировать 2d тензор в 3d для использования в слоях LSTM - PullRequest
0 голосов
/ 20 мая 2018

Я строю небольшую программу для предсказания некоторого числа с плавающей точкой из 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
}));

1 Ответ

0 голосов
/ 20 мая 2018

Ссылка гласит:

Форма входа (не включая первое, размер партии) должна быть как минимум двумерной, причем первое измерение является временными шагами.

, поэтому первое измерение вашего ввода должно содержать временные шаги.Для простоты просто используйте 1. Таким образом, в вашем случае форма тензора, который передается в ячейку, будет [1, numCols, numRows], как вы уже получили в сообщении об ошибке.

...