深度学习有时看起来像纯粹的魔术,尤其是当计算机学习做一些真正有创意的事情(例如绘画图片)时!用于此的技术称为GAN,这是一个竞争性的生成网络,在本文中,我们将研究如何组织这种网络以及如何使用Azure机器学习训练它们以生成图片。

这篇文章是AI April计划的一部分。每年四月的一天,我的Microsoft同事都会撰写有关AI和机器学习的有趣文章。查看日历 -突然您会发现您感兴趣的其他主题。文章主要是英文的。
Azure ML VS Code ), , Azure ML. , "" MNIST. Azure ML — , , :
WikiArt. , , , WikiArt Retriever, WikiArt Dataset GANGogh.
, dataset. , , :

, , ( , ), (, ) .
-
- (GAN).
GAN keragan Keras, .
GAN :

GAN :
- :
 noise = np.random.normal(0, 1, (batch_size, latent_dim))
gen_imgs = generator.predict(noise)
imgs = get_batch(batch_size)
 
- . oneszeros:
 d_loss_r = discriminator.train_on_batch(imgs, ones)
d_loss_f = discriminator.train_on_batch(gen_imgs, zeros)
d_loss = np.add(d_loss_r , d_loss_f)*0.5
 
- , , :
 g_loss = combined.train_on_batch(noise, ones)
 
, — :
discriminator = create_discriminator()
generator = create_generator()
discriminator.compile(loss='binary_crossentropy',optimizer=optimizer, 
                      metrics=['accuracy'])
discriminator.trainable = False
z = keras.models.Input(shape=(latent_dim,))
img = generator(z)
valid = discriminator(img)
combined = keras.models.Model(z, valid)
combined.compile(loss='binary_crossentropy', optimizer=optimizer)
, (CNN). 64x64 :
discriminator = Sequential()
for x in [16,32,64]: 
    discriminator.add(Conv2D(x, (3,3), strides=1, padding="same"))
    discriminator.add(AveragePooling2D())
    discriminator.addBatchNormalization(momentum=0.8))
    discriminator.add(LeakyReLU(alpha=0.2))
    discriminator.add(Dropout(0.3))
discriminator.add(Flatten())
discriminator.add(Dense(1, activation='sigmoid'))
3 :
- 64x64x3 16- , ( AveragePooling2D) 32x32x16.
- 32x32x16 16x16x32
- 8x8x64.
, ( — Dense ).
. , , — latent_dim=100. , , 100..
— 100 . . UpSampling2D , :
generator = Sequential()
generator.add(Dense(8 * 8 * 2 * size, activation="relu", 
                                      input_dim=latent_dim))
generator.add(Reshape((8, 8, 2 * size)))
for x in [64;32;16]:
    generator.add(UpSampling2D())
    generator.add(Conv2D(x, kernel_size=(3,3),strides=1,padding="same"))
    generator.add(BatchNormalization(momentum=0.8))
    generator.add(Activation("relu"))
generator.add(Conv2D(3, kernel_size=3, padding="same"))
generator.add(Activation("tanh"))
64x64x3, . tanh [-1;1] — , . , , ImageDataset, .
Azure ML
- , Azure ML !
, , . Azure ML , (accuracy) (loss). run.log, , Azure ML.
, , ( ) . , , .. - , .
, Azure ML , . log_image, numpy-, , matplotlib. , , . callbk, keragan :
def callbk(tr):
    if tr.gan.epoch % 20 == 0:
        res = tr.gan.sample_images(n=3)
        fig,ax = plt.subplots(1,len(res))
        for i,v in enumerate(res):
            ax[i].imshow(v[0])
        run.log_image("Sample",plot=plt)
:
gan = keragan.DCGAN(args)
imsrc = keragan.ImageDataset(args)
imsrc.load()
train = keragan.GANTrainer(image_dataset=imsrc,gan=gan,args=args)
train.train(callbk)
, keragan , args, , , , learning rate ..
Azure ML VS Code, , SDK, Azure ML. submit_gan.ipynb, :
- : ws = Workspace.from_config()
- : cluster = ComputeTarget(workspace=ws, name='My Cluster'). GPU, [NC6][AzureVMNC].
- : ds.upload(...).
, , :
exp = Experiment(workspace=ws, name='KeraGAN')
script_params = {
    '--path': ws.get_default_datastore(),
    '--dataset' : 'faces',
    '--model_path' : './outputs/models',
    '--samples_path' : './outputs/samples',
    '--batch_size' : 32,
    '--size' : 512,
    '--learning_rate': 0.0001,
    '--epochs' : 10000
}
est = TensorFlow(source_directory='.',
    script_params=script_params,
    compute_target=cluster,
    entry_script='train_gan.py',
    use_gpu = True,
    conda_packages=['keras','tensorflow','opencv','tqdm','matplotlib'],
    pip_packages=['git+https://github.com/shwars/keragan@v0.0.1']
run = exp.submit(est)
model_path=./outputs/models samples_path=./outputs/samples, ( ) outputs. , , Azure ML.
Estimator, GPU, Tensorflow. Estimator, " " . Estimator- .
— , keragan GitHub. PyPI pip-, , GitHub , commit ID. , PyPI.
, Azure ML Portal:

GAN , . -, learning rate: , — . .
:
- --size, . (64 128) , ( 1024) . 1024 , , progressive growing
- --learning_rate. , .
- --dateset. , , Azure ML datastore, .
, for, . , . .
, , . outputs/models, — outputs/samples. Azure ML Portal :

, , . run, , , ( ):
run.download_files(prefix='outputs/samples')
outputs/samples, .
run ( , ), , run id, :
run = Run(experiment=exp,run_id='KeraGAN_1584082108_356cf603')
. , , . , ( gen_):
fnames = run.get_file_names()
fnames = filter(lambda x : x.startswith('outputs/models/gen_'),fnames)
: outputs/models/gen_0.h5, outputs/models/gen_100.h5 .. :
no = max(map(lambda x: int(x[19:x.find('.')]), fnames))
fname = 'outputs/models/gen_{}.h5'.format(no)
fname_wout_path = fname[fname.rfind('/')+1:]
run.download_file(fname)
, fname_wout_path.
, Keras, , , , :
model = keras.models.load_model(fname_wout_path)
latent_dim=model.layers[0].input.shape[1].value
res = model.predict(np.random.normal(0,1,(10,latent_dim)))
, [-1,1], [0,1], matplotlib:
res = (res+1.0)/2
fig,ax = plt.subplots(1,10,figsize=(15,10))
for i in range(10):
    ax[i].imshow(res[i])
:

, :
( ) , — @art_of_artificial, .
, - . , , . , :
- , Azure. , . , — — . ? ...
keragan, , DCGAN, Maxime Ellerbach, GANGogh. GAN Keras .
Azure ML