Как скормить предварительно обученную модель keras на вычислительный граф?

в последнее время я играл с CNN, написанными в Керасе, TF. К сожалению, я столкнулся с одной проблемой:

В этих великолепных руководствах (https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/vgg16.py; остальной код здесь), что я очень рекомендую, маэстро загружает предварительно обученную модель vgg16.tf очень и очень уродливо.

def __init__(self):
    # Now load the model from file. The way TensorFlow
    # does this is confusing and requires several steps.

    # Create a new TensorFlow computational graph.
    self.graph = tf.Graph()

    # Set the new graph as the default.
    with self.graph.as_default():

        # TensorFlow graphs are saved to disk as so-called Protocol Buffers
        # aka. proto-bufs which is a file-format that works on multiple
        # platforms. In this case it is saved as a binary file.

        # Open the graph-def file for binary reading.
        path = os.path.join(data_dir, path_graph_def)
        with tf.gfile.FastGFile(path, 'rb') as file:
            # The graph-def is a saved copy of a TensorFlow graph.
            # First we need to create an empty graph-def.
            graph_def = tf.GraphDef()

            # Then we load the proto-buf file into the graph-def.
            graph_def.ParseFromString(file.read())

            # Finally we import the graph-def to the default TensorFlow graph.
            tf.import_graph_def(graph_def, name='')

            # Now self.graph holds the VGG16 model from the proto-buf file.

        # Get a reference to the tensor for inputting images to the graph.
        self.input = self.graph.get_tensor_by_name(self.tensor_name_input_image)

        # Get references to the tensors for the commonly used layers.
        self.layer_tensors = [self.graph.get_tensor_by_name(name + ":0") for name in self.layer_names]

И проблема в том, что я хочу, чтобы моя собственная предварительно обученная модель загружалась таким же / похожим образом, поэтому я могу поместить модель в граф класса, который я вызываю позже, и, если возможно, получить последние строки кода здесь работающими . (Имеется в виду получение тензоров требуемых слоев из графика.)

Все мои попытки основаны на load_model, импортированном из keras и comp. Граф подвел меня. Также я не хотел загружать его совершенно по-другому, потому что мне пришлось бы потом менять МНОГО кода - для новичков большая проблема.

Хорошо, я надеюсь, что вопрос дойдет до нужного человека, а также что для вас он не будет слишком тривиальным: D.

Кстати: сложная проблема, которую я решаю, для вас - это перенос стилей также в том же репозитории github. (https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/15_Style_Transfer.ipynb)


person Nuwanda    schedule 01.11.2018    source источник


Ответы (1)


Итак, вы хотите в основном загрузить модель keras в тензорный поток? Это легко сделать с помощью следующего кода:

import keras.backend as k
from keras.models import load_model
import tensorflow as tf

model = load_model("your model.h5")  # now it's in the memory of keras
with k.get_session() as sess:
    # here you have a tensorflow computational graph, view it by:
    tf.summary.FileWriter("folder name", sess.graph)

    # if you need a certain tensor do:
    sess.graph.get_tensor_by_name("tensor name") 

Чтобы немного узнать о функции get_session, нажмите здесь

для просмотра графика вам необходимо загрузить в папку из FileWriter с помощью тензорной доски, подобной этой:

tensorboard --logdir path/to/folder

Надеюсь, это помогло, удачи!

person T. Kelher    schedule 01.11.2018
comment
Спасибо за ответ, я понятия не имел, что вы можете такое сделать. Я уверен, что когда-нибудь им воспользуюсь в ближайшем будущем! На самом деле я до сих пор не могу найти способ включить вашу идею в свой код. Позже в коде я много раз использую тензоры слоев из CNN в качестве атрибута класса CNN. Например, model.input_tensor; model.get_layer_tensors и т. д. Как вы думаете, можно ли поместить данные из модели keras, которые мы можем получить, в self.graph упомянутого класса CNN, который используется для передачи стилей? Еще раз спасибо за ваше время, я очень ценю помощь :-) - person Nuwanda; 02.11.2018
comment
Я не думаю, что полностью понимаю ваш вопрос, но если вы хотите знать, можете ли вы использовать модель keras для передачи данных в другую модель тензорного потока, тогда да. Просто получите выходной и входной тензор модели keras и передайте выходной тензор в другую сеть, одновременно подавая данные во входной тензор. - person T. Kelher; 03.11.2018