【问题标题】:How can I pass a 3 dimensional tensor into a dense layer (tensorflow.js)如何将 3 维张量传递到密集层(tensorflow.js)
【发布时间】:2021-01-14 07:16:16
【问题描述】:

我正在寻找一种将标准化图形输入到我的 tensorflow.js 模型中的方法。现在,它正在传递一个二维张量,并且该代码可以完美运行。我找到了一个新的数据点,我想将它添加到那个二维张量中,但是,该数据点是一个点数组,当归一化时,它的范围在 0-1 之间。如果数组有一定数量的点,我会将每个单独的点作为数据点;但是,数组的大小因我的所有数据而异。这是我的代码和 javascript 对象形式的示例数据集:

{
    "rank": "27",
    "fame": "4505",
    "deaths": "1",
    "accountAge": 199,
    "characters": "7",
    "skins": "0",
    "verified": 1,
    "oneDay": [ 3856, 4003, 4138, 4282, 4316, 4431, 4505, 4719],
    "oneWeek": [ 1100, 1243, 1511, 1948, 2814, 3267, 3557],
    "lifeTime": [231, 1711, 2257, 4104, 5366, 7610, 9142, 11123, 12831, 15003, 15154, 16600, 17438, 18466, 19777, 20626, 22230, 24180, 24970, 25918, 26728, 28325, 29318, 30187, 30645, 31068, 33142, 35088, 35582, 35984, 37162, 39567, 0, 41089, 42615, 43609, 44254, 46740, 47231, 48261, 50673, 51161, 52646, 53592, 55470, 56487, 57254, 58422, 58428, 62407, 65122, 0, 65122, 69784, 70703, 72511, 77764, 78240, 80642, 81143, 81204, 82929, 85771, 89594, 90746, 92073, 92265, 376, 425, 476, 702, 776, 777, 827, 828, 1089, 1091, 998, 1031, 1084, 1148, 1100    ]
}

模型设置

    model = tf.sequential();

    //input layer
    model.add(tf.layers.dense({
        units: 100,
        inputShape: [9],
        activation: 'sigmoid'
    }))

    //hidden layers
    model.add(tf.layers.dense({
        units: 50,
        activation: 'sigmoid'
    }))

    //output layer
    model.add(tf.layers.dense({
        units: 1,
        activation: 'sigmoid'
    }))

当前数据设置

var xs2D = [], ys2D = []
for (let i of data) {
    //removed data normalization because it was very big

    xs2D.push([rank, fame, deaths, age, char, skin, od, ow, lt])
    ys2D.push([i.verified])
}

const xs = tf.tensor2d(xs2D)
const ys = tf.tensor2d(ys2D)

【问题讨论】:

  • 你的意思是 xs 是一个 3d 张量吗?

标签: javascript node.js tensorflow tensorflow2.0 tensorflow.js


【解决方案1】:

如果xs是一个形状为[a, b, c]的3d张量,那么第一层的inputShape应该是[b, c]

由于ys 不是 3d 张量,因此应在最后一层之前通过 flatten,使其返回 2d 张量。

这是一个小例子:

const model = tf.sequential({
     layers: [tf.layers.dense({units: 1, inputShape: [1, 10]}),
              tf.layers.flatten(),
              tf.layers.dense({units: 1})]
});
model.compile({optimizer: 'sgd', loss: 'meanSquaredError'}); 
// the loss function and the optimizer are just for the sake of example 
// in order to use compile, required before using fit

await model.fit(tf.ones([8, 1, 10]), tf.ones([8, 1]));
model.predict(tf.ones([8, 1, 10]))

【讨论】:

  • 感谢您的回复。这很有意义。我开始实现它,现在我收到一条错误消息 Shape does not match typed-array in bindData() 我将数据设置更改为:[[[rank], [fame], [deaths], [age], [char], [skin], od, ow, lt]]
  • 3d 张量创建得好吗?您不能在 tfjs 中创建具有不均匀形状的张量。它们被称为不规则张量。如果 tfjs 并且不能用于训练模型,它们尚不可用。 [rank] 的长度与 lt 的长度不同
  • 哦,天哪,它们的大小不一样 :^(
  • 很抱歉,你不能做你想做的事。但也许您可以将所有数据展平为单个数组
猜你喜欢
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 2019-04-13
相关资源
最近更新 更多