偶尔为变量赋值(占位符与feed_dict)

时间:2017-04-23 14:44:30

标签: python machine-learning tensorflow

我有一个模型,我需要每N次迭代为权重(可训练变量)分配新的外部值。

我可以想到一些解决方案:

  1. 保存并恢复

    不好,因为我需要序列化,通过文件系统调用等(即使我使用像tmpfs这样的东西)

  2. 使用占位符和分配操作

    我会创建一个占位符并为每个可训练变量分配op。每次我想为权重分配一些内容时,我都会运行assign ops。

    但是,我知道这意味着我将被迫在每个feed_dict中考虑这些占位符并每次传递虚拟值 我在图中运行任何操作。

    此外,我将使用比必要更多的内存..

  3. 将feed_dict用于可训练变量并触发将每个变量分配给自身的操作?

    这有用吗?有什么缺点吗?

  4. 在编写某些内容之前,我认为提问是个好主意? 有效(内存/时间)为变量分配新外部值的推荐方法是什么?

3 个答案:

答案 0 :(得分:3)

你的第三个选项听起来是最好的选择。

您可以将值提供给tensors that aren’t placeholders

  

TensorFlow的Feed机制允许您将数据注入到任何Tensor中   计算图。因此,python计算可以直接提供数据   进入图表。

任何可喂食的张量都可以喂食。要检查张量是否可以进食,请使用:tf.Graph.is_feedable(tensor)

答案 1 :(得分:1)

您可以使用占位符分配操作。

  

每次在我的图表中运行任何操作时,我都会被迫在每个feed_dict中考虑这些占位符并传递虚拟值

     

此外,我将使用比必要更多的内存..

没有。运行assign操作时,只需要向占位符提供值。不要将分配操作作为训练图的一部分,只有在想要分配新值时才运行它们。

如果分配结果是瓶颈(对于小N,它可能会减慢您的程序),您可以考虑other methods将数据导入TensorFlow。

答案 2 :(得分:1)

在最新版本的Tensorflow Variable类中有load方法。它完全符合您的要求。

https://www.tensorflow.org/api_docs/python/tf/Variable#load