当前位置: 首页 > news >正文

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

生成对抗网络(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 modelgenerator = 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 modeldiscriminator = 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.0X_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.5fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)cnt = 0for 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 += 1plt.show()

2.8 开始训练

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

epochs = 10000
batch_size = 64
sample_interval = 1000train(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.0X_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.5fig, axs = plt.subplots(image_grid_rows, image_grid_columns, figsize=(4, 4), sharey=True, sharex=True)cnt = 0for 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 += 1plt.show()
开始训练

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

epochs = 10000
batch_size = 64
sample_interval = 1000train(epochs, batch_size, sample_interval)

三、总结

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

相关文章:

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

生成对抗网络(Generative Adversarial Networks,GANs)是一种由Ian Goodfellow等人在2014年提出的深度学习模型,广泛用于图像生成、图像超分辨率、图像修复等领域。GAN由一个生成器(Generator)和一个判别器&…...

【Redis】 Redis 列表指令指南

这是我父亲 日记里的文字 这是他的生命 留下留下来的散文诗 几十年后 我看着泪流不止 可我的父亲已经 老得像一个影子 🎵 许飞《父亲写的散文诗》 Redis 是一个开源的内存数据库,支持多种数据结构,其中列表(…...

设计测试用例的具体方法

一.等价类 等价类分为: 1.有效等价类 [6~15] 2.无效等价类 :小于6位,大于15位(不在数据范围内) 组合规则: 有效等价类组合的时候,尽可能一条测试用例尽可能多的覆盖有效等价类 无效等价类组合的时候,一条测试点,之恶能覆盖一个无效等价类 二.边界值 1.上点,离点,内点 上…...

GPT-4o mini(假设模型)概览

开篇背景: 近年来,随着计算能力的提升和大数据的积累,大型语言模型(LLMs)如GPT系列取得了显著进展。这些模型不仅能够理解复杂的自然语言文本,还能生成流畅、连贯的回复,甚至展现出一定程度的创…...

抽象代数精解【9】

文章目录 置换密码密码体制加解密过程置换置换运算定义置换运算的例子集合与置换置换规则两行表示法轮换表示法置换运算的结果置换的性质注意事项 分组加解密 理论基础1. 准备工作2. 置换过程3. 置换密码的具体实现方式4. 安全性分析5. 置换密码的应用代换密码代换密码的工作原…...

熟悉简单测试面经

SQL语句中增、删、查、改的关键字 MySQL中SQL语句删除语句有哪些?区别是啥。 “”和equals的区别 “String s "1"”与“String s new String("1")”中的s一样吗? StringBuilder与StringBuffer的区别 洗牌问题 HTTP、HTTPS、U…...

IoTDB 入门教程 实战篇④——C#示例(开源)

文章目录 一、前文二、新建C#项目三、NuGet安装四、示例源码五、查询数据六、参考 一、前文 IoTDB入门教程——导读 本文详细阐述了如何通过一个C#项目成功连接到IoTDB时序数据库,进而展示了如何向该数据库高效地写入数据以及执行精确的数据查询操作。 此示例旨在为…...

STL-vector容器

目录 一、常见接口 1.1 构造函数 1.2 访问与遍历 1.3 容量操作 1.4 增删查改 二、模拟实现 2.1 迭代器失效 2.2 源代码 一、常见接口 vector数据结构实际上是顺序表 详细解释与使用请参见官方网站:vector - C Reference (cplusplus.com) 1.1 构造函数 函…...

python字符串与变量名互相转换,字典,list操作

locals是python的内置函数,他可以以字典的方式去访问局部和全局变量 vars()本函数是实现返回对象object的属性和属性值的字典对象 eval()将字符串str当成有效的表达式来求值并返回计算结果 #!/usr/bin/python3 #-*- coding uft-8 -*- guo 666 str1 "guo&qu…...

企业及园区电力能源管理系统方案

概述 面对中小型的用能集团、园区能耗监测分析等场景需求,拓扑未来公司推出标准化的企业及园区电力能源管理系统方案,力求高效高质地为目标客户提供高效部署、轻松运维的本地化能源管理解决方案。 本方案以软硬件一体的方式,集成了标准电力监…...

5.3 需求分析

需求分析 软件需求定义分类练习题 需求工程需求获取练习题 需求分析状态转化图数据流图DFD顶层数据流图0层数据流图1层数据流图 练习题 需求规约需求定义方法 需求验证需求管理版本控制需求跟踪变更控制练习题 考试大概3分 软件需求 定义 软件需求:是指用户对目标…...

【C++】list介绍以及模拟实现(超级详细)

欢迎来到我的Blog,点击关注哦💕 list的介绍和模拟实现 前言list介绍标准库容器 std::list 与 std::vector 的优缺点缺点 list的基本操作构造函数list iteratorlist capcacitylist modify list模拟实现存贮结构(双向带头循环)itera…...

从艺术创作到作物生长,农业AI迎来“GPT“时刻

(于景鑫 国家农业信息化工程技术研究中心)"GPT"一词早已不再神秘,其在文本、图像生成领域掀起的风暴正以摧枯拉朽之势席卷全球。人们惊叹于ChatGPT对话之智能、思维之敏捷,更对Stable Diffusion、Midjourney创作的艺术画作赞叹不已。而大语言模…...

前端使用 Konva 实现可视化设计器(19)- 连接线 - 直线、折线

本章响应小伙伴的反馈,除了算法自动画连接线(仍需优化完善),实现了可以手动绘制直线、折线连接线功能。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee…...

C#:通用方法总结—第15集

大家好&#xff0c;今天继续分享我们的通用方法系列。 下面是今天的通用方法&#xff1a; &#xff08;1&#xff09;这个通用方法为用文件流写数据 /// <summary> /// 用文件流写数据 /// </summary> /// <param name"data"></param> //…...

LoadRunner12 添加事务并添加检查点

1、先要添加事务开始函数lr_start_transaction("登陆事务");&#xff0c;在接口上方右击点击-插入-开始事务。输入事务名称&#xff1b; 2、在某个接口想法 右击点击-插入-结束事务&#xff0c;输入事务名称&#xff0c;与开始事务名称要保持一致&#xff0c;lr_end_…...

python中的文件

绝对路径和相对路径 一般情况下绝对路径就是从根目录开始描述的路径 相对路径就是相对于当前目录 . 没错,就是一个点,表示的是当前文件夹;.. 两个点表示的是上一层文件夹 os模块与os.path os 和 os.path 是两个非常重要的标准库模块,它们分别用于操作系统相关的功能操…...

Powerdesigner连接mysql数据库,逆向工程生成ER图 (保姆级教程:下载->连接->配置)看这一篇就够了

一、下载powerdesigner 下载的教程请看如下链接&#xff0c;我太懒了&#xff0c;直接借鉴&#xff01; 把别大佬的博客搬过来了嘿嘿~我真聪明&#xff01;ㄟ( ▔, ▔ )ㄏ 操作到完成汉化就好&#xff01;&#xff01;第5步不看了&#xff0c;别按那个走&#xff0c;因为新手…...

商家转账到零钱分销返佣申请方案及驳回处理办法

分销返佣场景是商家申请最多的场景&#xff0c;因而申请被驳回也是最多的&#xff0c;根据我们上万次成功开通商家转账到零钱的经验&#xff0c;当商家转账到零钱的分销返佣场景被驳回时&#xff0c;按照以下步骤&#xff0c;商家都可以快速过审&#xff1a; 一、分析驳回原因 …...

荟萃科技:国外问卷调查有没有实时更新的题库?

有的&#xff0c;口子查和渠道查都是。 口子查的题目都是国外的公司发放在网络上&#xff0c;都是实时发布&#xff0c;所以我们需要去国外的各大社交平台做题。 这些题目不是集中的&#xff0c;而是散布在网站里面&#xff0c;需要我们去找&#xff0c;都是老外上班实时发放…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...