重用封装在 class 中的变量和模型
Reuse variables and model encapsulated in class
我想在 tensorflow 中训练一个模型,并且只定义一次图形和变量。因此,我将其封装在 class 中,如下所示,在这个功能上毫无意义的最小示例中:
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.weights
和 self.bias
但我得到的只是 [=15= 的 return 行中的 FailedPreconditionError (see above for traceback): Attempting to use uninitialized value bias
] 函数。
这对我来说听起来很简单,但在某些地方我一定有错误的假设。 official Tensorflow tutorial 只是将 "Explicitly passing tf.Variable objects around" 声明为共享变量的一种方式。根据我的理解,将变量定义为 class 变量应该可以做到这一点。我在谷歌上进行了大量搜索,但找不到像这样的带有 classes 的张量流的简单示例。
在我的实际项目中,我摆弄了变量范围 (tf.variable_scope(.., reuse=True)
),这仍然会给我一个未初始化的变量警告,我只能通过初始化来修复它,当然,然后训练的变量会被重置。
这样的整个class方法是错误的吗?在没有保护程序或其他更复杂的结构的情况下,如何简单地重用我的变量?还有:我对tensorflow变量、图表等的理解哪里错了?
一般来说,您应该使用 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)
我想在 tensorflow 中训练一个模型,并且只定义一次图形和变量。因此,我将其封装在 class 中,如下所示,在这个功能上毫无意义的最小示例中:
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.weights
和 self.bias
但我得到的只是 [=15= 的 return 行中的 FailedPreconditionError (see above for traceback): Attempting to use uninitialized value bias
] 函数。
这对我来说听起来很简单,但在某些地方我一定有错误的假设。 official Tensorflow tutorial 只是将 "Explicitly passing tf.Variable objects around" 声明为共享变量的一种方式。根据我的理解,将变量定义为 class 变量应该可以做到这一点。我在谷歌上进行了大量搜索,但找不到像这样的带有 classes 的张量流的简单示例。
在我的实际项目中,我摆弄了变量范围 (tf.variable_scope(.., reuse=True)
),这仍然会给我一个未初始化的变量警告,我只能通过初始化来修复它,当然,然后训练的变量会被重置。
这样的整个class方法是错误的吗?在没有保护程序或其他更复杂的结构的情况下,如何简单地重用我的变量?还有:我对tensorflow变量、图表等的理解哪里错了?
一般来说,您应该使用 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)