Как исправить «Вы должны указать значение для тензора-заполнителя» при работе с GAN-фреймворком? - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь реализовать GAN с Keras (Tensorflow backend), чтобы раскрасить изображение.У моего генератора есть входное изображение в серой шкале, в то время как у моего дискриминатора есть и серая шкала, и цветное изображение в качестве входных данных.

Как я могу обучить свой генератор без ошибки

"InvalidArgumentError: Вы должны передать значение для тензора-заполнителя 'input_2' с плавающей точкой dtype и формой [?, 128,128,1] [[{{node input_2}}]] [[{{node метрики / acc / Mean_2}}]]]"

Я пробовал разные способы создания комбинированной модели (используемой для обучения генератора), но безуспешно.Я использую Python 3.6.7 и Keras 2.2.4.

import numpy as np

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Conv2D, BatchNormalization, Activation, AveragePooling2D, Dense, Dropout, Flatten, Lambda, MaxPool2D, Conv2DTranspose, UpSampling2D, Concatenate, Add
from tensorflow.keras import optimizers
from keras.preprocessing import image

def combine_generator(gen1, gen2):
    while True:
        yield(gen1.next(), gen2.next())

def generator_model(input_img):   
    outputs = Conv2D(3, (1, 1), activation='sigmoid') (input_img)
    model = Model(inputs=[input_img], outputs=[outputs])
    return model

def discriminator_model(output_img, input_img):
    a1 = Concatenate()([output_img, input_img])
    f1 = Flatten()(a1)
    output = Dense(1, activation='sigmoid')(f1)
    model = Model(inputs=[output_img, input_img], outputs=[output])
    return model

def generator_containing_discriminator(input_img, generator, discriminator):
    goutput = generator(input_img)
    discriminator.trainable=False
    doutput = discriminator([goutput, input_img])
    model = Model(inputs=[input_img], outputs=[doutput])
    return model

seed = 123456
input_size = 128
batch_size = 8
learning_rate = 1e-3
optimizer = optimizers.Adam(lr=learning_rate)

dir_train_img = "flowers_train"
data_gen = dict(rescale=1./255)
image_datagen = image.ImageDataGenerator(**data_gen)

color_generator_train = image_datagen.flow_from_directory(dir_train_img, batch_size=batch_size, class_mode=None, target_size=(input_size, input_size), color_mode="rgb", seed=seed)
gray_generator_train = image_datagen.flow_from_directory(dir_train_img, batch_size=batch_size, class_mode=None, target_size=(input_size, input_size), color_mode="grayscale", seed=seed)
train_generator = combine_generator(color_generator_train, gray_generator_train)

dmodel = discriminator_model(Input((input_size, input_size, 3)), Input((input_size, input_size, 1)))
dmodel.compile(optimizer=optimizer, loss="binary_crossentropy", metrics=["accuracy"])
dmodel.summary()

gmodel = generator_model(Input((input_size, input_size, 1)))
gmodel.summary()

gdmodel = generator_containing_discriminator(Input((input_size, input_size, 1)), gmodel, dmodel)
gdmodel.compile(optimizer=optimizer, loss="binary_crossentropy", metrics=["accuracy"])
gdmodel.summary()

dmodel.trainable=False

train_batch = next(train_generator)
labels2 = np.array([1]*len(train_batch[1]))
gdmodel.train_on_batch(train_batch[1], labels2)

Как показано в сводке, input_2 соответствует входному изображению серой шкалы дискриминатора, но я не знаю, гдепроблема исходит от

1 Ответ

0 голосов
/ 01 июня 2019

Проблема исчезает, когда я удаляю параметр метрики = ["точность"] из строки:

gdmodel.compile(optimizer=optimizer, loss="binary_crossentropy", metrics=["accuracy"])

Хотя я не знаю почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...