tensorflow - 将 2d 张量转换为 3d 以用于 LSTM 层
问题描述
我正在构建一个小程序来预测一维浮点数组中的一些浮点数。到目前为止,我一直在使用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
}));
解决方案
参考资料说:
输入的形状(不包括第一个批次维度)需要至少是二维的,第一个维度是时间步长。
所以你输入的第一个维度应该包含时间步长。为简单起见,只需使用 1。因此,在您的情况下,传递给单元格的张量的形状将[1, numCols, numRows]
与您在错误消息中得到的一样。
推荐阅读
- javascript - 在明暗模式之间切换
- windows - Oracle(sqlplus 不被识别为内部或外部命令)
- javascript - 自定义 ::-webkit-scrollbar 会破坏以前的功能?
- php - 在 WooCommerce 中显示销售车商品格式的价格范围
- mysql - 即使没有找到值,也可以加入两个表分组并计数(显示为 0)
- postgresql - Postgres 约束,其中 col1 不能与 col2 相同
- lua - Lua - 创建用户驱动的菜单 - 终端界面 - 如何最好地导航?
- java - 此代码使用什么公式来计算 pf Pi 的值?
- python - 在 Python 中,当列表已排序且列表未排序时,为什么以下代码会给出不正确的答案?
- java - 就 DDD 而言,是否可以在域服务中为聚合根实体而不是聚合根存储库实现 crud 逻辑?