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

#python #tensorflow #keras

#python #tensorflow #keras

Вопрос:

Я хочу обучить конкретное условие GAN с некоторыми детерминированными ограничениями в конце моего генератора с помощью Keras и для этого мне нужно сначала вычислить вложения выходных данных моего генератора с помощью VGG-16 pre-trained model .

Я использую python 3.6 .

В моем вычислительном графике я хочу передать выходные данные моего генератора img в предварительно обученную модель VGG-16, чтобы получить вложения.

Тогда My img является тензором формы (None, 224, 224,3), поскольку я нахожусь в вычислительном графике. Дело в том, что если я скомпилирую следующее, я получу ошибку

При подаче символьных тензоров в модель мы ожидаем, что тензоры будут иметь статический размер пакета. Получен тензор с формой: (Нет, 224, 224, 3)

 self.vgg = self.build_vgg()

def build_vgg(self):
    vgg16_model = keras.applications.vgg16.VGG16()
    return Model(inputs=vgg16_model.input,outputs=vgg16_model.get_layer('fc2').output)

        #-------------------------------
    # Construct Computational Graph
    #         for Generator
    #-------------------------------

    # For the generator we freeze the critic's layers
    self.critic.trainable = False
    self.generator.trainable = True
    self.vgg.trainable = False


    # Sampled noise for input to generator
    noise = Input(shape=(self.latent_dim,))

    # Input Embedding:
    embedding = Input(shape=(self.embedding,))


    # Generate images based of noise

    img = self.generator([noise,embedding])

    # Discriminator determines validity

    valid = self.critic(img)

    # Get the embeddings from vgg-16:
    X = self.vgg.predict(img)
  

Очевидно, что я не могу выполнить цикл по первой оси, поскольку у нее нет индекса. Я попытался применить функцию к этому тензору ‘img’, используя функцию tensorflow ‘tf.map_fn’ следующим образом :

     def Embedding(self,img):
    fn = lambda x: self.vgg.predict(preprocess_input(np.expand_dims(x, axis=0))).flatten()
    embedding = tf.map_fn(fn,img,dtype=tf.float32)
    return embedding

        #-------------------------------
    # Construct Computational Graph
    #         for Generator
    #-------------------------------

    # For the generator we freeze the critic's layers
    self.critic.trainable = False
    self.generator.trainable = True
    self.vgg.trainable = False

    # Sampled noise for input to generator
    noise = Input(shape=(self.latent_dim,))

    # Input Embedding:
    embedding = Input(shape=(self.embedding,))


    # Generate images based of noise

    img = self.generator([noise,embedding])

    # Discriminator determines validity

    valid = self.critic(img)

    # Get the embeddings from VGG16
    X = self.Embedding(img)
  

Но я получаю следующую ошибку:

Ошибка значения: установка элемента массива с последовательностью.

Подводя итог, я хочу применить pre-trained VGG-16 model к tensor с помощью shape (None, 224,224,3) вдоль оси Batch_Size (0) в вычислительном графике в Keras . То, что я объяснял вам раньше, я уже пробовал…

У кого-нибудь есть какие-либо предложения по этому поводу?