Skip to main content
 首页 » 编程设计

python之在 TensorFlow 模型中重用经过训练的权重而无需重新初始化

2024年09月07日26webabcd

我有一个大致如下所示的 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)) 这样的训练后预测不同的张量,我得到一个 FailedPreconditionError。

对象的 __call__ 函数似乎没有按预期重用权重,而是向图中添加了新的权重,然后这些权重未被初始化。有没有办法避免这种行为?

请您参考如下方法:

惯例是将权重定义为网络的属性,而不是在预测函数内部,优化器和 train_step 的注释相同。也许它会有所帮助,因为 train_step = optimizer.minimize(loss) 查看整个图表。