如何创建encode_raw张量流函数?

时间:2017-04-13 23:22:48

标签: tensorflow

我试图执行与tf.decode_raw相反的操作。

一个例子将给出一个dtype = tf.float32的张量,我想有一个函数encode_raw()接受一个浮动张量并返回一个类型为字符串的Tensor。

这很有用,因为我可以使用tf.write_file来编写文件。

有没有人知道如何使用现有函数在Tensorflow中创建这样的函数?

2 个答案:

答案 0 :(得分:3)

我建议将数字用tf.as_string作为文字。但是,如果你真的想把它们写成二进制字符串,那么结果是可能的:

import tensorflow as tf

with tf.Graph().as_default():
  character_lookup = tf.constant([chr(i) for i in range(256)])
  starting_dtype = tf.float32
  starting_tensor = tf.random_normal(shape=[10, 10], stddev=1e5, 
                                     dtype=starting_dtype)
  as_string = tf.reduce_join(
      tf.gather(character_lookup,
                tf.cast(tf.bitcast(starting_tensor, tf.uint8), tf.int32)))
  back_to_tensor = tf.reshape(tf.decode_raw(as_string, starting_dtype),
                              [10, 10]) # Shape information is lost
  with tf.Session() as session:
    before, after = session.run([starting_tensor, back_to_tensor])
    print(before - after)

这对我来说打印出一个全零的数组。

答案 1 :(得分:2)

对于那些使用Python 3的人:

chr()在Python 3中有不同的行为,它改变了使用前一个答案的代码获得的字节输出。 替换此代码行

character_lookup = tf.constant([chr(i) for i in range(256)])

character_lookup = tf.constant([i.tobytes() for i in np.arange(256, dtype=np.uint8)])

解决了这个问题。