首页 > 其他分享 >国庆中秋特辑(二)浪漫祝福方式 使用生成对抗网络(GAN)生成具有节日氛围的画作

国庆中秋特辑(二)浪漫祝福方式 使用生成对抗网络(GAN)生成具有节日氛围的画作

时间:2023-10-22 19:01:37浏览次数:41  
标签:kernel strides 生成 padding GAN add 特辑 model size

要用人工智能技术来庆祝国庆中秋,我们可以使用生成对抗网络(GAN)生成具有节日氛围的画作。这里将使用深度学习框架 TensorFlow 和 Keras 来实现。

国庆中秋特辑(二)浪漫祝福方式 使用生成对抗网络(GAN)生成具有节日氛围的画作_tensorflow

一、生成对抗网络(GAN)

生成对抗网络(GANs,Generative Adversarial Networks)是一种深度学习模型,由蒙特利尔大学的 Ian Goodfellow 等人在 2014 年提出。GANs 主要通过让两个神经网络(生成器和判别器)互相博弈的方式进行训练,实现生成数据的模拟。它可以用于图像合成、视频生成、语音合成、文本生成等多个领域。

  1. 图像合成:
    案例:DeepDream
    简介:DeepDream 是一个基于 GAN 的图像处理工具,通过引入对抗性损失函数,可以实现对图像的深度风格迁移。
    代码:
    使用 TensorFlow 和 Keras 库实现的 DeepDream 代码示例:
import tensorflow as tf  
from tensorflow.keras.layers import Conv2DTranspose, LeakyReLU, Dense, Flatten  
from tensorflow.keras.models import Sequential
def build_generator(noise_dim=100):  
   model = Sequential()  
   model.add(Dense(4 * 4 * 256, input_shape=(noise_dim,)))  
   model.add(Reshape((4, 4, 256)))  
   model.add(Conv2DTranspose(128, kernel_size=5, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv2DTranspose(64, kernel_size=5, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv2DTranspose(3, kernel_size=5, strides=2, padding='same', activation='tanh'))  
   return model
def build_discriminator():  
   model = Sequential()  
   model.add(Conv2DTranspose(64, kernel_size=5, strides=2, padding='same', input_shape=(64, 64, 3)))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv2DTranspose(128, kernel_size=5, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv2DTranspose(256, kernel_size=5, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Flatten())  
   model.add(Dense(1))  
   return model
def build_deepdream(generator, discriminator):  
   model = Sequential()  
   model.add(generator)  
   model.add(discriminator)  
   return model
  1. 视频生成:
    案例:VideoGAN
    简介:VideoGAN 是一个基于 GAN 的视频生成模型,可以生成自然界中的动态场景。
    代码:目前尚无公开的完整的 VideoGAN 代码,但可以参考这个项目:https://github.com/mahasem/video-gan
  2. 语音合成:
    案例:WaveNet
    简介:WaveNet 是一个基于 GAN 的语音合成模型,可以生成高质量的语音信号。
    代码:使用 TensorFlow 实现的 WaveNet 代码示例:
import tensorflow as tf
def build_generator(input_dim, hidden_dim, output_dim):  
   model = Sequential()  
   model.add(Dense(hidden_dim, input_dim))  
   model.add(Reshape((hidden_dim, 1, 1)))  
   model.add(Conv1D(hidden_dim, kernel_size=3, strides=1, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv1D(hidden_dim, kernel_size=3, strides=1, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv1D(output_dim, kernel_size=3, strides=1, padding='same'))  
   model.add(Tanh())
def build_discriminator():  
   model = Sequential()  
   model.add(Conv1D(hidden_dim, kernel_size=3, strides=1, padding='same', input_shape=(1, input_dim)))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv1D(hidden_dim * 2, kernel_size=3, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv1D(hidden_dim * 4, kernel_size=3, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Flatten())  
   model.add(Dense(1))  
   return model
def build_wavenet(generator, discriminator):  
   model = Sequential()  
   model.add(generator)  
   model.add(discriminator)  
   return model

在这个示例中,我们首先定义了 build_generator 函数,用于构建生成器。生成器接收一个随机的噪声向量作为输入,然后通过一系列的转换操作生成一个新的语音样本。接下来,我们定义了 build_discriminator 函数,用于构建判别器。判别器的任务是区分真实语音样本和生成器生成的虚假样本。最后,我们定义了 build_wavenet 函数,用于将生成器和判别器组合成一个完整的 WaveNet 模型。 需要注意的是,这个示例仅提供了一个简化版的 WaveNet 实现。在实际应用中,WaveNet 通常会使用更多的隐藏层和更大的网络结构以生成更高质量的语音信号。 4.文本生成: 案例:GAN 代码:使用 TensorFlow 和 Keras 库实现的 GAN 代码示例:

以下是使用 TensorFlow 和 Keras 库实现的 GAN(生成对抗网络)代码示例:

import numpy as np  
import tensorflow as tf  
from tensorflow.keras.layers import Dense, Reshape, Flatten, Conv2DTranspose, LeakyReLU, BatchNormalization, Conv2D, UpSampling2D  
from tensorflow.keras.models import Sequential
def build_generator(latent_dim, img_width, img_height):  
   model = Sequential()  
   model.add(Dense(128, input_shape=(latent_dim,)))  
   model.add(Reshape((128, 1, 1)))  
   model.add(Conv2DTranspose(128, kernel_size=7, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv2DTranspose(256, kernel_size=3, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv2DTranspose(512, kernel_size=3, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv2DTranspose(1024, kernel_size=3, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv2DTranspose(2048, kernel_size=3, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Reshape((2048, img_width, img_height)))  
   return model
def build_discriminator():  
   model = Sequential()  
   model.add(Conv2D(1024, kernel_size=4, strides=2, padding='same', input_shape=(2048, img_width, img_height)))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv2D(512, kernel_size=4, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv2D(256, kernel_size=4, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Conv2D(128, kernel_size=4, strides=2, padding='same'))  
   model.add(LeakyReLU(alpha=0.2))  
   model.add(Flatten())  
   model.add(Dense(1))  
   return model
def build_gan(generator, discriminator):  
   model = Sequential()  
   model.add(generator)  
   model.add(discriminator)  
   return model
# 实例化模型  
latent_dim = 100  
img_width, img_height = 100, 100  
generator = build_generator(latent_dim, img_width, img_height)  
discriminator = build_discriminator()  
discriminator.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), loss='binary_crossentropy')
discriminator.trainable = False
gan = build_gan(generator, discriminator)  
gan.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), loss='binary_crossentropy')
# 训练 GAN  
generator, discriminator = gan.layers  
for epoch in range(100):  
   for real_images in np.random.uniform(0, 255, (100, img_width, img_height)):  
       real_labels = tf.ones((100, 1))  
       noise = np.random
       fake_images = generator(noise)
       fake_labels = tf.zeros((100, 1))
       all_images = tf.concat((real_images, fake_images), axis=0)  
       all_labels = tf.concat((real_labels, fake_labels), axis=0)  
     
   discriminator.train_on_batch(all_images, all_labels)  
     
   # 训练生成器  
   noise = np.random.normal(0, 1, (100, latent_dim))  
   gan.train_on_batch(noise, real_labels)  
     
   print(f'Epoch {epoch + 1} finished.')
  1. 机器翻译: 案例:Neural Machine Translation (NMT) 代码:目前尚无公开的完整的 NMT 代码,但可以参考这个项目:https://github.com/Rayhane-mamah/OpenNMT
  2. 数据增强: 案例:数据增强的 GANs 代码:使用 TensorFlow 和 Keras 库实现的数据增强 GANs 代码示例
  3. 医学影像处理: 案例:医学影像生成的 GANs 代码:使用 TensorFlow 和 Keras 库实现的医学影像生成 GANs 代码示例
  4. 游戏生成: 案例:游戏关卡生成的 GANs 代码:使用 TensorFlow 和 Keras 库实现的游戏关卡生成 GANs 代码示例
  5. 风格迁移: 案例:Neural Style Transfer 代码:使用 TensorFlow 和 Keras 库实现的 Neural Style Transfer 代码示例
  6. 数据去噪: 案例:去噪 GANs 代码:使用 TensorFlow 和 Keras 库实现的去噪 GANs 代码示例

以上5到10下次会详细介绍 以上仅为 GANs 应用的一部分,实际上 GANs 在许多其他领域也有广泛的应用,例如推荐系统、自动驾驶、机器人等。随着技术的不断发展,GANs 的应用范围还将继续扩大。

二、用GAN创作画作

首先,确保已经安装了 TensorFlow 和 Keras。然后,我们将使用一个预训练的生成对抗网络,例如 DCGAN。

  1. 安装所需库:
pip install tensorflow
  1. 导入所需库:
import tensorflow as tf  
from tensorflow.keras.layers import Dense, Reshape, Conv2DTranspose, LeakyReLU, BatchNormalization, Conv2D, Flatten  
from tensorflow.keras.models import Sequential
  1. 定义生成器和判别器模型。
def build_generator(noise_dim=100):  
    model = Sequential()  
    model.add(Dense(4 * 4 * 256, input_shape=(noise_dim,)))  
    model.add(Reshape((4, 4, 256)))  
    model.add(Conv2DTranspose(128, kernel_size=5, strides=2, padding='same'))  
    model.add(LeakyReLU(alpha=0.2))  
    model.add(BatchNormalization())  
    model.add(Conv2DTranspose(64, kernel_size=5, strides=2, padding='same'))  
    model.add(LeakyReLU(alpha=0.2))  
    model.add(BatchNormalization())  
    model.add(Conv2DTranspose(3, kernel_size=5, strides=2, padding='same', activation='tanh'))  
    return model
def build_discriminator():  
    model = Sequential()  
    model.add(Conv2D(64, kernel_size=5, strides=2, padding='same', input_shape=(64, 64, 3)))  
    model.add(LeakyReLU(alpha=0.2))  
    model.add(Conv2D(128, kernel_size=5, strides=2, padding='same'))  
    model.add(LeakyReLU(alpha=0.2))  
    model.add(Conv2D(256, kernel_size=5, strides=2, padding='same'))  
    model.add(LeakyReLU(alpha=0.2))  
    model.add(Flatten())  
    model.add(Dense(1))  
    return model
  1. 加载预训练的 DCGAN 模型权重。
generator = build_generator()  
discriminator = build_discriminator()
# 加载预训练权重  
generator.load_weights('https://github.com/anishathalye/dcgan_weights/releases/download/v1.0/dcgan_weights_imdb.h5')  
discriminator.load_weights('https://github.com/anishathalye/dcgan_weights/releases/download/v1.0/dcgan_weights_imdb.h5')
  1. 定义生成图像的函数。
def generate_image(generator, noise):  
    noise = np.reshape(noise, (1, -1))  
    image = generator.predict(noise)[0]  
    return image
  1. 生成具有国庆中秋氛围的画作。
def main():  
    # 创建一个 100x100 像素的画布  
    canvas = np.random.random((100, 100, 3)) * 255
    # 生成一个 100 维的随机噪声向量  
    noise = np.random.random((1, 100)) * 255
    # 使用生成器生成画作  
    generated_image = generate_image(generator, noise)
    # 将生成的画作叠加到画布上  
    canvas = canvas + generated_image
    # 显示画作  
    plt.imshow(canvas)  
    plt.show()
if __name__ == '__main__':  
    main()

运行上述代码后,将生成一幅具有国庆中秋氛围的画作。请注意,生成的图像可能不会完美地表现出国庆和中秋的元素,但可以作为一种尝试。此外,可以根据需要调整画布大小和噪声向量的维度以获得不同的画作效果。

国庆中秋特辑(二)浪漫祝福方式 使用生成对抗网络(GAN)生成具有节日氛围的画作_人工智能_02

标签:kernel,strides,生成,padding,GAN,add,特辑,model,size
From: https://blog.51cto.com/u_15814859/7978241

相关文章

  • matlab生成32*32wheel图像
    clear;clc;closex=zeros(32,32);a=1;x(6,5)=a;x(6,28)=a;x(7,4:6)=a;x(7,27:29)=a;x(8,3:7)=a;x(8,26:30)=a;x(9,3:8)=a;x(9,25:30)=a;x(10,2:9)=a;x(10,24:31)=a;x(11,2:10)=a;x(11,23:31)=a;x(12,2:11)=a;x(12,22:30)=a;x(13,4:12)=a;x(13,21:29)=a;......
  • 随机数生成与排序
    随机数生成是计算机领域当中十分常见的功能,下面展示随机数生成的方法以及生成之后对随机数进行排序,这里使用的是快速排序,快速排序不懂的同学,可以参考我的另外一博客链接,这里不做讲解:https://www.cnblogs.com/caizhou520/p/14542847.html随机数生成以及快速排序的代码如下所示:......
  • 最小生成树 PRIM算法 - 附可运行代码
    学习的时候,觉得这篇资料蛮好的:https://www.cnblogs.com/JayShao/p/12381830.html 然后这篇文章比较新颖,自觉比较适合写代码的理解:https://www.geeksforgeeks.org/kruskals-minimum-spanning-tree-algorithm-greedy-algo-2/  代码也比较齐全,我自己动手试试吧! Prim:生成......
  • R语言股市可视化相关矩阵:最小生成树|附代码数据
    原文链接:http://tecdat.cn/?p=17835最近我们被客户要求撰写关于股市可视化的研究报告,包括一些图形和统计输出。本文在股市可视化中可视化相关矩阵 :最小生成树在本文示例中,我将使用日数据和1分钟数据来可视化股票数据。我发现以下概念定义非常有用: 连通图:在无向图中,若任......
  • 思路开发银行流水生成器,仅供学习,可按参数生成数据
    其实小编我自己也比较闲,那么今天就给大家分享一款用易语言开发的银行流水生成器,别说,做的还挺像的~~~~~~~~~~我先把界面给大家奉上来,大家看下 然后核心代码部分我会在这里给大家贴出来,然后软件的话可以去我自己的博客能下载到的!!!============================================......
  • Vivado生成bitstream时报错[Opt 31-67] Problem: A LUT3 cell in the design is missi
    这个原因主要是因为有一个引脚没有用到,解决方法。1、打开Schematic。2、根据提示的模块去找,比如说我的报错。[Opt31-67]Problem:ALUT3cellinthedesignismissingaconnectiononinputpinI1,whichisusedbytheLUTequation.Thispinhaseitherbeenleftun......
  • 生成不了SSH密钥(万恶的SPB_Data)
    前提你能看到这,说明大概率你是个软硬通吃的苦逼人问题之前有安装过某些硬件类软件(orcad),卸载后删除了相关的文件夹,关联git的时候想创建ssh,发现路径下文件夹不存在,创建不了ssh解决右键此电脑->属性->高级系统设置,在最上面找到:高级,点击后,在右下角找到环境变量,点进去后,找到用户变......
  • JWT生成与解析
    官方解析地址:官网地址<!--JWT(JsonWebToken)登录支持--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>生成JWT//JWT头部分信息【Header】......
  • MybatisX-Generator自动代码生成插件使用
    使用步骤:1、安装MybatisX插件;2、idea的database连接数据库;3、数据库表上右键,点击MybatisX-Generator;4、 进行生成代码的配置,按自己的项目项目修改如图三个位置的路径,配置完成后点击Next 5、本人项目是Mybatis-plus项目,如图的配置是针对Mybatis-plus......
  • udig安装使用及geoserver图层样式sld的生成与配置
    uDig(User-friendlyDesktopInternetGIS)是一个开源的桌面地理信息系统(GIS)应用程序,专注于提供易于使用的GIS功能和地图制图工具。uDig是一个opensource(EPLandBSD)桌面应用程序框架,构建在EclipseRCP和GeoTools(一个开源的JavaGIS工具包)上的桌面GIS(地理信息系统);是一款......