如何获得稀疏张量的形状并将其转换为列表?

时间:2017-11-05 16:50:26

标签: python python-2.7 python-3.x tensorflow

我有一些从文件中读取数据的代码,并将它们用作张量流网络的输入。

import tensorflow as tf
reader = tf.TFRecordReader()
filename_queue = tf.train.string_input_producer(['/home/stuart/Desktop/tfrecords/m_6803.tfrecords'])
_, serialized_example = reader.read(filename_queue)
features = tf.parse_single_example(
    serialized_example,
    features={
        'label': tf.FixedLenFeature([], tf.string),
        'user_behavior': tf.VarLenFeature(tf.float32),
    })
label = tf.cast(tf.decode_raw(features['label'], tf.uint8), tf.float32)
user_behavior = tf.cast(features['user_behavior'], tf.float32)
sess = tf.Session()
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
print(user_behavior.get_shape().as_list()) # output: [None]
print(sess.run(tf.shape(user_behavior)) # output: (376), type: Tensor("Shape/Cast:0", shape=(1,), dtype=int32)

现在我需要得到张量的形状&user #behavior'因为它与文件不同(我有多个文件要阅读,虽然这里只有一个)。然后使用形状来定义权重矩阵。 sess.run(tf.shape())可以正常工作,但它会将形状作为张量返回,但tf.Variable([], shape=[])无法使用,因为此处的shape需要列表。虽然我知道tensor.get_shape().as_list()会返回一个列表,但由于我使用tf.VarLenFeature(),它会创建一个稀疏张量。如果我在其上使用此方法,则输出将为[无]。那么有没有办法获得这个稀疏张量的形状并用它来定义另一个张量的形状?

1 个答案:

答案 0 :(得分:0)

因为user_behavior是一种varlen功能。经过tf.parse_single_example方法后它将变成稀疏张量。然后您可以通过user_behavior.dense_shape方法轻松获得形状。有关详细说明,请参阅: https://www.tensorflow.org/api_docs/python/tf/sparse/SparseTensor