нейросеть 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])