[Day 44] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

news2024/10/1 21:33:49

生成对抗网络(Generative Adversarial Networks,GANs)是一种由Ian Goodfellow等人在2014年提出的深度学习模型,广泛用于图像生成、图像超分辨率、图像修复等领域。GAN由一个生成器(Generator)和一个判别器(Discriminator)组成,二者通过对抗训练相互提升性能。以下是关于GAN的详细介绍和代码实现示例。

一、生成对抗网络的原理

1.1 生成器(Generator)

生成器的目标是生成逼真的样本,使得判别器无法区分生成样本和真实样本。生成器接收一个随机噪声向量(通常为高斯分布或均匀分布),通过一系列的神经网络层转换成逼真的数据样本。

1.2 判别器(Discriminator)

判别器的目标是将真实样本和生成样本区分开来。判别器是一个二分类模型,输入为样本数据,输出为分类概率,表示输入样本是“真实”还是“生成”的概率。

1.3 对抗训练

生成器和判别器通过对抗训练来提升彼此的能力。生成器试图欺骗判别器,而判别器不断提升自己的判别能力。二者的目标函数如下:

  • 生成器的损失函数:使得生成样本被判别器判断为真实样本的概率最大。
  • 判别器的损失函数:最大化判别真实样本和生成样本的能力。

具体的数学表达式如下:

min_{G} max_{D}V(D,G)E_{x\sim p_{data}(x)}[logD(x)]+E_{x\sim p_{z}(z)}[log(1 - D(G((z)))]

二、代码实现

我们将以MNIST数据集为例,使用Keras实现一个简单的GAN模型。

2.1 导入必要的库

import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
from keras.models import Sequential, Model
from keras.layers import Dense, LeakyReLU, BatchNormalization, Reshape, Flatten, Input
from keras.optimizers import Adam

2.2 数据预处理

加载并预处理MNIST数据集,使其适用于GAN的输入。

# 加载MNIST数据集
(X_train, _), (_, _) = mnist.load_data()

# 归一化并reshape数据
X_train = X_train / 127.5 - 1.0
X_train = np.expand_dims(X_train, axis=3)

# 输入维度
img_shape = X_train.shape[1:]
z_dim = 100  # 噪声向量维度

2.3 构建生成器

生成器将噪声向量转换为逼真的图像。我们使用全连接层和转置卷积层实现这一过程。

def build_generator(z_dim):
    model = Sequential()

    model.add(Dense(256, input_dim=z_dim))
    model.add(LeakyReLU(alpha=0.01))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Dense(512))
    model.add(LeakyReLU(alpha=0.01))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Dense(1024))
    model.add(LeakyReLU(alpha=0.01))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Dense(np.prod(img_shape), activation='tanh'))
    model.add(Reshape(img_shape))

    return model

generator = build_generator(z_dim)
generator.summary()

2.4 构建判别器

判别器将输入图像分类为真实或生成的。我们使用卷积层和全连接层实现这一过程。

def build_discriminator(img_shape):
    model = Sequential()

    model.add(Flatten(input_shape=img_shape))
    model.add(Dense(512))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Dense(256))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Dense(1, activation='sigmoid'))

    return model

discriminator = build_discriminator(img_shape)
discriminator.summary()

2.5 编译模型

我们为生成器和判别器选择优化器,并编译判别器。

# 优化器
optimizer = Adam(0.0002, 0.5)

# 编译判别器
discriminator.compile(loss='binary_crossentropy',
                      optimizer=optimizer,
                      metrics=['accuracy'])

2.6 构建GAN模型

我们将生成器和判别器结合起来,构建完整的GAN模型,并编译生成器。

# 构建生成器
z = Input(shape=(z_dim,))
img = generator(z)

# 将判别器设置为不可训练,仅训练生成器
discriminator.trainable = False

# 判别器预测生成图像
validity = discriminator(img)

# 构建GAN模型
gan = Model(z, validity)
gan.compile(loss='binary_crossentropy', optimizer=optimizer)

gan.summary()

2.7 训练模型

我们定义训练过程,包括生成器和判别器的训练步骤。

def train(epochs, batch_size=128, sample_interval=100):
    # 加载数据
    (X_train, _), (_, _) = mnist.load_data()
    X_train = X_train / 127.5 - 1.0
    X_train = np.expand_dims(X_train, axis=3)

    # 真实标签
    real = np.ones((batch_size, 1))
    fake = np.zeros((batch_size, 1))

    for epoch in range(epochs):
        # ---------------------
        # 训练判别器
        # ---------------------
        # 随机选择真实图像
        idx = np.random.randint(0, X_train.shape[0], batch_size)
        imgs = X_train[idx]

        # 生成噪声并生成假图像
        z = np.random.normal(0, 1, (batch_size, z_dim))
        gen_imgs = generator.predict(z)

        # 训练判别器
        d_loss_real = discriminator.train_on_batch(imgs, real)
        d_loss_fake = discriminator.train_on_batch(gen_imgs, fake)
        d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)

        # ---------------------
        # 训练生成器
        # ---------------------
        z = np.random.normal(0, 1, (batch_size, z_dim))
        g_loss = gan.train_on_batch(z, real)

        # 打印进度
        print(f"{epoch} [D loss: {d_loss[0]} | D accuracy: {100 * d_loss[1]}] [G loss: {g_loss}]")

        # 每隔sample_interval保存生成的图像样本
        if epoch % sample_interval == 0:
            sample_images(epoch)

def sample_images(epoch, image_grid_rows=4, image_grid_columns=4):
    z = np.random.normal(0, 1, (image_grid_rows * image_grid_columns, z_dim))
    gen_imgs = generator.predict(z)
    gen_imgs = 0.5 * gen_imgs + 0.5

    fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)
    cnt = 0
    for i in range(image_grid_rows):
        for j in range(image_grid_columns):
            axs[i, j].imshow(gen_imgs[cnt, :, :, 0], cmap='gray')
            axs[i, j].axis('off')
            cnt += 1
    plt.show()

2.8 开始训练

我们设置训练参数并开始训练GAN模型。

epochs = 10000
batch_size = 64
sample_interval = 1000

train(epochs, batch_size, sample_interval)

2.9 详细解释代码

导入库

我们导入了Keras和其他必要的库,用于构建和训练我们的GAN模型。

import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
from keras.models import Sequential, Model
from keras.layers import Dense, LeakyReLU, BatchNormalization, Reshape, Flatten, Input
from keras.optimizers import Adam
数据预处理

我们加载MNIST数据集,并对图像进行归一化处理,将其范围调整到[-1, 1],以便于GAN的训练。

(X_train, _), (_, _) = mnist.load_data()
X_train = X_train / 127.5 - 1.0
X_train = np.expand_dims(X_train, axis=3)
img_shape = X_train.shape[1:]
z_dim = 100
构建生成器

生成器将噪声向量转换为逼真的图像。我们使用了全连接层、LeakyReLU激活函数和批归一化层来实现这一过程。

def build_generator(z_dim):
    model = Sequential()

    model.add(Dense(256, input_dim=z_dim))
    model.add(LeakyReLU(alpha=0.01))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Dense(512))
    model.add(LeakyReLU(alpha=0.01))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Dense(1024))
    model.add(LeakyReLU(alpha=0.01))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Dense(np.prod(img_shape), activation='tanh'))
    model.add(Reshape(img_shape))

    return model
构建判别器

判别器将输入图像分类为真实或生成的。我们使用了卷积层、LeakyReLU激活函数和全连接层来实现这一过程。

def build_discriminator(img_shape):
    model = Sequential()

    model.add(Flatten(input_shape=img_shape))
    model.add(Dense(512))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Dense(256))
    model.add(LeakyReLU(alpha=0.01))
    model.add(Dense(1, activation='sigmoid'))

    return model
编译模型

我们为生成器和判别器选择优化器,并编译判别器。

optimizer = Adam(0.0002, 0.5)
discriminator.compile(loss='binary_crossentropy',
                      optimizer=optimizer,
                      metrics=['accuracy'])
构建GAN模型

我们将生成器和判别器结合起来,构建完整的GAN模型,并编译生成器。

z = Input(shape=(z_dim,))
img = generator(z)
discriminator.trainable = False
validity = discriminator(img)
gan = Model(z, validity)
gan.compile(loss='binary_crossentropy', optimizer=optimizer)
训练模型

我们定义训练过程,包括生成器和判别器的训练步骤。

def train(epochs, batch_size=128, sample_interval=100):
    (X_train, _), (_, _) = mnist.load_data()
    X_train = X_train / 127.5 - 1.0
    X_train = np.expand_dims(X_train, axis=3)
    real = np.ones((batch_size, 1))
    fake = np.zeros((batch_size, 1))

    for epoch in range(epochs):
        idx = np.random.randint(0, X_train.shape[0], batch_size)
        imgs = X_train[idx]
        z = np.random.normal(0, 1, (batch_size, z_dim))
        gen_imgs = generator.predict(z)
        d_loss_real = discriminator.train_on_batch(imgs, real)
        d_loss_fake = discriminator.train_on_batch(gen_imgs, fake)
        d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
        z = np.random.normal(0, 1, (batch_size, z_dim))
        g_loss = gan.train_on_batch(z, real)
        print(f"{epoch} [D loss: {d_loss[0]} | D accuracy: {100 * d_loss[1]}] [G loss: {g_loss}]")
        if epoch % sample_interval == 0:
            sample_images(epoch)

def sample_images(epoch, image_grid_rows=4, image_grid_columns=4):
    z = np.random.normal(0, 1, (image_grid_rows * image_grid_columns, z_dim))
    gen_imgs = generator.predict(z)
    gen_imgs = 0.5 * gen_imgs + 0.5
    fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)
    cnt = 0
    for i in range(image_grid_rows):
        for j in range(image_grid_columns):
            axs[i, j].imshow(gen_imgs[cnt, :, :, 0], cmap='gray')
            axs[i, j].axis('off')
            cnt += 1
    plt.show()
开始训练

我们设置训练参数并开始训练GAN模型。

epochs = 10000
batch_size = 64
sample_interval = 1000

train(epochs, batch_size, sample_interval)

三、总结

通过以上代码和详细解释,我们实现了一个简单的生成对抗网络模型,并通过训练使生成器能够生成逼真的MNIST手写数字图像。GANs在许多领域有着广泛的应用,本文只是一个起步,读者可以进一步探索其在图像超分辨率、图像修复、文本生成等方面的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1979469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

状态同步帧同步

帧同步: 有明确的逻辑帧概念,按照固定的逻辑帧间隔同步帧数据 原理 锁帧:mmo那种游戏,服务器需要收到第k帧所有客户端的指令,就算没有操作也发个空指令上去(相对来说回合制卡牌这类就简单很多&#xff0…

keil编程时,出现”MULTIPLE PUBLIC DEFINITIONS“,extern声明时不能赋值

原因导致重复定义? 有可能是重复定义导致的,这就需要查看报错位置的变量或函数是不是被重复定义了。也可能是一些语法错误导致的错误 语法错误导致的错误原因 使用extern只是为了说明这个变量在别的地方已经定义过,但使用extern引用时&…

NSS [HNCTF 2022 WEEK3]ssssti

NSS [HNCTF 2022 WEEK3]ssssti SSTI类题目(flask)毋庸置疑。 有过滤,我们拿burp先fuzz一波。长度159的都是被过滤的。 过滤了下划线、引号、args、os。 我们利用request对象绕过对下划线和引号的过滤(题目不允许POST方法&#x…

【机器学习】过拟合和欠拟合、高偏差(High Bias)和高方差(High Variance)的区别、过拟合和欠拟合的示例以及图表表示

引言 在机器学习中,过拟合(Overfitting)是指模型在训练数据上学习得太好,以至于它捕捉到了数据中的噪声和随机波动,而不是潜在的真实关系,这导致模型在新的、未见过的数据上表现不佳;欠拟合&…

从零开始:MySQL安装与配置完全指南

前言 哇,终于进入到令人激动的MySQL环节了 它可以说是你编程生涯中的最佳朋友,因为它总是能存储你的数据,从不说:“我忘记了你的信 息”。而且,它是免费的,不像一些昂贵的数据库,它从不让你的…

部署k8s+conatinerd环境

1、准备系统环境 禁用默认休眠(可选) 禁用:systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target启用:sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target …

随机对照临床试验(RCT)与历史对照临床试验(HCT)

临床试验是评估新药、新疗法或新技术有效性和安全性的关键手段。在临床试验中,如何选择对照组是影响试验结果准确性和可信度的重要因素。随机对照临床试验(Randomized Controlled Trial, RCT)和历史对照临床试验(Historical Contr…

苹果电脑玩的游戏有哪些 Mac电脑怎么玩Windows游戏 苹果电脑可以装模拟器玩游戏吗

苹果电脑虽然在游戏生态上可能不及Windows平台那么广泛,但其强大的硬件和macOS系统的优化,足以支持一系列高质量游戏的流畅运行。从策略游戏《文明VI》到动作冒险游戏《黑暗之魂III》,再到解谜游戏《传送门2》和角色扮演游戏《神界&#xff1…

世界顶尖哲学家排行榜前十名,全球公认十大最厉害的思想家之一

标题:智慧与爱心:塑造命运的双翼 正能量因有爱心, 负能量期待智慧…(升命学说) 在这个纷纭复杂的世界中,我们每个人都是自己命运的舵手。正如升命学说所揭示,正能量的培养离不开爱心的滋养&…

Springboot+Vue在线考试系统(优质版)-附项目源码与配套论文

1.1 开发背景 在线考试系统的设计与实现,首先需要对系统进行需求分析,明确系统的功能和性能要求。系统需要具备考试管理、题库管理、在线考试、自动阅卷等功能,同时还需要保证系统的安全性、稳定性和可扩展性。 在系统的架构设计方面&#…

【多线程-从零开始-贰】线程的构造方法和常见属性

Thread 的常见构造方法 在创建线程的时候,是可以给线程起名字的。默认为 Thread-0 、Thread-1… 不会影响线程执行效果,可以更好地进行管理 ThreadGroup -线程组 把多个线程放到一组里,方便统一的设置线程的一些属性不过现在很少用到&#…

【增减序列】

题目 思路 多次修改操作,为降低复杂度,采用差分。 差分数组的性质可以转化这个“所有数都一样”的目标,转化为”b[2] ~ b[n] 均为0“的目标。 为了使得方法数最少,要使得方法中不存在前后矛盾的部分,比如减了又加。…

【SpringIOC容器设计体系分析】

SpringIoc容器架构分析 BeanFactoryHierarchicalBeanFactoryListableBeanFactoryAutowireCapableBeanFactoryAbstractBeanFactoryAbstractAutowireCapableBeanFactoryDefaultListableBeanFactoryApplicationContextConfigurableApplicationContextApplicationContext除BeanFact…

nextjs 实现TodoList网页应用案例

参考: https://nextjs.org/ Next.js 是用于网络的一种 React 框架。一些世界上最大的公司在使用它,它能够借助 React 组件的力量让您创建高质量的网络应用程序。 1、创建项目: 另外注意:pages与app路由存在冲突,如果有…

UniApp手机滑块验证组件代码生成器

DIY可视化实现UniApp手机滑块验证组件,支持自定义背景图片、成功提示、错误提示、划动提示等。 手机滑块验证组件是一种广泛应用于手机应用、网页等场景的用户验证机制,其主要目的是通过用户的滑动操作来验证用户的真实性和操作意图,从而增强…

双目视觉标定的一般方法

1 双目立体相机 双目立体相机是由两个单目相机根据 特定的参数组合而成,工作时可将左右两相机捕捉到的二维图像信息转换到三维立体空间 中,进而通过系列转换变为所需要的三维空间坐标信息。 2 一般过程 双目立体相机标定步骤一般有以下几个步骤&#…

RabbitMQ应用场景及特性

RabbitMQ是一款开源的消息队列中间件,拥有非常好用的管理控制面板,类似使用navicat一样,简便的操纵数据库。 应用场景 一、流量削峰 在一些并发量较高的场景下,比如秒杀活动,抢票等,同一时间访问量急剧增…

C#数据类型 全局变量 类型转换方法(汇总)

1、C#和S7-1200PLC S7.NET通信 C#和S7-1200PLC S7.NET通信-CSDN博客文章浏览阅读98次。一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客这篇博客作为C#的基础系列,和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先…

【AI绘画】FLUX:这款新的人工智能图像生成器非常善于创造人手

FLUX.1 是 Stable Diffusion 的公开重量级继承者,可将文本转化为图像。 FLUX.1 dev 生成图像:“A beautiful queen of the universe holding up her hands, face in the background.”。 就在7月下旬,人工智能初创公司黑森林实验室&#xff…

从零入门CV图像竞赛(2024全球Deepfake攻防挑战赛)

从零入门CV图像竞赛(2024全球Deepfake攻防挑战赛) Deepfake是什么? Deepfake是一种利用深度学习技术,特别是生成对抗网络(GANs)来实现视频、音频等多媒体内容的伪造技术。这项技术可以实现对视频中人物的…