加载Tensorflow Saved_Model后,FailedPreconditionError:GetNext()失败

时间:2018-05-15 15:43:39

标签: python tensorflow tensorflow-datasets

我建立了一个专门的类来构建,训练,保存然后加载我的模型。使用tf.saved_model.simple_save保存,然后通过tf.saved_model.loader.load恢复。

使用数据集API完成培训和推理。使用训练有素的模型时一切正常。

但是,如果我恢复已保存的模型,则推理会中断并抛出此错误:

  

FailedPreconditionError(参见上面的回溯):GetNext()失败,因为迭代器尚未初始化。确保在获取下一个元素之前已经为此迭代器运行了初始化操作。

     

[[Node:datasets / cond / IteratorGetNext_1 = IteratorGetNextoutput_shapes = [[?,?,30],[?,5]],output_types = [DT_INT32,DT_INT32],_ device =“/ job:localhost / replica:0 /任务:0 /装置:CPU:0" ]]

我确定迭代器已初始化(print按预期显示,请参阅下面的代码)。可能它与图变量有关吗?还有其他想法吗?我有点被困在这里

(简化)代码

class Model():
    def __init__(self):
        self.graph = tf.Graph()
        self.sess = tf.Session(graph=self.graph)
        with self.graph.as_default():
            model.features_data_ph = tf.Placeholder(...)
            model.labels_data_ph = tf.Placeholder(...)

    def build(self):
        with self.graph.as_default():
            self.logits = my_model(self.input_tensor)
            self.loss = my_loss(self.logits, self.labels_tensor)

    def train(self):
        my_training_procedure()

    def set_datasets(self):
        with self.graph.as_default():
            with tf.variable_scope('datasets'):
                self.dataset = tf.data.Dataset.from_tensor_slices((self.features_data_ph, self.labels_data_ph))
                self.iter = self.dataset.make_initializable_iterator()
                self.input_tensor, self.labels_tensor = self.iter.get_next

    def initialize_iterators(self, inference_data):
        with self.graph.as_default():
            feats = inference_data
            labs = np.zeros((len(feats), self.hp.num_classes))
            self.sess.run(self.iter.initializer,
                feed_dict={self.features_data_ph: feats,
                    self.labels_data_ph: labs})
            print('Iterator ready to infer')

    def infer(self, inference_data):
        self.initialize_iterators(inference_data)
        return sess.run(self.logits)

    def save(self, path):
        inputs = {"features_data_ph": self.features_data_ph,
            "labels_data_ph": self.labels_data_ph}
        outputs = {"logits": self.model.logits}
        tf.saved_model.simple_save(self.sess, path)

    @staticmethod
    def restore(path):
        model = Model()
        tf.saved_model.loader.load(model.sess, [tag_constants.SERVING], path)
        model.features_data_ph = model.graph.get_tensor_by_name("features_data_ph:0")
        model.labels_data_ph = model.graph.get_tensor_by_name("labels_data_ph:0")
        model.logits = model.graph.get_tensor_by_name("model/classifier/dense/BiasAdd:0")
        model.set_datasets()
        return model

常规失败

model1 = Model()
model1.build()
model1.train()
model1.save(model1_path)

...

model2 = Model.restore(model1_path)
model2.infer(some_numpy_array) # Error here, after print, at sess.run()

(恢复模型有效,张量值在原始模型和恢复模型之间匹配)

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我认为问题是你正在初始化一个新的数据集对象而不是初始化随模型保存的迭代器。

尝试:

public abstract class Animal {
    ...
}

public abstract class Cat extends Animal {
    ...
}

public abstract class Dog extends Animal {
    ...
}

答案 1 :(得分:1)

我通过改变创建SELECT * FROM Project WHERE assigned_user_id='19x9'

的方式解决了这个问题
Dataset

那里有一段工作代码 - > https://vict0rsch.github.io/2018/05/17/restore-tf-model-dataset/

答案 2 :(得分:0)

一种简单的方法:在循环之前,添加一行代码:

tf.add_to_collection("saved_model_main_op",tf.group([train_iter], name='legacy_init_op'))

“ saved_model_main_op”是固定的。

train_iter是初始化迭代器的选择