【问题标题】:reshape 1d array to 3d for tensorflow.js lstm将 tensorflow.js lstm 的 1d 数组重塑为 3d
【发布时间】:2018-08-22 01:05:16
【问题描述】:

我正在尝试使用时间序列数据来预测未来的股票价格。我有一个 251 个时间步长的 xs 数组,以及那个时间步长的相应股票价格的 ys 数组。我已将 xs 数组重新整形为 3d,但出现错误

'输入张量应该与目标张量具有相同数量的样本。找到 1 个输入样本和 251 个目标样本。'

模型的代码如下。

var xs = [];
var ys = [];
for(i in result){
    xs.push(i);
    ys.push(result[i].close);
    }

    var xt = tf.tensor3d(xs, [1,xs.length,1]);
    var yt = tf.tensor2d(ys, [xs.length, 1]);
    //xt.reshape([1, xs.length, 1]).print();
    //yt.reshape([1, ys.length, 1]).print();
    var lstm1 = tf.layers.lstm({units: 32, returnSequences: true, inputShape:[xs.length,1]});
    var model = tf.sequential();
    model.add(lstm1);
    model.add(tf.layers.dropout({rate:0.2}));
    model.add(tf.layers.lstm({units:5}));
    model.add(tf.layers.dropout({rate:0.2}));
    model.add(tf.layers.dense({units:1, inputShape:[32], activation:'softmax'}));
    model.compile({optimizer:'adam', loss:'categoricalCrossentropy'});



    model.fit(xt, yt, {epochs:1000}).then(() => {

  bestfit = model.predict(tf.tensor(xs, [xs.length,1])).dataSync();

【问题讨论】:

  • xs 和 ys 定义在哪里?
  • 你能在model.fit 之前做console.log("xt.shape", xt.shape, "yt.shape", yt.shape) 并在此处发布结果吗?
  • @edkeveked xt.shape (3) [1, 251, 1]0: 11: 2512: 1length: 3__proto__: Array(0) yt.shape (2) [251, 1]跨度>
  • @edkeveked xt.shape (3) [1, 251, 1] yt.shape (2) [251, 1]
  • @scottm,现在我清楚地知道您为什么会出现错误。我会更新我的答案

标签: javascript tensorflow lstm tensorflow.js


【解决方案1】:

错误似乎来自model.fit(x, y),因为 x 和 y 的形状似乎不匹配。

x 的形状为[1, 251, 1],y 的形状为[251, 1]。这不起作用,因为 x 中的特征多于 y 中的标签。你必须重塑 x 或 y。

  • 重塑 x:x.reshape([251, 1, 1])x.reshape([251, 1])

  • 重塑 y:y.reshape([1, 251])y.reshape([1, 251, 1])

注意:只要前两个维度大小相等并且所有维度大小的乘积等于251。重塑中重要的是不要失去特征和标签之间的相关性

【讨论】:

  • 感谢您的回答!它现在可以工作了(尽管模型非常不准确,哈哈)。
猜你喜欢
  • 2020-04-22
  • 2021-02-25
  • 2018-03-18
  • 2017-12-03
  • 2020-05-04
  • 2017-10-15
  • 2016-02-10
  • 2014-03-03
  • 1970-01-01
相关资源
最近更新 更多