Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类内Tensorflow图-如何管理会话和范围_Python_Class_Tensorflow - Fatal编程技术网

Python 类内Tensorflow图-如何管理会话和范围

Python 类内Tensorflow图-如何管理会话和范围,python,class,tensorflow,Python,Class,Tensorflow,我正试图构建一个封装在一个简单的单层NN类中的通用tensorflow基础设施(参见下面的代码) 我将创建许多NNET,因此我想知道管理会话和变量的最佳方法是什么 通常,我希望只为一个网络获取tf.trainable_variables(),而不是所有网络(在“show”函数中),以便打印所需的网络 我还必须将会话变量“sess”传递给每个函数,以便不重新初始化变量。 我想我没有把每件事都做好。。。有人能帮忙吗 class oneLayerNN: """ Implements a 1 hid

我正试图构建一个封装在一个简单的单层NN类中的通用tensorflow基础设施(参见下面的代码)

我将创建许多NNET,因此我想知道管理会话和变量的最佳方法是什么

通常,我希望只为一个网络获取tf.trainable_variables(),而不是所有网络(在“show”函数中),以便打印所需的网络

我还必须将会话变量“sess”传递给每个函数,以便不重新初始化变量。 我想我没有把每件事都做好。。。有人能帮忙吗

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()
,并将其作为类属性。您不必使用
进行操作。