Tenforflow稀疏算法

2024-09-29 06:28:33 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在学习tensorflow,我有一个稀疏的数据集,它由三列组成,日期,键,排列。我想把这些数据存储在稀疏张量中,以bond作为一个维度,以date作为另一个维度,会让对这个张量的操作感觉很自然,如果你认为有更好的方法,一定要告诉我

我试着在张量的两个切片上执行算术,在给定的张量值不是空的情况下,我只在一个日期上加/减值,虽然我发现了一些函数可以帮助我完成这项任务,但我无法摆脱这样的感觉:我缺少一个真正简单的问题解决方案

使用以下数据:

import tensorflow as tf
tf.enable_eager_execution()

indicies = [[0, 0], [0, 1], [1, 0], [1, 2], [2, 2]]
values   = [10    , 10    ,  10   , 11    ,  11   ]

spreads = tf.sparse.SparseTensor(indicies, values, [3, 3])

在上面的例子中,我打算用维度一来表示日期,用维度二来表示债券

tf.sparse.slice(spreads,[0,2],[3,1])

给出日期2的所有价差,但显然SparseTensor不支持减法,也不能使用tf.math.subtract。所以我不再确定支持什么

具体来说,我想在上面的例子中完成的是减去所有其他日期的日期0,前提是债券在这两个日期上都有价差。例如,债券0出现在日期01中,而不是日期2,所以我想从日期01中减去日期0中的价差。 最终张量如下:

indicies2 = [[0, 0], [0, 1], [1, 0], [1, 2]]
output    = [ 0    , 0     , 0,    ,  1    ]
tf.sparse.to_dense(tf.sparse(tf.sparse.SparseTensor(indicies2, output, [3, 3])))

tf.Tensor: id=128, shape=(3, 3), dtype=int32, numpy= array([[0, 0, 0], [ 0, 0, 1], [ 0, 0, 0]])

我想最简单的解决方法是使用tf.sparse.to_dense,但是这样做会破坏使用SparseTensor的全部意义,所以我不确定API文档中是否遗漏了使我的解决方案成为可能的内容,或者我是否完全错了使用SparseTensor? 在一天结束的时候,如果一个张量的每个值与另一个张量匹配,我只想对它进行一些数学运算

更新: 我意识到我可以对其中一个切片应用tf.math/negative来减去两个切片,问题是输出假设如果一个切片中的值丢失,那么可以假设它是某个默认值(零)


Tags: 数据方法tftensorflow切片解决方案例子sparse
1条回答
网友
1楼 · 发布于 2024-09-29 06:28:33

我不确定有没有什么简单的小把戏能让它那么容易地工作。我要么做密集计算要么自己写稀疏计算。这是一个有点棘手,所以可能只值得它,如果数据真的非常稀疏,你会节省大量的内存和计算。下面是一个方法:

import tensorflow as tf
tf.enable_eager_execution()

bonds = [0, 0, 1, 1, 2]
dates = [0, 1, 0, 2, 2]
values = [10, 10, 10, 11, 11]
# Find date 0 data
m0 = tf.equal(dates, 0)
bonds0 = tf.boolean_mask(bonds, m0)
values0 = tf.boolean_mask(values, m0)
# Find where date 0 bonds are
match = tf.equal(tf.expand_dims(bonds, 1), bonds0)
# Compute the amount to subtract from each data point
values_sub = tf.reduce_sum(values0 * tf.dtypes.cast(match, values0.dtype), 1)
# Compute new spread values
values_new = values - values_sub
# Mask null values
m_valid = tf.not_equal(values_new, 0)
bonds_new = tf.boolean_mask(bonds, m_valid)
dates_new = tf.boolean_mask(dates, m_valid)
values_new = tf.boolean_mask(values_new, m_valid)
# Make sparse tensor
indices_new = tf.dtypes.cast(tf.stack([bonds_new, dates_new], 1), tf.int64)
spreads_new = tf.sparse.SparseTensor(indices_new, values_new, [3, 3])
tf.print(spreads_new)
# 'SparseTensor(indices=[[1 2]
#  [2 2]], values=[1 11], shape=[3 3])'

对于您给出的示例,我得到的输出(1, 2) => 1(2, 2) => 11-(2, 2)不受影响,因为2在日期0中没有扩散。这和你写的不一样,所以如果你不是这个意思,请告诉我

相关问题 更多 >