как работать с сеансами/несколькими моделями в Keras

#python #tensorflow #keras #deep-learning #gpu

Вопрос:

У меня есть две модели, которые мне нужно загрузить и использовать в сценарии для прогнозирования. Я уже читал, что для загрузки и прогнозирования нескольких моделей при использовании одного графического процессора необходимо использовать сеансы.

Я попробовал этот пример, но он не работает. В примере автор загружает модель из json и затем загружает веса, я всегда просто загружал модель, а затем использовал predict() функцию, но я получаю эту ошибку:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Node 'training/Adam/gradients/dropout_5/cond_grad/StatelessIf': Connecting to invalid output 1 of source node dropout_5/cond which has 1 outputs. Try using tf.compat.v1.experimental.output_all_intermediates(True).

До сих пор это мой код:

         graph1 = Graph()
        with graph1.as_default():
            session1 = Session()
            with session1.as_default():
                scratch_model = load_model("C:\Users\but\PycharmProjects\OpticalDieInspection\ScratchModel.h5")

        graph2 = Graph()
        with graph2.as_default():
            session2 = Session()
            with session2.as_default():
                broken_edge_model = load_model("C:\Users\but\PycharmProjects\OpticalDieInspection\brokenEdgeModel.h5")

        with self.graph1.as_default():
            with self.session1.as_default():
                output_scratch = scratch_model.predict(scratch_input_image)

        with self.graph2.as_default():
            with self.session2.as_default():
                output_broken_edge = broken_edge_model.predict(broken_edge_input_image)

        #scratch_model = load_model("C:\Users\but\PycharmProjects\OpticalDieInspection\ScratchModel.h5")
        #output_scratch = scratch_model.predict(scratch_input_image)
        #be.clear_session()
        #broken_edge_model = load_model("C:\Users\but\PycharmProjects\OpticalDieInspection\brokenEdgeModel.h5")
        #output_broken_edge = broken_edge_model.predict(broken_edge_input_image)

        if output_scratch[0][0] > output_scratch[0][1]:
            #print(output_scratch[0][0], "Scratch")
            part_state_scratch = "NOK"
        else:
            #print(output_scratch[0][1], 'OK')
            part_state_scratch = "OK"

        if output_broken_edge[0][0] > output_broken_edge[0][1]:
            #print(output_broken_edge[0][0], "BrokenEdge")
            part_state_broken_edge = "NOK"
        else:
            #print(output_broken_edge[0][1], 'OK')
            part_state_broken_edge = "OK"


        if part_state_scratch == "OK" and part_state_broken_edge == "OK":
            ok_dest = os.path.join(ok_dir, os.path.basename(image_files[i]))
            copyfile(image_files[i], ok_dest)
            good_parts_cnt  = 1
        elif part_state_scratch == "NOK" and part_state_broken_edge == "OK":
            nok_dest = os.path.join(scratch_dir, os.path.basename(image_files[i]))
            copyfile(image_files[i], nok_dest)
            bad_parts_cnt  = 1
        elif part_state_scratch == "OK" and part_state_broken_edge == "NOK":
            nok_dest = os.path.join(broken_edge_dir, os.path.basename(image_files[i]))
            copyfile(image_files[i], nok_dest)
            bad_parts_cnt  = 1
        else:
            nok_dest = os.path.join(broken_edge_dir, os.path.basename(image_files[i]))
            copyfile(image_files[i], nok_dest)
            nok_dest = os.path.join(scratch_dir, os.path.basename(image_files[i]))
            copyfile(image_files[i], nok_dest)
            bad_parts_cnt  = 1