如何在张量流中填充不规则形状张量(纯TF方式)?

时间:2017-09-10 04:03:18

标签: python tensorflow tensorflow-serving

{{1}}

聚苯乙烯。请不要使用纯python& numpy

因为我需要将此操作添加到我的TF模型图中,所以可能需要用纯TF方式完成操作?

2 个答案:

答案 0 :(得分:1)

我假设你的起始张量的类型是SparseTensor。 (我认为不可能有一个具有'不规则形状'的密集张量。如果类型甚至不是张量,那么你不需要“纯粹的TF方式”)

使用以下内容:

    dense = tf.sparse_tensor_to_dense(sparse_tensor_input, default_value=-1)

https://www.tensorflow.org/api_docs/python/tf/sparse_tensor_to_dense

如果希望密集张量的形状与输入稀疏张量不同,则可以在调用此函数之前更改后者的形状,或使用较低级别的函数https://www.tensorflow.org/api_docs/python/tf/sparse_to_dense

答案 1 :(得分:0)

最近我遇到了同样的问题,并且我用了一点技巧解决了这个问题(即使这篇文章已经发表了将近一年,也许有人遇到了同样的问题)。

首先,TensorFlow无法将该数组转换为密集张量,因此我将数组连接为字符串列表,例如a = ['2','1,2,3','4,5']

然后使用纯TF代码分割此字符串,这是简单的代码:

def pad_length(sequence, limited_len):
    seq_sparse = tf.string_split(sequence, ',')
    seq_dense = tf.sparse_to_dense(
        seq_sparse.indices, seq_sparse.dense_shape, tf.cast(tf.string_to_number(seq_sparse.values), tf.int32)
    )
    seq_slice = tf.strided_slice(seq_dense, [0, 0], [tf.shape(sequence)[0], limited_len])
    pad_dense = tf.pad(seq_slice, paddings=[[0, 0], [0, limited_len - tf.shape(seq_slice)[1]]])
    return pad_dense

a = ['2','1,2,3','4,5']
a = tf.convert_to_tensor(a)
b = pad_length(a, 3)

sess=tf.Ssssion()
sess.run(b)

"""
b => array([
   [2, 0, 0],
   [1, 2, 3],
   [4, 5, 0]
], dtype=int32)
"""

干杯!