我有一个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)
看整个图表。