нейросеть gan на keras не тренируется

Я полный новичок в нейросетях и keras. Делал по гайду https://neurohive.io/ru/tutorial/simple-gan-python-keras/ Переделал для себя,датасет просто выкачал с гугл фото (400+ картинок) и немного почистил.

Но нейросеть просто выдает какой то шум, а ошибка с gan.train_on_batch вообще 15.4

что я делаю не так? Датасет(созданный на коленке): https://drive.google.com/file/d/11NS0T9Df6yGWE9wsGUQme76ai9sMISU4/view?usp=drivesdk Сам скрипт:

import os
import numpy as np
import matplotlib.pyplot as plt
from tqdm import tqdm
from keras.layers import Input
from keras.models import Model, Sequential
from keras.layers import Dense, Dropout,Conv2D,Flatten,MaxPool2D,Conv2DTranspose,Reshape
from keras.layers.advanced_activations import LeakyReLU
import keras.layers as layers
from keras.optimizers import Adam
from keras.preprocessing.image import array_to_img,img_to_array,load_img
import tensorflow as tf
from keras import initializers
from IPython.display import display_png
from matplotlib import pyplot as plt
import tensorflow as tf
size = (128,128)
BATCH_SIZE = 50
noise_size = 100
def show(i):
  for e in range(i.shape[0]):
    plt.subplot(4, 4, e+1)
    plt.imshow(array_to_img(i[e]),cmap="gray")
    plt.axis('off')
  plt.show()

from google.colab import drive
drive.mount('/content/drive')

dataset = tf.keras.preprocessing.image_dataset_from_directory(
    "/content/imgs",
    batch_size=BATCH_SIZE,
    image_size=size,
    shuffle=True,
    seed=None,
    validation_split=None,
    subset=None,
    interpolation="bilinear",
    follow_links=False,
)

def get_optimizer(): return Adam(lr=0.0002, beta_1=0.5)
def get_generator(opt):
    model = Sequential()
    model.add(layers.Dense(4*4*256, use_bias=False, input_shape=(100,)))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())
    model.add(layers.Reshape((4, 4, 256)))

    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))
    model.add(layers.Conv2D(64, (10, 10), strides=(1, 1), padding='same'))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())
    model.add(layers.Conv2DTranspose(64, (6, 6), strides=(2, 2), padding='same', use_bias=False))
    model.add(layers.Conv2D(64, (5, 5), strides=(1, 1), padding='same'))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())
    model.add(layers.Conv2DTranspose(64, (6, 6), strides=(2, 2), padding='same', use_bias=False))
    model.add(layers.Conv2D(64, (5, 5), strides=(1, 1), padding='same'))
    model.add(layers.BatchNormalization())
    model.add(layers.LeakyReLU())

    model.add(layers.Conv2DTranspose(3, (6, 6), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
    model.add(layers.Conv2DTranspose(3, (6, 6), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))
    model.compile(opt,"binary_crossentropy")
    return model

def get_discriminator(opt):
    model = Sequential()
    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same',
                                     input_shape=[128, 128, 3]))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))

    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same',
                                     input_shape=[64, 64, 1]))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))

    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
    model.add(layers.LeakyReLU())
    model.add(layers.Dropout(0.3))

    model.add(layers.Flatten())
    model.add(layers.Dense(1))

    model.compile(opt,'binary_crossentropy')
    return model

def get_gan(discriminator, generator, optimizer,shape):
    # We initially set trainable to False since we only want to train either the 
    # generator or discriminator at a time
    discriminator.trainable = False
    # gan input (noise) will be 100-dimensional vectors
    gan_input = Input(shape)
    # the output of the generator (an image)
    x = generator(gan_input)
    # get the output of the discriminator (probability if the image is real or not)
    gan_output = discriminator(x)
    gan = Model(inputs=gan_input, outputs=gan_output)
    gan.compile(loss='binary_crossentropy', optimizer=optimizer)
    return gan

def train(generator,discriminator,epochs=1):
  # Get the training and testing data
  # Split the training data into batches of size 128
  # Build our GAN netowrk
  adam = get_optimizer()
  gan = get_gan(discriminator,generator, adam,(noise_size,))
  for e in range(1, epochs+1):
    print ('-'*15, 'Epoch %d' % e, '-'*15)
    for image_batch,_ in dataset:
      # Get a random set of input noise and images
      print(image_batch.shape)
      noise = np.random.normal(size=(BATCH_SIZE,noise_size))
      # Generate fake MNIST images
      generated_images = generator.predict(noise)
      X = np.concatenate([image_batch, generated_images])
      # Labels for generated and real data
      y_dis = np.zeros(2*BATCH_SIZE)
      # One-sided label smoothing
      y_dis[:BATCH_SIZE] = 0.9
      # Train discriminator
      discriminator.trainable = True
      discriminator.train_on_batch(X, y_dis)
      # Train generator
      noise = np.random.normal(size=(BATCH_SIZE,noise_size))
      y_gen = np.ones(BATCH_SIZE)
      discriminator.trainable = False
      loss = gan.train_on_batch(noise, y_gen)
      print("ошибка:",loss)
      noise = np.random.normal(size=(5,noise_size))
      show(generator.predict(noise))

opt = get_optimizer()
generator = get_generator(opt)
generator.output_shape

descriminator = get_discriminator(opt)

train(generator,descriminator,5)

noise = np.random.normal(0.,1.,size=(4,noise_size))
noise = np.asarray(noise,dtype="float32")
array_to_img(generator.predict(noise)[0])

Ответы (0 шт):