我正在构建一个小程序,以预测来自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的图层需要一个3d矩阵,我不知道该怎么做。
我尝试了以下内容:
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层的要求。
更新:
契合电话:
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
}));
答案 0 :(得分:0)
参考文献说:
输入的形状(不包括第一个,批量维度)需要至少为2-D,第一个维度为时间步长。
因此输入的第一个维度应包含时间步长。为简单起见,只需使用1.因此,在您的情况下,传递给单元格的张量的形状将是[1, numCols, numRows]
,就像您在错误消息中已经得到的那样。