【神经网络】生成对抗网络GAN
生成对抗网络GAN
欢迎访问Blog总目录!
文章目录
- 生成对抗网络GAN
- 1.学习链接
- 2.GAN结构
- 2.1.生成模型Generator
- 2.2.判别模型Discrimintor
- 2.3.伪代码
- 3.优缺点
- 3.1.优势
- 3.2.缺点
- 4.pytorch GAN
- 4.1.API
- 4.2.GAN的搭建
- 4.2.1.结果
- 4.2.2.代码
- 4.3.示意图:star:
1.学习链接
Generative Adversarial Networks
生成对抗网络(GAN) - 知乎 (zhihu.com)
深度学习----GAN(生成对抗神经网络)原理解析_gan神经网络-CSDN博客
图解 生成对抗网络GAN 原理 超详解_生成对抗网络gan图解-CSDN博客
2.GAN结构
GAN包含两个模型:
- 生成模型(Generator):接收随机噪声,生成看起来真实的、与原始数据相似的实例。
- 判别模型(Discrimintor):判断Generator生成的实例是真实的还是人为伪造的。(真实实例来源于数据集,伪造实例来源于生成模型)
最终得到效果极好的生成模型,其生成的实例真假难辨。
GAN的灵感来源于 “零和博弈” (完全竞争博弈),GAN就是通过生成网络G(Generator)和判别网络D(Discriminator)不断博弈,进而使G学习到数据的分布,即达到纳什均衡。
【纳什均衡】博弈中这样的局面,对于每个参与者来说,只要其他人不改变策略,他就无法改善自己的状况。对于GAN,即生成模型 G 恢复了训练数据的分布(造出了和真实数据一模一样的样本),判别模型D判别不出来结果(乱猜),准确率为 50%(收敛)。这样双方网络利益均最大化,不再改变自己的策略(不再更新自己的权重)。
2.1.生成模型Generator
- 输入: 数据集的某些向量信息,此处使用满足常见分布(高斯分布、均值分布等)的随机向量。
- 输出: 符合像素大小的图片。
- 结构: 全连接神经网络或者反卷积网络。
2.2.判别模型Discrimintor
- 输入: 伪造图片和数据集图片
- 输出: 图片的真伪标签
- 结构: 判别器模型(全连接网络、卷积网络等)
2.3.伪代码
3.优缺点
3.1.优势
- GAN采用的是一种无监督的学习方式训练,可以被广泛用在无监督学习和半监督学习领域
- 模型只用到了反向传播,而不需要马尔科夫链
3.2.缺点
- 难以学习离散数据,如文本
4.pytorch GAN
4.1.API
生成对抗网络 - PyTorch官方教程中文版 (panchuang.net)
4.2.GAN的搭建
绘制在upper_bound和lower_bound之间的一元二次方程画
4.2.1.结果

4.2.2.代码
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plttorch.manual_seed(1) # reproducible
np.random.seed(1)# Hyper Parameters
BATCH_SIZE = 64
LR_G = 0.0001 # learning rate for generator
LR_D = 0.0001 # learning rate for discriminator
N_IDEAS = 5 # 噪声点个数
ART_COMPONENTS = 15 # 15个Y轴数据点
PAINT_POINTS = np.vstack([np.linspace(-1, 1, ART_COMPONENTS) for _ in range(BATCH_SIZE)])# show our beautiful painting range
# plt.plot(PAINT_POINTS[0], 2 * np.power(PAINT_POINTS[0], 2) + 1, c='#74BCFF', lw=3, label='upper bound')
# plt.plot(PAINT_POINTS[0], 1 * np.power(PAINT_POINTS[0], 2) + 0, c='#FF9359', lw=3, label='lower bound')
# plt.legend(loc='upper right')
# plt.show()def artist_works(): # painting from the famous artist (real target)a = np.random.uniform(1, 2, size=BATCH_SIZE)[:, np.newaxis]paintings = a * np.power(PAINT_POINTS, 2) + (a-1)paintings = torch.from_numpy(paintings).float()return paintingsG = nn.Sequential( # Generatornn.Linear(N_IDEAS, 128), # random ideas (could from normal distribution)nn.ReLU(),nn.Linear(128, ART_COMPONENTS), # making a painting from these random ideas
)D = nn.Sequential( # Discriminatornn.Linear(ART_COMPONENTS, 128), # receive art work either from the famous artist or a newbie like Gnn.ReLU(),nn.Linear(128, 1),nn.Sigmoid(), # tell the probability that the art work is made by artist
)opt_D = torch.optim.Adam(D.parameters(), lr=LR_D)
opt_G = torch.optim.Adam(G.parameters(), lr=LR_G)plt.ion() # something about continuous plottingfor step in range(10000):artist_paintings = artist_works() # real painting from artistG_noise = torch.randn(BATCH_SIZE, N_IDEAS, requires_grad=True) # random ideas\nG_paintings = G(G_noise) # fake painting from G (random ideas)prob_artist0 = D(artist_paintings) # 判断真画prob_artist1 = D(G_paintings) # 判断假画# D增加真画概率,减少伪画概率; 梯度下降法为减小误差,所以添加-号# D_loss越小,prob_artist0越大,prob_artist1越小D_loss = - torch.mean(torch.log(prob_artist0) + torch.log(1. - prob_artist1))opt_D.zero_grad()D_loss.backward(retain_graph=True) # reusing computational graphopt_D.step()# 重新采样G_noise = torch.randn(BATCH_SIZE, N_IDEAS, requires_grad=True) # random ideas\nG_paintings = G(G_noise) # fake painting from G (random ideas)prob_artist1 = D(G_paintings) # 判断假画# G_loss越小,prob_artist1越大G_loss = torch.mean(torch.log(1. - prob_artist1))opt_G.zero_grad()G_loss.backward()opt_G.step()if step % 50 == 0: # plottingplt.cla()plt.plot(PAINT_POINTS[0], G_paintings.data.numpy()[0], c='#4AD631', lw=3, label='Generated painting', )plt.plot(PAINT_POINTS[0], 2 * np.power(PAINT_POINTS[0], 2) + 1, c='#74BCFF', lw=3, label='upper bound')plt.plot(PAINT_POINTS[0], 1 * np.power(PAINT_POINTS[0], 2) + 0, c='#FF9359', lw=3, label='lower bound')# D 的判断准确度=50%最优plt.text(-.5, 2.3, 'D accuracy=%.2f (0.5 for D to converge)' % prob_artist0.data.numpy().mean(),fontdict={'size': 13})plt.text(-.5, 2, 'D score= %.2f (-1.38 for G to converge)' % -D_loss.data.numpy(), fontdict={'size': 13})plt.ylim((0, 3));plt.legend(loc='upper right', fontsize=10);plt.draw();plt.pause(0.01)plt.ioff()
plt.show()
4.3.示意图⭐️
相关文章:

【神经网络】生成对抗网络GAN
生成对抗网络GAN 欢迎访问Blog总目录! 文章目录 生成对抗网络GAN1.学习链接2.GAN结构2.1.生成模型Generator2.2.判别模型Discrimintor2.3.伪代码 3.优缺点3.1.优势3.2.缺点 4.pytorch GAN4.1.API4.2.GAN的搭建4.2.1.结果4.2.2.代码 4.3.示意图:star: 1.学习链接 …...

智慧能耗预付费系统解决方案——用户侧能源计量及收费
安科瑞电气股份有限公司 祁洁 15000363176 一、方案组织架构 二、方案特点 (1)多样组网,多样设备接入,多样部署; (2)集团管理、项目分级、分层拓扑; (3)…...

探秘大模型:《提示工程:技巧、方法与行业应用》背后的故事
提示工程是一种新兴的利用人工智能的技术,它通过设计提示引导生成式 AI 模型产生预期的输出,来提升人与 AI 的互动质量,激发 AI 模型的潜力,提升AI的应用水平。 为了让每一个人都拥有驱动大模型的能力,以微软全球副总裁…...

2024年光学通信和物联网、自动化控制和大数据国际会议(OCITACB2024)
2024年光学通信和物联网、自动化控制和大数据国际会议(OCITACB2024) 会议简介 2024年国际光通信与物联网、自动控制和大数据会议(OCITACB2024)的主要目标是促进光通信与物联网、自动管理和大数据领域的研发活动。另一个目标是促进研究人员、开发人员、工…...
q @ k运算及att = (q @ k.transpose(-2, -1))含义
以下代码经常在Transformer的算法中见到:q, k, v qkv[0], qkv[1], qkv[2] # query, key, value tensor q q * self.scale attn (q k.transpose(-2, -1))其中涉及到a b操作和transpose操作 a torch.Tensor([[1,2],[3,4]]) print(a)b torch.Tensor([[0.5,2],[…...
leetcode628-Maximum Product of Three Numbers
题目 给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。 示例 1: 输入:nums [1,2,3] 输出:6 分析 这道题目要求数组中三个数组成的最大乘积,由于元素有正数有负数ÿ…...

本地项目提交 Github
工具 GitIdeaGithub 账号 步骤 使用注册好的 Github 账号,登陆 Github; 创建 Repositories (存储库),注意填写图上的红框标注; 创建完成之后,找到存储库的 ssh 地址或 https 地址,这取决于你自己的配置…...

Idea中 maven 下载jar出现证书问题
目录 1: 具体错误: 2: 忽略证书代码: 3: 关闭所有idea, 清除缓存, 在下面添加如上忽略证书代码 4:执行 maven clean 然后刷刷新依赖 完成,撒花!&#x…...

ArcGIS Server 10发布要素服务时遇到的数据库注册问题总结(一)
工作环境: Windows 7 64 位旗舰版 ArcGIS Server 10.1 ArcGIS Desktop 10.1 IIS 7.0 开始的时候以为10.1发布要素服务和10.0一样,需要安装ArcSDE,后来查阅资料发现不需要,数据库直连方式就可以了。 首先我来说一下发布要素服…...
自我介绍的HTML 页面(入门)
一.前情提要 1.主要是代码示例,具体内容需自己填充 2.代码后是详解 二.代码实例和解析 代码 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>自我介绍页面</title>…...
负载均衡原理及算法
负载均衡(Load Balancing)是在计算机网络中,将工作负载(即请求)分配给多个资源,以实现最优资源利用、最大化性能、最小化延迟和提高可用性等目标的技术。负载均衡通常用于分布式系统、网络服务和服务器集群…...
【iOS ARKit】USDZ文件
USDZ 概述 ARKit 支持 USDZ(Universal Scene Description Zip,通用场景描述文件包)、Reality 两种格式的模型文件,得益于 USDZ的强大描述能力与网络传输便利性,使得iOS 设备能够在其信息(Message࿰…...

鹅厂实习offer
#转眼已经银四了,你收到offer了吗# 本来都打算四月再投实习了,突然三月初被wxg捞了(一年前找日常实习投的简历就更新了下),直接冲了,流程持续二十多天,结果是运气还不错,应该是部门比…...

极狐GitLab 如何在 helm 中恢复数据
本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何在极狐GitLab …...

Hololens2远程音视频通话与AR远程空间标注,基于OpenXR+MRTK3+WebRTC实现
Hololens2远程音视频通话与AR远程空间标注 使用Unity2021.3.21版本开发,基于OpenXRMRTK3.0WebRTC实现。 (1)通过视频获取视频帧的矩阵的方法可以参考:https://learn.microsoft.com/zh-cn/windows/mixed-reality/develop/advanced…...

2024年03月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析
本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(一共 15 个题目,每题 2 分,共 30 分) 第1题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( ) A、小程序 B、计时器 C、操作系统 D、神话人物 答案…...
开发语言漫谈-C#
C#的#,字面上的意思就是,也就是把C再。微软只所以搞C#就是要抗衡Java。微软当时搞了个J,被Java告了,没办法了只能另取炉灶。从纯技术角度来看,C#设计非常优秀,可以覆盖所有领域,是几乎唯一的全栈…...

微信小程序用户登录授权指定(旧版本)
配置旧版本基础库2.12.3 实现效果 点击登录按钮即可直接登录,获取用户昵称和头像 点击获取头像昵称按钮则需要授权,才能成功登录 代码实现 my.xml <!-- 登录页面,调试基础库为2.20.2库 --> <view class"mylogin"><block w…...

电商技术揭秘十五:数据挖掘与用户行为分析
相关系列文章 电商技术揭秘一:电商架构设计与核心技术 电商技术揭秘二:电商平台推荐系统的实现与优化 电商技术揭秘三:电商平台的支付与结算系统 电商技术揭秘四:电商平台的物流管理系统 电商技术揭秘五:电商平台…...

云原生:5分钟了解一下Kubernetes是什么
在当今的云计算时代,容器化技术变得越来越重要。它能够帮助开发者更高效地部署和管理应用程序。而Kubernetes,作为容器编排领域的领军者,正逐渐成为企业构建和管理云原生应用的核心工具。 近期将持续为大家分享Kubernetes相关知识ÿ…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...