在TensorFlow模型中重用训练后的权重而无需重新初始化

时间:2018-08-27 18:51:37

标签: python tensorflow

我有一个TensorFlow模型,大致类似于:

class MyModel():

def predict(self, x):
    with tf.variable_scope("prediction", reuse=tf.AUTO_REUSE):
        W_1 = tf.get_variable("weight", shape=[64,1], dtype=tf.float64)
        b_1 = tf.get_variable("bias", shape=[1], dtype=tf.float64)
        y_hat = tf.matmul(x, W_1) + b_1
    return y_hat


def train_step(self, x, y):
    with tf.variable_scope("optimization"):
        y_hat = self.predict(x)
        loss = tf.losses.mean_squared_error(y, y_hat)
        optimizer = tf.train.AdamOptimizer()
        train_step = optimizer.minimize(loss)
    return train_step


def __call__(self, x):
    return self.predict(x)

我可以像my_model = MyModel()那样实例化模型,然后使用sess.run(my_model.train_step(x, y))对其进行训练,但是如果我想在像sess.run(my_model.predict(x_new))这样的训练后在不同的张量上进行预测,我会得到一个{{1 }}。

似乎对象的FailedPreconditionError函数未按预期重新使用权重,而是向图形添加了新的权重,这些权重随后未初始化。有办法避免这种行为吗?

1 个答案:

答案 0 :(得分:2)

惯例是将权重定义为网络的属性,而不是将其定义为预测函数,对于优化器和train_step均具有相同的说明。也许会有所帮助,因为train_step = optimizer.minimize(loss)会查看整个图形。