Python 在Tensorflow 1.9中的一个脚本中运行不同的模型

Python 在Tensorflow 1.9中的一个脚本中运行不同的模型,python,python-3.x,tensorflow,Python,Python 3.x,Tensorflow,我有一个非常简单的模型,它由一个tf.Variable()组成,下面是who代码: import tensorflow as tf save_path="model1/model1.ckpt" num_input = 2 n_nodes_hl1 = 2 with tf.variable_scope("model1"): hidden_1_layer = { 'weights' : tf.Variable(tf.random_normal([n

我有一个非常简单的模型,它由一个
tf.Variable()
组成,下面是who代码:

import tensorflow as tf

save_path="model1/model1.ckpt"

num_input = 2
n_nodes_hl1 = 2

with tf.variable_scope("model1"):
        hidden_1_layer = {
                'weights' : tf.Variable(tf.random_normal([num_input, n_nodes_hl1]), name='Weight1')
        }

def train_model():
    init = tf.global_variables_initializer()
    with tf.Session() as sess:
        sess.run(init)
        save_model(sess)

def save_model(sess):
    saver = tf.train.Saver(tf.global_variables(), save_path)
    saver.save(sess, save_path)

def load_model(sess):
    saver = tf.train.Saver(tf.global_variables(), save_path)
    saver.restore(sess, save_path)

def run_model():
    print("model1 running...")
    with tf.Session() as sess:
        load_model(sess)
        x = sess.run(hidden_1_layer)
        print(x)

#train_model() 
第二个模型是完全相同的,但名称从“model1”更改为“model2”。这两个模型都经过训练、保存,并且可以分别完美地工作。现在我想用以下脚本测试它们:

import model1 as m1
import model2 as m2

m1.run_model()
m2.run_model()
这里我得到了一条错误信息:

NotFoundError (see above for traceback): Key model2/Weight2 not found in checkpoint
因此,运行导入似乎会导致将所有变量添加到公共图中(即使它们位于单独的变量范围内),然后无法从model1的检查点中找到保存在model2中的变量。 有人能解决我的问题吗? 在Tensorflow中,是否可以在一个脚本中运行几个不同的模型

编辑-问题已解决 解决办法很简单。您需要做的是为每个模型创建单独的图形,如。这意味着您声明或计算的所有张量都必须在该图中。您还必须将其作为会话中的参数,例如:
tf.Session(graph=self.graph)
整个例子如下:

import tensorflow as tf

save_path="model1/model1.ckpt"
class model1:
    num_input = 2
    n_nodes_hl1 = 2

    def init(self):
        self.graph = tf.Graph()
        with self.graph.as_default():
            with tf.variable_scope("model1"):
                    self.hidden_1_layer = {
                            'weights' : tf.Variable(tf.random_normal([self.num_input, self.n_nodes_hl1]), name='Weight1')
                    }

    def train_model(self):
        init = tf.global_variables_initializer()
        with tf.Session(graph = self.graph) as sess:
            sess.run(init)
            self.save_model(sess)

    def save_model(self, sess):
        saver = tf.train.Saver(tf.global_variables(), save_path)
        saver.save(sess, save_path)

    def load_model(self, sess):
        saver = tf.train.Saver(tf.global_variables(), save_path)
        saver.restore(sess, save_path)

    def run_model(self):
        print("model1 running...")
        with tf.Session(graph = self.graph) as sess:
            self.load_model(sess)
            x = sess.run(self.hidden_1_layer)
            print(x)
哦!!常见的“我想使用几种型号”问题!只需确保在每个模型之后重置图形:

tf.reset_default_graph()
您的代码如下所示:

import tensorflow as tf

import model1 as m1
m1.run_model()

tf.reset_default_graph()

import model2 as m2
m2.run_model()
为什么?当您使用
tf.variable
在tensorflow中创建变量时,该变量将添加到默认图形中。如果您一个接一个地导入两个模型,那么您只需在默认图形中创建所有变量!这是迄今为止最简单的解决方案。把默认图形看作黑板:你可以画出你喜欢的ML模型,但是你需要在重新使用之前把它擦干净!p> 注意:如果您想知道,另一种方法是为每个模型创建单独的图表,但这更令人担忧,我只建议您在必须同时拥有两个模型的时候使用

额外:将模型封装在Tensorflow类中 一种更为奇特的方法是在避免几个图形的同时(说真的,这很可怕!)将整个模型封装在一个类中。因此,您的代码如下所示:

import tensorflow as tf

class model():
    self.num_input = 2
    self.n_nodes_hl1 = 2
    def init(self, new_save_path)
        self.save_path=new_save_path

        tf.reset_default_graph()

        with tf.variable_scope("model1"):
            self.hidden_1_layer = {
                    'weights' : tf.Variable(tf.random_normal([self.num_input,
                                self.n_nodes_hl1]), name='Weight1')
            }
        self.saver = tf.train.Saver(tf.global_variables(), self.save_path)
        self.sess = tf.Session()
        self.sess.run(tf.global_variables_initializer())

    def save_model(self):
        self.saver.save(self.sess, self.save_path)

    def load_model(self):
        self.saver.restore(self.sess, self.save_path)

    def run_model(self):
        print("model1 running...")
        load_model()
        x = sess.run(self.hidden_1_layer)
        print(x)

    #train_model(self) 
这样,您可以简单地执行以下操作:

import model

m1 = model('model1/model1.ckpt') # These two lines could be put into one
m1.run_model()                   #  m1 = model('model1/model1.ckpt').run_model()

m2 = model('model2/model2.ckpt')
m2.run_model()
您仍然希望它处于for循环中吗

import model

model_file_list = ['model1/model1.ckpt', 'model2/model2.ckpt']

for model_file in model_list:
    m = model(model_file ).run_model()
    # Run tests, print stuff, save stuff here!

嗯,我试着用不同的组合来做,但不幸的是,它仍然不起作用。若是,我不会将其发布到堆栈:)好的,但很明显,在运行模型后导入是有效的。我希望在代码中的一个地方有导入。然后我建议您使用单独的图形!现在开始:我建议另一种选择:您可以将整个模型封装在一个类中,并像这样使用它,在创建对象时运行
tf.reset\u default\u graph()
。我会在这个答案中告诉你。这样你也可以避免代码重复。我有几个不同的模型来解决相同的问题,但方式不同。我想比较它们,所以我创建了一个简单的工具来比较,我想在一个循环中逐个运行每个模型。