Skip to content

Instantly share code, notes, and snippets.

@sk413025
Created September 30, 2020 06:33
Show Gist options
  • Save sk413025/f99d4b21427d0cd4f4df9a751c142430 to your computer and use it in GitHub Desktop.
Save sk413025/f99d4b21427d0cd4f4df9a751c142430 to your computer and use it in GitHub Desktop.
import numpy as np
import tensorflow as tf
from keras.models import Model
from keras.layers import Input
from keras.layers.core import Reshape, Dense, Dropout, Flatten
from keras.layers.advanced_activations import LeakyReLU
from keras.losses import MSE
from keras.optimizers import SGD
from keras import backend as K
from keras import initializers
from visdom import Visdom
viz = Visdom()
np.random.seed(1000)
sess = tf.Session()
K.set_session(sess)
randomDim = 100
# given two different random seed
seed_true = np.random.uniform(-1, 1, size=100*randomDim).reshape(100, randomDim)
seed_test = np.random.uniform(-3, 3, size=100*randomDim).reshape(100, randomDim)
seed_var = K.variable(seed_test)
seed = Input(shape=(randomDim,), tensor=seed_var)
_ = Dense(256, input_dim=randomDim, kernel_initializer=initializers.RandomNormal(stddev=0.02))(seed)
_ = LeakyReLU(0.2)(_)
_ = Dense(512)(_)
_ = LeakyReLU(0.2)(_)
_ = Dense(1024)(_)
_ = LeakyReLU(0.2)(_)
image = Dense(784, activation='tanh')(_)
generator = Model(seed, image)
generator.load_weights("./models/gan_generator_epoch_200.h5")
D_true = sess.run(generator.output , {seed: seed_true})
viz.images(D_true.reshape(100, 1, 28, 28), nrow=10, win='image_true', opts={'caption': 'image_true'})
noise = np.random.normal(0, 0.5, size=100*784).reshape(100, 784)
D_noise = D_true + noise
viz.images(D_noise.reshape(100, 1, 28, 28), nrow=10, win='image_noise', opts={'caption': 'image_noise'})
D_test = sess.run(generator.output, {seed: seed_test})
viz.images(D_test.reshape(100, 1, 28, 28), nrow=10, win='image_test', opts={'caption': 'image_test'})
viz.images(D_test.reshape(100, 1, 28, 28), nrow=10, win='image_recover', opts={'caption': 'image_recover'})
opt = SGD()
loss_func = K.mean(MSE(D_noise, generator.output), axis=None)
dx = opt.get_gradients(loss_func, generator.input)
old = seed_var
new = K.clip(seed_var - 0.3 * dx[0], -2., 2.)
train = K.function([], [loss_func], [(old, new)])
step = 0
loss_value = [np.inf]
while loss_value[0] > 0.05:
loss_value = train([])
if step % 1000 == 0:
seed_test = K.eval(seed_var)
D_test = sess.run(generator.output , {seed: seed_test})
viz.images(D_test.reshape(100, 1, 28, 28), nrow=10, win='image_recover', opts={'caption': 'image_recover'})
update = 'append' if viz.win_exists('loss') else None
viz.line(X=np.array([step]), Y=np.array(loss_value), win='loss', update=update)
step += 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment