#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
. То, что я объяснял вам раньше, я уже пробовал…
У кого-нибудь есть какие-либо предложения по этому поводу?