gpt4 book ai didi

python - Tensorflow:运算中的基本 Python 计算

转载 作者:行者123 更新时间:2023-12-04 17:57:25 25 4
gpt4 key购买 nike

我正在尝试使用 tf.map_fn 对 Tensor 中包含的时间戳按元素执行与日期时间相关的计算。这需要转换为日期时间,然后再转换回与 Tensorflow 兼容的类型。

例如,假设我们想从时间戳张量中获取月份数:

from datetime import datetime

dates = [datetime(2016, 1, 1).timestamp(),
datetime(2016, 2, 1).timestamp()]

def timestamp_to_month(timestamp):
return datetime.fromtimestamp(timestamp).month

def month(x, name=None):
with tf.op_scope([x], name, "Month") as scope:
return tf.map_fn(timestamp_to_month, x, back_prop=False)

month(dates)

这不起作用,因为 timestamp_to_month 中的 timestamp 参数作为形状为 [] 而不是 float 的 Tensor 传递,并且具有待评估。

一个解决方案是在使用实际值之前执行 timestamp.eval(),但之后我将不得不获取当前 session ,可能需要额外的 session 参数,这会很不方便。

此外,此 month 操作实际上在图形构建阶段失败,而不是在其执行期间发生事件,这意味着映射的 timestamp_to_month 函数在构建图形时被调用。因此,当我实际上只想构建图形时,包含一个 timestamp.eval() 调用会触发图形的执行。

如何在操作中包含此类基本 Python(或 Numpy)步骤,同时仍延迟图形的执行?

最佳答案

您不能像这样向 TF 图中插入任意 Python 代码。虽然一些日期时间函数(主要是时间戳差异)可以用 TF 操作表示,但暂时必须在预处理中计算日期时间字段。

也就是说,一些日期时间计算比其他的更容易。虽然几个月真的很棘手,但这里有一个在 Tensorflow 中提取星期几和一天中的小时的示例。分秒应该也是可行的。

MILIS_PER_HOUR = 1000 * 60 * 60
MILIS_PER_DAY = MILIS_PER_HOUR * 24

HOUR_CYCLE = 24
DAY_CYCLE = 7

MONDAY_MIDNIGHT = 1558310400000


def extract_timestamps(timestamps_ms):
"""Converts batched ms timestamps into one-hot encoded hours+weekdays."""
monday_diff = tf.subtract(timestamps_ms, MONDAY_MIDNIGHT)
hours = _int_mod(monday_diff, MILIS_PER_HOUR, HOUR_CYCLE)
weekdays = _int_mod(monday_diff, MILIS_PER_DAY, DAY_CYCLE)
return tf.concat([
_compact_one_hot(hours, HOUR_CYCLE),
_compact_one_hot(weekdays, DAY_CYCLE)
],
axis=1)


def _compact_one_hot(indices, depth):
return tf.reshape(tf.one_hot(indices, depth), [-1, depth])


def _int_mod(x, x_scale, y):
return tf.cast(tf.mod(tf.divide(x, x_scale), y), dtype=tf.uint8)

关于python - Tensorflow:运算中的基本 Python 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39202894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com