Python 类内Tensorflow图-如何管理会话和范围
我正试图构建一个封装在一个简单的单层NN类中的通用tensorflow基础设施(参见下面的代码) 我将创建许多NNET,因此我想知道管理会话和变量的最佳方法是什么 通常,我希望只为一个网络获取tf.trainable_variables(),而不是所有网络(在“show”函数中),以便打印所需的网络 我还必须将会话变量“sess”传递给每个函数,以便不重新初始化变量。 我想我没有把每件事都做好。。。有人能帮忙吗Python 类内Tensorflow图-如何管理会话和范围,python,class,tensorflow,Python,Class,Tensorflow,我正试图构建一个封装在一个简单的单层NN类中的通用tensorflow基础设施(参见下面的代码) 我将创建许多NNET,因此我想知道管理会话和变量的最佳方法是什么 通常,我希望只为一个网络获取tf.trainable_variables(),而不是所有网络(在“show”函数中),以便打印所需的网络 我还必须将会话变量“sess”传递给每个函数,以便不重新初始化变量。 我想我没有把每件事都做好。。。有人能帮忙吗 class oneLayerNN: """ Implements a 1 hid
class oneLayerNN:
"""
Implements a 1 hidden-layer neural network: y = W2 * ([W1 * x + b1]+) + b1
"""
def __init__(self, ...):
...
self.initOp = tf.global_variables_initializer()
def show(self, sess):
tvars = tf.trainable_variables()
tvals = sess.run(tvars)
for var, val in zip(tvars,tvals):
print(var.name, val)
print()
def initializeVariables(self, sess):
sess.run(self.initOp)
def forwardPropagation(self, sess, x):
labels = sess.run(self.yHat, feed_dict={self.x: x})
return labels
def train(self, sess, dataset, epochs, batchSize, debug=False, verbose=False):
dataset = dataset.batch(batchSize)
iterator = dataset.make_initializable_iterator()
next_element = iterator.get_next()
for epoch in range(epochs):
sess.run(iterator.initializer)
while True:
try:
batch_x, batch_y = sess.run(next_element)
_, c = sess.run([self.optimizer, self.loss], feed_dict={self.x: batch_x, self.y: batch_y})
except tf.errors.OutOfRangeError:
break
with tf.Session() as sess:
network.initializeVariables(sess)
network.show(sess)
这可能是一个品味和你打算如何使用你的物品的问题
如果您可以将对象限制为处理单个
tf.Session
(就像在Keras中一样-应该包括基本需求,可能还有一点超出),那么您可以通过首选的类似于单例的模式(可能只是像Keras中的普通旧函数)简单地实例化单个tf.Session
谢谢你的回答
但是,我仍然对变量的作用域存在问题。如何将变量定义为对象的一部分?我希望能够做到以下几点:
vars = network.getTrainableVariables()
这应该只返回在该对象中定义的变量(与tf.trainable_variables()不同)
在同时使用多个网络时,我找不到一个范围内干净声明变量的示例(例如,范围就是网络的名称)
当我多次运行代码时,它会创建变量W,b,然后W_1,b_1,然后W_2,b_2等等
另外,我希望network.initialize()仅初始化此图中定义的变量,而不是每个网络中的所有变量
解决方案是在“名称”范围内为网络声明变量,然后能够在此“名称”范围内重置默认图,但我不能这样做。我建议使用
tf.keras.Model
来管理状态。请看下面的图片。这里有使用Model.fit
的培训示例,但您也可以直接调用对象,它将在属性中为您收集变量和损失(变量
,可培训的_变量
,损失
,等等)
无论您做什么,我都会将模型定义(管理
变量对象的任何内容)从训练循环中分离出来。在定义模型时,变量
s应该是模型定义对象的属性,并且创建一次(不一定在\uuuu init\uuuu
中创建,但是如果self.attribute不是None,则受保护:self.attribute=tf.Variable(…)
。您可以执行sess=tf.Session()
,并将其作为类属性。您不必使用和
进行操作。