在python中怎样将rdf转化为稀疏张量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在python中怎样将rdf转化为稀疏张量相关的知识,希望对你有一定的参考价值。
本人小白,目前使用python做数据库的关系学习,目前已有第三方库能够将rdf转化为张量,详见https://github.com/mnick/10c,但是装好后依然不会使用,求大神指教~~~按照使用说明,输入10c -h 也得不到使用的方法,很是费解~~
参考技术A Rdf我毕设时候做过,好像查询预语言还是SparQL呢 参考技术B 没安装那个库,不要看到错就慌了,一个一个解决来自密集张量 Tensorflow 的稀疏张量(矩阵)
【中文标题】来自密集张量 Tensorflow 的稀疏张量(矩阵)【英文标题】:Sparse Tensor (matrix) from a dense Tensor Tensorflow 【发布时间】:2017-02-11 18:56:41 【问题描述】:我正在创建一个卷积稀疏自动编码器,我需要将一个充满值的 4D 矩阵(其形状为 [samples, N, N, D]
)转换为一个稀疏矩阵。
对于每个样本,我有 D NxN 个特征图。我想将每个 NxN 特征图转换为稀疏矩阵,最大值映射为 1,其他所有映射为 0。
我不想在运行时但在 Graph 声明期间这样做(因为我需要使用生成的稀疏矩阵作为其他图形操作的输入),但我不明白如何获取索引来构建稀疏矩阵。
【问题讨论】:
你想在 Tensorflow 中还是在 python 中进行这种转换?如果在 python 中这个函数可以帮助你从密集矩阵转换为稀疏矩阵(docs.scipy.org/doc/scipy/reference/generated/…)并且你可以使用 tf.SparseTensor(它使用 coo 格式)来存储每个特征图,并使用列表来存储所有稀疏张量。跨度> 具体来说,nonzero() (docs.scipy.org/doc/scipy/reference/generated/…) 可以为您提供非零元素的索引。不确定这是否被认为是运行时方法。这可能是图形声明之前的一些数据预处理。 4D 密集矩阵是在运行时生成的还是只是一些给定的输入数据? 我不想在运行时这样做(我知道如何用 numpy 做到这一点),但在图形声明期间(所以使用 Tensorflow) 【参考方案1】:您可以使用tf.where
和tf.gather_nd
来做到这一点:
import numpy as np
import tensorflow as tf
# Make a tensor from a constant
a = np.reshape(np.arange(24), (3, 4, 2))
a_t = tf.constant(a)
# Find indices where the tensor is not zero
idx = tf.where(tf.not_equal(a_t, 0))
# Make the sparse tensor
# Use tf.shape(a_t, out_type=tf.int64) instead of a_t.get_shape()
# if tensor shape is dynamic
sparse = tf.SparseTensor(idx, tf.gather_nd(a_t, idx), a_t.get_shape())
# Make a dense tensor back from the sparse one, only to check result is correct
dense = tf.sparse_tensor_to_dense(sparse)
# Check result
with tf.Session() as sess:
b = sess.run(dense)
np.all(a == b)
>>> True
【讨论】:
我如何用张量做到这一点?就像我想将张量转换为稀疏张量一样。 @RocketPingu 不知道你的意思,这是将密集张量转换为稀疏张量。a_t
这是一个常规的 TensorFlow 张量(在这种情况下是从 tf.constant
操作获得的,但可以是任何其他操作的输出)。为了清楚起见,我添加了一些 cmets。
只是当我为我的代码尝试它时,它给了我一个错误。更多信息在这里:***.com/questions/48201725/…
@RocketPingu 当我在代码中放入其中一个 cmets 时,如果在创建图形时不知道张量的完整形状(即它的形状是动态的,而不是静态的),你应该使用tf.shape(tensor)
而不是tensor.get_shape()
或tensor.shape
。
我再次运行代码。事实证明,转换是成功的。现在的问题在于 ctc_loss。谢谢!【参考方案2】:
将密集的numpy数组转换为tf.SparseTensor的简单代码:
def denseNDArrayToSparseTensor(arr):
idx = np.where(arr != 0.0)
return tf.SparseTensor(np.vstack(idx).T, arr[idx], arr.shape)
【讨论】:
【参考方案3】:注意contrib中有一个内置函数(取from)
【讨论】:
【参考方案4】:在 TF 2.3 中,Tensorflow Probability 对此有一个 function:
import tensorflow_probability as tfp
tfp.math.dense_to_sparse(x, ignore_value=None, name=None)
【讨论】:
【参考方案5】:Tensorflow 从 1.15 开始就有 tf.sparse.from_dense
。示例:
In [1]: import tensorflow as tf
In [2]: x = tf.eye(3) * 5
In [3]: x
Out[3]:
<tf.Tensor: shape=(3, 3), dtype=float32, numpy=
array([[5., 0., 0.],
[0., 5., 0.],
[0., 0., 5.]], dtype=float32)>
申请tf.sparse.from_dense
:
In [4]: y = tf.sparse.from_dense(x)
In [5]: y.values
Out[5]: <tf.Tensor: shape=(3,), dtype=float32, numpy=array([5., 5., 5.], dtype=float32)>
In [6]: y.indices
Out[6]:
<tf.Tensor: shape=(3, 2), dtype=int64, numpy=
array([[0, 0],
[1, 1],
[2, 2]])>
通过申请tf.sparse.to_dense
验证身份:
In [7]: tf.sparse.to_dense(y) == x
Out[7]:
<tf.Tensor: shape=(3, 3), dtype=bool, numpy=
array([[ True, True, True],
[ True, True, True],
[ True, True, True]])>
【讨论】:
如果对当前的 impl 感兴趣:source code以上是关于在python中怎样将rdf转化为稀疏张量的主要内容,如果未能解决你的问题,请参考以下文章