Tensorflow优化器变量初始化之谜和SIGKILL无处不在

时间:2017-03-28 18:48:49

标签: python optimization tensorflow initialization out-of-memory

我正在尝试构建自己的tensorflow优化器,使其成为Optimizer类的子类。但是在尝试使用它时遇到了问题。

如果我尝试正常使用它,它告诉我我的模型的一个变量(不是优化器变量)没有被初始化但是如果我使用另一个优化器那么这个问题就不会发生了所以很明显我正在初始化那个变量正确,问题在于我的优化器。而且非常奇怪的是,它失败了

tfsession.run(tf.global_variables_initializer())

我收到错误:

  

2017-03-28 21:21:29,422 FailedPreconditionError

     

2017-03-28 21:21:29,423:

     

2017-03-28 21:21:29,423尝试使用未初始化的值解码器/ dec_5 / fc / W        [[节点:decoder / dec_5 / fc / W / read = IdentityT = DT_FLOAT,_class = [“loc:@ decoder / dec_5 / fc / W”],_ device =“/ job:localhost / replica:0 / task:0 / CPU:0" ]]

所以它试图在初始化变量期间使用变量......这怎么可能?!

所以无论如何,如果我试图通过首先确定模型的所有变量然后初始化其余变量来解决问题,我会得到甚至更奇怪的东西:终止信号从天空中无意中击落!!

具体而言,我将初始化分为:

    tfsession.run(tf.variables_initializer([gs]))
    logger.info("POINT 1")
    tfsession.run(tf.variables_initializer(tf.trainable_variables()))
    logger.info("POINT 2")
    tfsession.run(tf.variables_initializer([v for v in tf.global_variables() if v not in tf.trainable_variables()+[gs]]))
    logger.info("POINT 3")

gs是优化器的全局步骤,由于某些原因,显然某些优化器必须在其他变量之前初始化)

当我运行时,这给了我以下内容:

  

2017-03-28 21:42:52,799初始化变量

     

2017-03-28 21:42:58,345 POINT 1

     

2017-03-28 21:42:58,840 POINT 2

     

使用退出代码137完成处理(由信号9中断:SIGKILL)

我得到了一个无处不在的SIGKILL!?!我究竟做错了什么?

更新

感谢@mrry的回答:https://stackoverflow.com/a/36016117/3990607 我能够弄清楚当我在优化器中初始化依赖于可训练变量v的变量时,我应该使用v.initialized_value()而不是v

以下是我在优化器中创建变量的方法:

def _create_slots(self, var_list):
    if (self._Rt is None or
                self._Rt.graph is not var_list[0].graph):
        with ops.colocate_with(var_list[0]):
            self._Rt = linalg_ops.eye(self.y_dim, dtype=np.float32,
                                   name="R") / self._lr


    for v in var_list:
        self._get_or_make_slot(v, linalg_ops.eye(gen_array_ops.size(v.initialized_value()),
                                              dtype=v.dtype.base_dtype) * self.Q, "Q", self._name)
        self._get_or_make_slot(v, linalg_ops.eye(gen_array_ops.size(v.initialized_value()),
                                              dtype=v.dtype.base_dtype) * self.P0, "P", self._name)

我认为这解决了一些问题,因为现在我使用

初始化变量
tfsession.run(tf.global_variables_initializer())

我直接传递给前面提到的SIGKILL错误。

更新2:

这似乎是某种内存问题。当我看到/var/log/system.log在它死亡时发生的事情时,我看到了:

  

kernel [0]:低交换:杀死pid 68269(python3.5)

     

kernel [0]:memorystatus_thread:idle exiting pid 18384 [com.apple.audio。]

     

com.apple.CDScheduler [265]:热压状态:1记忆压力状态:0   com.apple.CDScheduler [44]:热压状态:1记忆压力状态:0 com.apple.CDScheduler [265]:热压状态:0记忆压力状态:0   com.apple.CDScheduler [44]:热压状态:0记忆压力   州:0

0 个答案:

没有答案