• Aucun résultat trouvé

Exemples connus : principalement de la génération d’images de haute qualité

N/A
N/A
Protected

Academic year: 2022

Partager "Exemples connus : principalement de la génération d’images de haute qualité"

Copied!
41
0
0

Texte intégral

(1)

Generative adversarial networks (gan)

2 octobre 2020

(2)

Yann LeCun

“Generative Adversarial Network : the most interesting idea in the last ten years in machine learning”

Exemples connus : principalement de la génération d’images de haute qualité

Génération automatique de visages humains ...

Ou d’autres choses [LISIC].

Deepfake (Obama speech, Home alone avec Stallone).

En art : Vente d’une oeuvre 432k€ (2018).

Jeux vidéo : amélioration de textures basses résolutions.

...

Référence

Ian Goodfellow, 2016 (NIPS) : [paper]

(3)

Les GANs

Principe

Définition

Deux réseaux de neurones sont placés en compétition. Le premier, le générateur va essayer de générer un échantillon. Le second, le discriminateur va essayer de deviner si l’exemple qu’il reçoit est réel ou s’il est générer par le générateur.

Difficulté

Convergence lente et parfois compliquée.

(4)

Les GANs

Principe

[source]

(5)

Les GANs

Exemple

Generateur

.. .

.. . I1

I2

In

O1

=⇒

Discriminateur

.. .

.. . I1

I2

In

O1

=⇒

NO !

(6)

Les GANs

Exemple

Generateur

.. .

.. . I1

I2

In

O1

=⇒

Discriminateur

.. .

.. . I1

I2

In

O1

=⇒

NO !

(7)

Les GANs

Exemple

Generateur

.. .

.. . I1

I2

In

O1

=⇒

Discriminateur

.. .

.. . I1

I2

In

O1

=⇒

YES !

(8)

Génération d’une fonction cosinus

Définition du problème

Génération d’une fonction cosinus en 1D.

Espace de points : (-5,5).

Utilisation de la bibliothèque Keras.

Simple définition de la fonction d’évaluation avec numpy def evaluate(x):

return np.cos(x)

(9)

Génération des données

def plot_points(real, fake):

plt.scatter(real[:,0], real[:,1], color='blue')

plt.scatter(fake[:,0], fake[:,1], color='red')

plt.legend(['real points', 'fake points'])

plt.show()

(10)

Visualition des données générées

def create_discriminator(intput_size=2):

model = Sequential()

model.add(Dense(15, activation='relu',

input_dim = intput_size)) model.add(Dense(5, activation='relu'))

model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy',

optimizer='adam',

metrics=['accuracy'])

return model

(11)

Visualition des données générées

(12)

Création du discriminateur

Le discriminateur

En entrée : un vecteur de 2 éléments

En sortie : une prédiction de classification (échantillon réel ou faux)

Le réseau :

Une couche dense d’entrée de 15 neurones, fonction d’activation relu.

Une couche dense cachée de 5 neurones, fonction d’activation relu.

Une couche dense de sortie de 1 neurone, fonction d’activation sigmoid.

Optimizer : adam.

Fonction de perte : binary crossentropy.

(13)

Création du discriminateur

def create_discriminator(intput_size=2):

model = Sequential()

model.add(Dense(15, activation='relu',

input_dim = intput_size)) model.add(Dense(5, activation='relu'))

model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy',

optimizer='adam',

metrics=['accuracy'])

return model

(14)

Une parenthèse : apprentissage du discriminateur

Pour vérifier le bon fonctionnement de notre disciminateur on peut lancer un entrainement.

La moitié des données sont des échantillons faux, l’autre des réels (de la fonction cosinus).

Comme on veut faire simple, laissons tous les paramètres par

défaut.

(15)

Une parenthèse : apprentissage du discriminateur

def generate_real_points(n=100):

x = np.random.uniform(-5, 5, n)

x = x.reshape(n, 1) # shape(n,) --> shape(n, 1) x2 = evaluate(x)

# stacking the data et labeling as real points return np.hstack((x, x2)), np.ones((n, 1))

def generate_fake_points(n=100):

x = np.random.uniform(-10, 10, n) x2 = np.random.uniform(-10, 10, n)

x = x.reshape(n, 1) # shape(n,) --> shape(n, 1) x2 = x2.reshape(n, 1) # shape(n,) --> shape(n, 1)

# stacking the data et labeling as fake points

return np.hstack((x, x2)), np.zeros((n, 1))

(16)

Une parenthèse : apprentissage du discriminateur

(17)

Création du générateur

Le générateur

En entrée : le générateur prend un point de l’espace latent.

L’espace latent est un espace 5D de variables aléatoires gaussiennes.

En sortie : un vecteur de 2 éléments.

Le réseau :

Une couche dense d’entrée de 15 neurones, fonction d’activation relu.

Une couche dense cachée de 5 neurones, fonction d’activation relu.

Une couche dense de sortie de 1 neurone, fonction d’activation linear.

Optimizer : adam.

Fonction de perte : binary crossentropy.

(18)

Création du générateur

def create_generator(latent_space_dim=5, n_outputs=2):

model = Sequential()

model.add(Dense(15, activation='relu',

input_dim=latent_space_dim)) model.add(Dense(5, activation='relu'))

model.add(Dense(n_outputs, activation='linear')) return model

def generate_latent_points(latent_dim=5, n=100):

x_input = np.random.normal(0, 1, latent_dim*n)

x_input = x_input.reshape(n, latent_dim)

return x_input

(19)

Création du générateur

def generate_fake_samples(generator, latent_dim=5, n=100):

x_input = generate_latent_points(latent_dim, n) X = generator.predict(x_input)

y = np.zeros((n,1))

return X, y

(20)

Générateur sans apprentissage

(21)

Création du gan

def create_gan(generator, discriminator):

discriminator.trainable = False

# Le discriminateur est seulement utilisé

# pour distinguer le vrai du faux model = Sequential()

model.add(generator) model.add(discriminator)

model.compile(loss='binary_crossentropy', optimizer='adam')

return model

(22)

Création du gan

def create_gan(generator, discriminator):

discriminator.trainable = False

# Le discriminateur est seulement utilisé

# pour distinguer le vrai du faux model = Sequential()

model.add(generator) model.add(discriminator)

model.compile(loss='binary_crossentropy', optimizer='adam')

return model

(23)

Entrainement du gan

def train_gan(generator, discriminator, gan, latent_dim=5, n_epochs=30000, n_batch=256, n_eval=1000):

for i in range(n_epochs):

X_real, y_real = generate_real_points(n_batch//2) X_fake, y_fake = generate_fake_samples(generator,

latent_dim, n_batch//2) discriminator.train_on_batch(X_real, y_real) discriminator.train_on_batch(X_fake, y_fake)

x_gan = generate_latent_points(latent_dim, n_batch) y_gan = np.ones((n_batch, 1))

gan.train_on_batch(x_gan, y_gan) if (i % n_eval == 0):

summarize_performances(i, generator,

discriminator, latent_dim)

(24)

def summarize_performances(epoch, generator, discriminator, latent_dim=5, n_points=100):

X_real, y_real = generate_real_points(n_points) X_fake, y_fake = generate_fake_samples(generator,

latent_dim, n_points)

_, acc_real = discriminator.evaluate(X_real, y_real) _, acc_fake = discriminator.evaluate(X_fake, y_fake) print('Epoch {}, fakeAcc {}, realAcc {}'.format(epoch,

acc_fake, acc_real))

plt.scatter(X_real[:,0], X_real[:,1], color='blue') plt.scatter(X_fake[:,0], X_fake[:,1], color='red') plt.legend(['Real points', 'Fake points'])

filename = '../images/generated/cos{}_'.format(epoch) plt.savefig(filename)

plt.show()

(25)

Résultats de notre simple réseau

(26)

Résultats de notre simple réseau

(27)

Résultats de notre simple réseau

(28)

Résultats de notre simple réseau

(29)

Résultats de notre simple réseau

(30)

Résultats de notre simple réseau

(31)

Résultats de notre simple réseau

(32)

Résultats de notre simple réseau

(33)

Résultats de notre simple réseau

(34)

Résultats de notre simple réseau

(35)

Résultats de notre simple réseau

(36)

Résultats de notre simple réseau

(37)

Résultats de notre simple réseau

(38)

Résultats de notre simple réseau

(39)

Résultats de notre simple réseau

(40)

Résultats de notre simple réseau

(41)

Générer une image

Que faut-il changer dans notre code Chargement des données :

Commnencez par charger la base de données pour ne garder que des images d’un même digit (peu importe lequel).

Ré-écrire la fonction generate_real_samples afin de sélectionner au hasard un certain nombre d’images.

Changer la dimension de l’espace latent (100).

Discriminateur :

Changer la taille de l’input.

Rajouter une couche Flatten.

Références

Documents relatifs

cette anomalie est compatible avec la survie de la cellule atteinte mais conduit souvent a la constitution ultérieure de cellules géantes polyploïdes a noyau unique ou de

La fonction de coˆ ut la plus utilis´ee est la fonction quadratique [14] avec pour crit`ere d’arrˆet l’erreur qua- dratique moyenne obtenue sur l’ensemble de validation,

18 تراشأ ؽايسلا تاذ في ةدابؼا 282 يلي ام اهيف ءاج تيلاك فوناقلا تاذ نم " فأ ببه نعطلا عاديإ تبثبؼا دنتسبؼا كأ نعطلا قبس مذلا مرادلإا نعطلا ضفر رارق

Proboscoidea Nerfs Parties restantes Neopallium Rhinencephalon.. Spécificité

Évidemment, et compte tenu de l'importance de ces récepteurs dans le développement de processus neurodégénératifs, il est probable que le niveau d'expression

— L'étude de la fonction de corrélation de paire des ions aux courtes distances dans un plasma dense, outre son intérêt intrinsèque, a une application importante en astrophysique,

3 Stable driven equations and their Euler scheme: existence of the density and associated parametrix expansion.. 3.1 Stable

From Figure 6 it is observed that when a ReLU network is sufficiently well trained, the activation distributions in earlier layers have lower activation values and class information