当创建一个带有时间戳数组的张量时,数字不正确



寻找解决这个问题的方法:

尝试从时间戳数组创建张量

[
1612892067115,
],

但是结果是这样的

tf.tensor([1612892067115]).arraySync()
> [ 1612892078080 ]

如您所见,结果是不正确的。有人指出,我可能需要使用数据类型int64,但这似乎不存在于tfjs😭

我还尝试将时间戳划分为一个小浮点数,但我得到了类似的结果

tf.tensor([1.612892067115, 1.612892068341]).arraySync()
[ 1.6128920316696167, 1.6128920316696167 ]

如果你知道在张量中使用时间戳的方法,请帮助:)

:编辑:

作为一个尝试的解决方案,我试图从时间戳

中删除我的年、月和日期。下面是我的后续输入值:

[
56969701,
56969685,
56969669,
56969646,
56969607,
56969602
]

及其输出:

[
56969700,
56969684,
56969668,
56969648,
56969608,
56969600
]

如您所见,它们仍然是不正确的,并且应该完全在可接受的范围内

找到了一个适合我的解决方案:

因为我只需要时间戳的一个子集(只需要日期/小时/分钟/秒/毫秒),所以我只需要截断年/月:

export const subts = (ts: number) => {
// a sub timestamp which can be used over the period of a month
const yearMonth = +new Date(new Date().getFullYear(), new Date().getMonth())
return ts - yearMonth
}

那么我可以用

subTimestamps = timestamps.map(ts => subts(ts))
const x_vals = tf.tensor(subTimestamps, [subTimestamps.length], 'int32')

现在我所有的结果都像预期的那样工作。

目前tensorflow.js只支持int32,您的数据已经超出了int32支持的范围。

在支持int64之前,可以通过使用相对时间戳来解决这个问题。目前,js中的时间戳使用自1970年1月1日以来经过的毫秒数。相对时间戳可以通过使用另一个原点来使用,并计算自该日期以来所经过的毫秒差。这样,我们将得到一个可以用int32表示的较低的数字。最好的来源是记录的起始日期

const a = Date.now() // computing a tensor out of it will give an accurate result since the number is out of range
const origin = new Date("02/01/2021").now()
const relative = a - origin
const tensor = tf.tensor(relative, undefined, 'int32')
// get back the data
const data = tensor.dataSync()[0]
// get the initial date
const initial date = new Date(data + origin)

在其他场景中,如果不需要使用ms,那么使用自开始以来经过的s数会更好。它被称为unix时间

相关内容

  • 没有找到相关文章