Tensorflow:将文件的全部内容恰好一次读入单个张量

Tensorflow: reading the entire contents of a file exactly once into a single tensor

我正在处理大约 300MB 的词嵌入数据(目前是一个 .npz,但我愿意完成翻译成任何格式的工作),我想知道是否有办法将该数据导入 tensorflow,不涉及在 python 中对其进行初始化(即从 numpy 数组初始化 tf.Variable)。

我想避免这种情况的原因是这样做会导致 tensorflow 在编写摘要时将我的嵌入与图形定义一起转储。参见 https://github.com/tensorflow/tensorflow/issues/1444

对于我的训练数据,我使用普通的 tensorflow reader 管道(TFRecordReader、文件名队列、tf.train.shuffle_batch)。这非常适合为预定义数量的纪元读取固定大小的示例批次。我不知道该怎么做是将文件的全部内容读入 单个张量 。我可以通过只读取一个完整大小的嵌入的单个批次来很容易地解决这个问题,但我想要一个更通用的解决方案,它不依赖于知道记录的数量,只依赖于单个记录格式。

实现此目的的最简单方法是创建一个 tf.Variable of the appropriate type and shape by initializing it from a tf.placeholder(),然后使用提要机制传入值。因此,实际值永远不会出现在图表本身中。

假设您的嵌入矩阵是 1000 x 100:

embedding_init = tf.placeholder(tf.float32, shape=[1000, 100])
embedding = tf.Variable(embedding_init)

然后您可以使用 .npz 文件中的值初始化该变量:

datafile = numpy.load("data.npz")
embedding_value = datafile["embedding"]

sess = tf.Session()
sess.run(tf.initialize_all_variables(),
         feed_dict={embedding_init: embedding_value})

datafile.close()