【问题标题】:Reuse variables and model encapsulated in class重用封装在类中的变量和模型
【发布时间】:2018-03-17 10:58:03
【问题描述】:

我想在 tensorflow 中训练一个模型,并且只定义一次图形和变量。因此,我在这个功能上毫无意义的最小示例中将其封装在一个类中,如下所示:

import tensorflow as tf
import numpy as np


class Model:
    weights = tf.get_variable("weights", (10, 1))
    bias = tf.get_variable("bias", 1)

    x = tf.placeholder(tf.float32, (100, 10), "x")
    y = tf.placeholder(tf.float32, 100, "y")

    output = tf.matmul(x, weights) + bias
    cost = tf.reduce_sum(tf.abs(output - y))
    optimizer = tf.train.MomentumOptimizer(0.5, 0.9).minimize(cost)

    def train(self, data, lbls):
        with tf.Session() as sess:
            sess.run(tf.global_variables_initializer())
            for i in range(10):
                _ = sess.run(self.optimizer, {self.x: data, self.y: lbls})

    def predict(self, data):
        with tf.Session() as sess:
            return sess.run(self.output, {self.x: data})


data = np.random.randint(0, 100, (100, 10))
lbls = np.random.randint(0, 1, (100, ))
mdl = Model()
mdl.train(data, lbls)
mdl.predict(data)

我希望预测函数能够重用经过训练的变量 self.weightsself.bias,但我得到的只是 FailedPreconditionError (see above for traceback): Attempting to use uninitialized value biasModel.predict() 函数的返回行中。

这对我来说听起来很简单,但我一定有一个错误的假设。 official Tensorflow tutorial 只是声明“显式传递 tf.Variable 对象”作为共享变量的一种方式。在我的理解中,将变量定义为类变量应该这样做。我已经广泛搜索,但找不到像这样的类的 tensorflow 的简单示例。 在我的实际项目中,我摆弄了变量范围 (tf.variable_scope(.., reuse=True)),这仍然会引发一个未初始化的变量警告,我只能通过初始化来解决这个问题,但当然,经过训练的变量会被重置。

这样的全班方法是错误的吗?如何在没有保护程序或其他更复杂结构的情况下简单地重用我的变量?还有:我对tensorflow变量、图表等的理解哪里错了?

【问题讨论】:

    标签: python oop tensorflow dry


    【解决方案1】:

    一般而言,您应该使用saver 保存模型然后加载它,但解决方法是将 tensorflow 会话也保存为变量,并将其用于训练和预测。

    import tensorflow as tf
    import numpy as np
    
    class Model:
        weights = tf.get_variable("weights", (10, 1))
        bias = tf.get_variable("bias", 1)
    
        x = tf.placeholder(tf.float32, (100, 10), "x")
        y = tf.placeholder(tf.float32, 100, "y")
    
        output = tf.matmul(x, weights) + bias
        cost = tf.reduce_sum(tf.abs(output - y))
        optimizer = tf.train.MomentumOptimizer(0.5, 0.9).minimize(cost)
        sess = tf.InteractiveSession()
        sess.run(tf.global_variables_initializer())
    
        def train(self, data, lbls):
            for i in range(10):
                _ = self.sess.run(self.optimizer, {self.x: data, self.y: lbls})
    
        def predict(self, data):
            return self.sess.run(self.output, {self.x: data})
    
    
    data = np.random.randint(0, 100, (100, 10))
    lbls = np.random.randint(0, 1, (100, ))
    mdl = Model()
    mdl.train(data, lbls)
    mdl.predict(data)
    

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 2014-07-02
      • 2017-08-28
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2011-09-27
      相关资源
      最近更新 更多