from keras.models import Sequential from keras.layers import Dense from keras.utils import to_categorical import sklearn.datasets import datetime import matplotlib.pyplot as plt import numpy as np train_libsvm = "/dbfs/databricks-datasets/mnist-digits/data-001/mnist-digits-train.txt" test_libsvm = "/dbfs/databricks-datasets/mnist-digits/data-001/mnist-digits-test.txt" X_train, y_train = sklearn.datasets.load_svmlight_file(train_libsvm, n_features=784) X_train = X_train.toarray() X_test, y_test = sklearn.datasets.load_svmlight_file(test_libsvm, n_features=784) X_test = X_test.toarray() model = Sequential() model.add(Dense(30, input_dim=784, kernel_initializer='normal', activation='relu')) model.add(Dense(784, kernel_initializer='normal', activation='relu')) model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mean_squared_error', 'binary_crossentropy']) start = datetime.datetime.today() history = model.fit(X_train, X_train, epochs=5, batch_size=100, validation_split=0.1, verbose=2) scores = model.evaluate(X_test, X_test) print for i in range(len(model.metrics_names)): print("%s: %f" % (model.metrics_names[i], scores[i])) print ("Start: " + str(start)) end = datetime.datetime.today() print ("End: " + str(end)) print ("Elapse: " + str(end-start)) fig, ax = plt.subplots() fig.set_size_inches((4,4)) plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('model loss') plt.ylabel('loss') plt.xlabel('epoch') plt.legend(['train', 'val'], loc='upper left') display(fig)
import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm from keras.layers import Input, Dense, Lambda from keras.models import Model from keras import backend as K from keras import objectives from keras.datasets import mnist import sklearn.datasets batch_size = 100 original_dim = 784 latent_dim = 2 intermediate_dim = 256 nb_epoch = 50 epsilon_std = 1.0 x = Input(batch_shape=(batch_size, original_dim)) h = Dense(intermediate_dim, activation='relu')(x) z_mean = Dense(latent_dim)(h) z_log_var = Dense(latent_dim)(h) def sampling(args): z_mean, z_log_var = args epsilon = K.random_normal(shape=(batch_size, latent_dim), mean=0., stddev=epsilon_std) return z_mean + K.exp(z_log_var / 2) * epsilon # note that "output_shape" isn't necessary with the TensorFlow backend z = Lambda(sampling, output_shape=(latent_dim,))([z_mean, z_log_var]) # we instantiate these layers separately so as to reuse them later decoder_h = Dense(intermediate_dim, activation='relu') decoder_mean = Dense(original_dim, activation='sigmoid') h_decoded = decoder_h(z) x_decoded_mean = decoder_mean(h_decoded) def vae_loss(x, x_decoded_mean): xent_loss = original_dim * objectives.binary_crossentropy(x, x_decoded_mean) kl_loss = - 0.5 * K.sum(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1) return xent_loss + kl_loss vae = Model(x, x_decoded_mean) vae.compile(optimizer='rmsprop', loss=vae_loss) train_libsvm = "/dbfs/databricks-datasets/mnist-digits/data-001/mnist-digits-train.txt" test_libsvm = "/dbfs/databricks-datasets/mnist-digits/data-001/mnist-digits-test.txt" x_train, y_train = sklearn.datasets.load_svmlight_file(train_libsvm, n_features=784) x_train = x_train.toarray() x_test, y_test = sklearn.datasets.load_svmlight_file(test_libsvm, n_features=784) x_test = x_test.toarray() x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:]))) x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:]))) vae.fit(x_train, x_train, shuffle=True, epochs=nb_epoch, batch_size=batch_size, validation_data=(x_test, x_test), verbose=2) # build a model to project inputs on the latent space encoder = Model(x, z_mean)
Train on 60000 samples, validate on 10000 samples
Epoch 1/50
- 7s - loss: 190.9768 - val_loss: 173.1796
Epoch 2/50
- 7s - loss: 170.5004 - val_loss: 168.3274
Epoch 3/50
- 7s - loss: 166.9483 - val_loss: 165.7523
Epoch 4/50
- 7s - loss: 164.8370 - val_loss: 164.2769
Epoch 5/50
- 7s - loss: 163.3543 - val_loss: 162.8434
Epoch 6/50
- 7s - loss: 162.1008 - val_loss: 161.5877
Epoch 7/50
- 7s - loss: 161.0557 - val_loss: 160.8535
Epoch 8/50
- 7s - loss: 160.0666 - val_loss: 159.8321
Epoch 9/50
- 7s - loss: 159.1418 - val_loss: 159.0197
Epoch 10/50
- 7s - loss: 158.3370 - val_loss: 158.1361
Epoch 11/50
- 7s - loss: 157.6069 - val_loss: 157.9401
Epoch 12/50
- 7s - loss: 156.9792 - val_loss: 156.8949
Epoch 13/50
- 7s - loss: 156.4237 - val_loss: 156.6119
Epoch 14/50
- 7s - loss: 155.9121 - val_loss: 156.3393
Epoch 15/50
- 7s - loss: 155.4880 - val_loss: 156.1204
Epoch 16/50
- 7s - loss: 155.0392 - val_loss: 156.1275
Epoch 17/50
- 7s - loss: 154.6869 - val_loss: 155.0182
Epoch 18/50
- 7s - loss: 154.3163 - val_loss: 154.7265
Epoch 19/50
- 7s - loss: 154.0314 - val_loss: 154.6318
Epoch 20/50
- 7s - loss: 153.7218 - val_loss: 154.3242
Epoch 21/50
- 7s - loss: 153.4679 - val_loss: 154.4581
Epoch 22/50
- 7s - loss: 153.1870 - val_loss: 153.9840
Epoch 23/50
- 7s - loss: 152.9839 - val_loss: 153.8052
Epoch 24/50
- 7s - loss: 152.7605 - val_loss: 153.9252
Epoch 25/50
- 7s - loss: 152.5473 - val_loss: 153.7088
Epoch 26/50
- 7s - loss: 152.3364 - val_loss: 153.6085
Epoch 27/50
- 7s - loss: 152.1534 - val_loss: 153.2579
Epoch 28/50
- 7s - loss: 152.0203 - val_loss: 153.1721
Epoch 29/50
- 7s - loss: 151.8157 - val_loss: 153.1620
Epoch 30/50
- 7s - loss: 151.6618 - val_loss: 153.1152
Epoch 31/50
- 7s - loss: 151.5067 - val_loss: 152.8042
Epoch 32/50
- 7s - loss: 151.3810 - val_loss: 152.8947
Epoch 33/50
- 7s - loss: 151.2489 - val_loss: 152.5349
Epoch 34/50
- 7s - loss: 151.0784 - val_loss: 152.9623
Epoch 35/50
- 7s - loss: 150.9885 - val_loss: 152.5544
Epoch 36/50
- 7s - loss: 150.8500 - val_loss: 152.6461
Epoch 37/50
- 7s - loss: 150.7122 - val_loss: 152.0259
Epoch 38/50
- 7s - loss: 150.6166 - val_loss: 152.8115
Epoch 39/50
- 7s - loss: 150.4893 - val_loss: 152.0757
Epoch 40/50
- 7s - loss: 150.4013 - val_loss: 152.3985
Epoch 41/50
- 7s - loss: 150.3099 - val_loss: 151.8574
Epoch 42/50
- 7s - loss: 150.1686 - val_loss: 151.9436
Epoch 43/50
- 7s - loss: 150.1139 - val_loss: 152.1689
Epoch 44/50
- 7s - loss: 150.0130 - val_loss: 151.7565
Epoch 45/50
- 7s - loss: 149.8982 - val_loss: 151.7926
Epoch 46/50
- 7s - loss: 149.8157 - val_loss: 152.5258
Epoch 47/50
- 7s - loss: 149.7415 - val_loss: 151.6356
Epoch 48/50
- 7s - loss: 149.6592 - val_loss: 151.9871
Epoch 49/50
- 7s - loss: 149.5619 - val_loss: 151.6842
Epoch 50/50
- 7s - loss: 149.4900 - val_loss: 151.6131
# build a digit generator that can sample from the learned distribution decoder_input = Input(shape=(latent_dim,)) _h_decoded = decoder_h(decoder_input) _x_decoded_mean = decoder_mean(_h_decoded) generator = Model(decoder_input, _x_decoded_mean) # display a 2D manifold of the digits n = 15 # figure with 15x15 digits digit_size = 28 figure = np.zeros((digit_size * n, digit_size * n)) # linearly spaced coordinates on the unit square were transformed through the inverse CDF (ppf) of the Gaussian # to produce values of the latent variables z, since the prior of the latent space is Gaussian grid_x = norm.ppf(np.linspace(0.05, 0.95, n)) grid_y = norm.ppf(np.linspace(0.05, 0.95, n)) for i, yi in enumerate(grid_x): for j, xi in enumerate(grid_y): z_sample = np.array([[xi, yi]]) x_decoded = generator.predict(z_sample) digit = x_decoded[0].reshape(digit_size, digit_size) figure[i * digit_size: (i + 1) * digit_size, j * digit_size: (j + 1) * digit_size] = digit fig, ax = plt.subplots() fig.set_size_inches((7,7)) ax.imshow(figure, cmap='Greys_r') display(fig)
import os import numpy as np import matplotlib.pyplot as plt from keras.layers import Input from keras.models import Model, Sequential from keras.layers.core import Reshape, Dense, Dropout, Flatten from keras.layers.advanced_activations import LeakyReLU from keras.layers.convolutional import Convolution2D, UpSampling2D from keras.layers.normalization import BatchNormalization from keras.regularizers import l1, l1_l2 from keras.optimizers import Adam from keras import backend as K from keras import initializers import sklearn.datasets K.set_image_data_format('channels_last') # Deterministic output. # Tired of seeing the same results every time? Remove the line below. np.random.seed(1000) # The results are a little better when the dimensionality of the random vector is only 10. # The dimensionality has been left at 100 for consistency with other GAN implementations. randomDim = 100 train_libsvm = "/dbfs/databricks-datasets/mnist-digits/data-001/mnist-digits-train.txt" test_libsvm = "/dbfs/databricks-datasets/mnist-digits/data-001/mnist-digits-test.txt" X_train, y_train = sklearn.datasets.load_svmlight_file(train_libsvm, n_features=784) X_train = X_train.toarray() X_test, y_test = sklearn.datasets.load_svmlight_file(test_libsvm, n_features=784) X_test = X_test.toarray() X_train = (X_train.astype(np.float32) - 127.5)/127.5 X_train = X_train.reshape(60000, 784) # Function for initializing network weights def initNormal(): return initializers.normal(stddev=0.02) # Optimizer adam = Adam(lr=0.0002, beta_1=0.5) generator = Sequential() generator.add(Dense(256, input_dim=randomDim, kernel_initializer=initializers.normal(stddev=0.02))) generator.add(LeakyReLU(0.2)) generator.add(Dense(512)) generator.add(LeakyReLU(0.2)) generator.add(Dense(1024)) generator.add(LeakyReLU(0.2)) generator.add(Dense(784, activation='tanh')) generator.compile(loss='binary_crossentropy', optimizer=adam) discriminator = Sequential() discriminator.add(Dense(1024, input_dim=784, kernel_initializer=initializers.normal(stddev=0.02))) discriminator.add(LeakyReLU(0.2)) discriminator.add(Dropout(0.3)) discriminator.add(Dense(512)) discriminator.add(LeakyReLU(0.2)) discriminator.add(Dropout(0.3)) discriminator.add(Dense(256)) discriminator.add(LeakyReLU(0.2)) discriminator.add(Dropout(0.3)) discriminator.add(Dense(1, activation='sigmoid')) discriminator.compile(loss='binary_crossentropy', optimizer=adam) # Combined network discriminator.trainable = False ganInput = Input(shape=(randomDim,)) x = generator(ganInput) ganOutput = discriminator(x) gan = Model(inputs=ganInput, outputs=ganOutput) gan.compile(loss='binary_crossentropy', optimizer=adam) dLosses = [] gLosses = [] # Plot the loss from each batch def plotLoss(epoch): plt.figure(figsize=(10, 8)) plt.plot(dLosses, label='Discriminitive loss') plt.plot(gLosses, label='Generative loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.legend() plt.savefig('/dbfs/FileStore/gan_loss_epoch_%d.png' % epoch) # Create a wall of generated MNIST images def plotGeneratedImages(epoch, examples=100, dim=(10, 10), figsize=(10, 10)): noise = np.random.normal(0, 1, size=[examples, randomDim]) generatedImages = generator.predict(noise) generatedImages = generatedImages.reshape(examples, 28, 28) plt.figure(figsize=figsize) for i in range(generatedImages.shape[0]): plt.subplot(dim[0], dim[1], i+1) plt.imshow(generatedImages[i], interpolation='nearest', cmap='gray_r') plt.axis('off') plt.tight_layout() plt.savefig('/dbfs/FileStore/gan_generated_image_epoch_%d.png' % epoch) # Save the generator and discriminator networks (and weights) for later use def saveModels(epoch): generator.save('/tmp/gan_generator_epoch_%d.h5' % epoch) discriminator.save('/tmp/gan_discriminator_epoch_%d.h5' % epoch) def train(epochs=1, batchSize=128): batchCount = X_train.shape[0] // batchSize print('Epochs:', epochs) print('Batch size:', batchSize) print('Batches per epoch:', batchCount) for e in range(1, epochs+1): print('-'*15, 'Epoch %d' % e, '-'*15) for _ in range(batchCount): # Get a random set of input noise and images noise = np.random.normal(0, 1, size=[batchSize, randomDim]) imageBatch = X_train[np.random.randint(0, X_train.shape[0], size=batchSize)] # Generate fake MNIST images generatedImages = generator.predict(noise) # print np.shape(imageBatch), np.shape(generatedImages) X = np.concatenate([imageBatch, generatedImages]) # Labels for generated and real data yDis = np.zeros(2*batchSize) # One-sided label smoothing yDis[:batchSize] = 0.9 # Train discriminator discriminator.trainable = True dloss = discriminator.train_on_batch(X, yDis) # Train generator noise = np.random.normal(0, 1, size=[batchSize, randomDim]) yGen = np.ones(batchSize) discriminator.trainable = False gloss = gan.train_on_batch(noise, yGen) # Store loss of most recent batch from this epoch dLosses.append(dloss) gLosses.append(gloss) if e == 1 or e % 10 == 0: plotGeneratedImages(e) saveModels(e) # Plot losses from every epoch plotLoss(e) train(10, 128)
WARNING:tensorflow:From /databricks/python/local/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.
Instructions for updating:
Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.
('Epochs:', 10)
('Batch size:', 128)
('Batches per epoch:', 468)
('---------------', 'Epoch 1', '---------------')
('---------------', 'Epoch 2', '---------------')
('---------------', 'Epoch 3', '---------------')
('---------------', 'Epoch 4', '---------------')
('---------------', 'Epoch 5', '---------------')
('---------------', 'Epoch 6', '---------------')
('---------------', 'Epoch 7', '---------------')
('---------------', 'Epoch 8', '---------------')
('---------------', 'Epoch 9', '---------------')
('---------------', 'Epoch 10', '---------------')
SDS-2.x, Scalable Data Engineering Science
This is a 2019 augmentation and update of Adam Breindel's initial notebooks.
Last refresh: Never