У меня есть обученный дискриминатор , который может различать реальные и поддельные изображения с точностью 97% . Теперь я хочу обучить генератор, который заставляет регенерировать реальные изображения в виде поддельных изображений. Допустим, дискриминатор дает 1 для реального изображения и 0 для поддельного изображения. Основываясь на потере дискриминатора, я хочу обучить генератор для получения желаемого результата. Может ли кто-нибудь помочь мне с этим, я делаю правильно или где я не прав.
Структура моего кода следующая для GANS .
def construct_discriminator(X,Y):
discriminator=trained_model.evaluate(X,Y,verbose=0)
return discriminator
# Creates the generator model. This model has an input of random noise and generates an image that will try mislead the discriminator.
def construct_generator(image_shape):
generator = Sequential()
# First Downscaling The Real Image and trying to produce a Fake Image
Downscale Layer 1
Downscale Layer 2
Downscale Layer 3
#Upscaling
Upscale Layer 1
Upscale Layer 2
Upscale Layer 3
optimizer = Adam(lr=0.00015, beta_1=0.5)
generator.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=None)
generator.summary()
return generator
def train_dcgan(batch_size, epochs, image_shape, labels):
# Build the adversarial model that consists in the generator output
connected to the discriminator
generator = construct_generator(image_shape)
discriminator=construct_discriminator(image_shape, labels)
gan = Sequential()
# Only false for the adversarial model
discriminator.trainable = False
gan.add(generator)
gan.add(discriminator)
number_of_batches = int(len(Fake_Images)/ batch_size)
# Let's train the DCGAN for n epochs
for epoch in range(epochs):
print("Epoch " + str(epoch+1) + "/" + str(epochs) + " :")
for batch_number in range(number_of_batches):
start_time = time.time()
# The last batch is smaller than the other ones, so we need to take that into account
noise = random_batch(batch_size,Fake_Images)
labels=(np.zeros(batch_size))
labels=labels.reshape(-1,)
noise=noise.reshape(-1, 304, 304, 1)
# Generate images
generated_images = generator.predict(noise)
g_loss=discriminator(noise,labels)
# We try to mislead the discriminator by giving the opposite labels
g_loss += gan.train_on_batch(noise, labels)
time_elapsed = time.time() - start_time
# Display and plot the results
print("Batch " + str(batch_number + 1) + "/" + str(number_of_batches) + " generator loss | discriminator loss : " + str(g_loss) + " | " +
str(d_loss) + ' - batch took ' + str(time_elapsed) + ' s.')
def main():
batch_size = 16
image_shape = (304, 304, 1)
labels=(16,)
epochs = 200
train_dcgan(batch_size, epochs,image_shape,labels)
if __name__ == "__main__":
main()
Это дает мне ошибку: объект 'tuple' не имеет атрибута 'ndim'