PaperNotes(2)-Generative Adversarial Net-代码实现资料

Generative Adversarial Nets-生成对抗网络

  • Abstract
  • 1.Introduction
  • 2.Related work
  • 3.Adversarial nets
  • 4.Theoretical Results
  • 5.Experiments
  • 6.Advantagesa and disadvantages
  • 7.Conclusions and future work
  • 8.GAN-代码实现资料
    • 8.1 pytorch 教程
    • 8.2 简书教程
    • 8.3 CSDN博客
    • 8.4 pytorch 中文文档

GAN开篇之作2014年

Abstract

我们通过一个对抗过程( adversarial process)给估计生成模型(generative models)提出了一个新的框架(最后是为了取生成模型)。在这个新的框架中,我们同时训练两个模型:一个用于捕获数据分布的生成模型G,一个判别模型D,用于估计来自训练集数据而非模型G产生的数据的概率。生成模型G的训练过程:最大化判别模型D产生错误的概率(不懂),这个框架与最小化两人博弈相对应。在任意函数G和D的空间中,存在唯一解;其中,G恢复训练数据分布,D处处等于0.5。在G和D由多层感知机定义的情况下,整个系统可以利用BP算法进行训练。在训练模型或者生成样本的过程中,不需要马尔科夫链或展开近似推理网络( unrolled approximate inference networks)。通过定性和定量分析生成样本,实验结果展示了本框架的潜力。

1.Introduction

深度学习有希望发现丰富的,有层次的模型[2],这些模型表达了人工智能应用领域各种数据的概率分布,例如自然图像、语音音频波、自然语言库的符号等数据的概率分布。到目前为止,深度学习最显著的成功都涉及到判别式模型,这些判别式模型将高维、丰富的感官输入映射类别标签[14,20]。这些惊人的成功主要依赖于BP算法dropout算法的应用,特别是具有良好梯度的分段线性单元。深度生成模型的影响力很小,主要是由于:极大似然估计和相关策略中出现了难以解决的概率计算困难、很难利用生成上下文中使用分段线性单元获得的好处。我们提出了一个生成估计模型,分步解决这些困难。

本文提出的对抗网络框架,其中的生成模型类似于与对手对峙:判别式模型要区分样本是来自数据分布还是生成模型分布。(做一个生动的比喻:)生成模型可以认为类似于一个造假团队,试图生产假币而且在不被发现的情况下使用它;而判别模型类似于一个警察,试图检测假币。在这个博弈中的竞争驱使两个团队都改进他们的方法性能直至真品与伪造品难以辨别(目的是:让造假团队的技术达到真假难辨)。

本文提出的框架能够给 许多模型和优化算法 产生特定的训练算法。本文中,我们探索了一个特例:将随机噪声输入到多层感知器的生成模型、判别模型也是一个多层感知器。我们称这个特殊情况为对抗网络。在这情况下,我们可以利用高度成熟的BP算法和dropout算法[16]训练两个模型;以及利用前向算法通过生成模型,计算模型生成样本。(这个过程中)不需要近似推断和马尔科夫链条。

2.Related work

目前,大多数关于深度生成模型的工作都聚焦于 提供概率分布函数的 参数化规范 的模型上。可以通过最大化对数似然函数训练模型。在这个模型家族中,最成功的是深度玻尔兹曼机(Deep Boltzmann machine)[25]。这些模型通常具有难以处理的似然函数,因此需要对似然梯度进行大量的近似。这些困难促使“生成机器”的发展–即不明确表示似然性,但能够从所需分布生成样本的模型。生成随机网络[4]是生成机器的一个例子,它可以通过精确的反向传播而不是Boltzmann机器所需的大量近似来训练。这项工作通过消除生成随机网络中使用的马尔可夫链扩展了生成机器的概念。

我们的工作是通过 生成过程 反向传播导数,通过观察
lim⁡σ→0∇xEϵ∼N(0,σ2I)f(x+ϵ)=∇xf(x)\lim _{\sigma \rightarrow 0} \nabla_{\boldsymbol{x}} \mathbb{E}_{\epsilon \sim \mathcal{N}\left(0, \sigma^{2} \boldsymbol{I}\right)} f(\boldsymbol{x}+\epsilon)=\nabla_{\boldsymbol{x}} f(\boldsymbol{x}) σ0limxEϵN(0,σ2I)f(x+ϵ)=xf(x)
我们开发这项工作时,并不知道金马和韦林[18]和雷森德等人[23]发展了更一般的随机反向传播规则,允许通过有限方差的高斯分布进行反向传播,并反向传播到协方差参数和均值。这些反向传播规则允许学习生成器的条件方差,在本文中,我们将其作为一个超参数处理。Kingma和Welling[18]和Rezende等人[23]使用随机反向传播训练变分自编码器(VAE)。与生成性对抗网络一样,变分自编码器将可微生成网络第二个神经网络配对。与生成性对抗网络不同,vae中的第二个网络识别模型,执行近似推理工作。gans需要通过可见单元来微分,因此不能对离散数据建模;vae需要通过隐藏单元来微分,因此不能有离散的潜在变量。其他类似vae的方法也存在[12,22],但与我们的方法关系不大。

先前有些工作尝试使用判别准则来训练生成模型[29,13]。这些标准则对于深层生成模型来说是难以适用的。这些方法甚至很难用来对深度模型进行近似,因为它们涉及的概率比不能通过概率下界变分推断来近似。噪声对比估计(nce)[13]涉及通过学习 使模型有助于从固定噪声分布 中区分数据 的权重 来训练生成模型。使用先前训练过的模型作为噪声分布,可以训练一系列高质量的模型。这可以看作是一种非正式的竞争机制,在核心类似于对抗性网络博弈中使用的正式竞争。NCE的关键局限性在于它的“鉴别器”是由噪声分布的概率密度和模型分布的概率密度之比来定义的,因此它需要具有评估和反向传播两种密度的能力。

以前一些工作已经使用过两个神经网络竞争的概念。最相关的工作是可预测性最小化[26]。在可预测性最小化中,神经网络中的每个隐藏单元都被训练成不同于第二个网络的输出,后者根据所有其他隐藏单元的值来预测该隐藏单元的值。本文工作与可预测性最小化有三个重要的区别:1)本工作中,网络间的竞争是唯一的训练准则,它本身就足以训练网络。可预测性最小化只是一种正则化方法,它鼓励神经网络的隐单元在完成其他任务时在统计上独立,而不是一个主要的训练准则。2)竞争的性质不同。在可预测性最小化中,比较了两个网络的输出,一个网络试图使输出相似,另一个网络试图使输出不同。所以其输出是标量。在gans中,生成器网络产生一个丰富的高维向量,用作另一个网络的输入,并试图选择另一个网络不知道如何区分的输入。3)学习过程的规格不同。**可预测性极小化是一个目标函数最小化的优化问题,学习方法是使目标函数的最小化。**GANS 是基于一个极大极小博弈,而不是一个优化问题,它具有一个agent寻求最大化而另一个agent寻求最小化的价值函数。博弈在一个鞍点结束,这个鞍点对于一个玩家的策略是最小的,对于另一个玩家的策略是最大的。

生成性对抗网络有时与“对抗性例子”的相关概念混淆[28]。**对抗性的例子 是通过直接对分类网络的输入使用 基于梯度的优化 来找到的例子,以便找到与数据相似但又被错误分类的例子。**这与目前的研究不同,因为对抗性的例子不是一种培养生成模型的机制。相反,对抗性的例子主要是一种分析工具,用来显示神经网络以有趣行为,通常以高度的自信地将两幅图像分为两类,即使人类观察者无法察觉它们之间的差异。这些对抗性例子的存在确实表明,生成性对抗性网络训练可能效率低下,因为它们表明,现代的鉴别网络可以自信地识别一个类,而不必模仿该类的任何人类可感知属性(人类肉眼区分的依赖特征)。

3.Adversarial nets

当(生成模型和判别模型)都是多层感知器时,对 抗模型框架 能够被直接应用。为了学习 生成器 在 数据 xxx 的分布,我们在输入噪声变量 pz(z)p_z(z)pz(z) 的(基础)上定义了一个先验,将 数据空间 的映射 表达成 G(z;θg)G(z;\theta_g)G(z;θg),其中GGG是由多层感知器表示的可微函数,参数为θg\theta_gθg。我们还定义了第二个多层感知器D(X;θd)D(X;\theta_d)D(X;θd),它的输出是一个简单的标量。D(x)D(x)D(x)表l示x来自数据而不是pgp_gpg的 概率。我们训练DDD,以最大化给训练样本和G产生的样本打上正确标签概率。我们同时训练GGG最小化log(1−D(G(Z)))log(1-D(G(Z)))log(1D(G(Z)))。换一句话说,DDDGGG使用值函数V(G,D)V(G,D)V(G,D)‘开展’一下的双人最小最大博弈
(min⁡Gmax⁡DV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))](1)(\min_G\max_DV(D,G)=E_{x\sim p_{data}(x)}[logD(x)]+E_{z\sim p_z(z)}[log(1-D(G(z)))]\tag 1 (GminDmaxV(D,G)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))](1)
在下一节中,我们会展示对抗网络的理论分析,基本上显示:训练标准允许人们恢复数据的生成分布,因为GGGDDD被赋予足够的容量(enough capacity) ,例如,在非参数限制中。本方法的不太正式,更具教学意义的解释,请参见图1。实际中,我们需要使用迭代的数值方法来是实施博弈。在训练的内层循环中‘优化D到完成(完美)’在计算上是不可能实现的,并且在有限数据集合上会导致过拟合。相反,我们在’k步优化D’与‘一步优化G’之间交替进行。这一处理方式,只要G变换的足够慢;就能使得D保持接近他的最优解。这一过程在算法1中正式呈现。

在实际中,等式1可能无法为‘G学习到足够好’提供足够的梯度。在学习之初,当G的性能很差时,D可以‘有高自信’地拒绝样本;因为这些样本与训练数据明显不同。在这种情况下,log(1−D(G(z)))log(1-D(G(z)))log(1D(G(z)))饱和的。我们可以训练G去最大化log(D(G(z)))log(D(G(z)))log(D(G(z))),而不是训练G去最小化log(1−D(G(z)))log(1-D(G(z)))log(1D(G(z)))。该目标方程 导致了 G和D的相同的动力学固定点,但是,在早期学习的时候提供更强的梯度。

4.Theoretical Results

生成器G隐含地将概率分布pgp_gpg定义为当z∼pzz\sim p_zzpz时所获得的样本G(z)的分布。因此,如果给定足够的容量和训练时间,我们希望 算法1收敛至pdatap_{data}pdata的良好预期。这个部分的结果是在非参数设定中完成的,例如,我们通过研究概率密度函数空间的收敛性 来 表示具有 有限容量的模型。

我们会在4.1节中展示这个最小最大化博弈对于pg=pdatap_g=p_{data}pg=pdata有一个全局最优。我们会在4.2节展示算法1优化等式1,从而获得期待的结果

在这里插入图片描述
图1:通过同时更新判别分布(D蓝色,虚线)来训练生成对抗网络,以便区分来自数据产生分布(黑,虚线)pxp_xpx模型产生的分布(绿色,实线)pg(G)p_g(G)pg(G)。下面的水平线是z 的采样域,(图示)这种情况下是均匀的,上面的水平线是x域的一部分。向上的箭头显示了映射x=G(z)x=G(z)x=G(z)如何对变换样本施加非均匀分布。G在高密度区域收缩,在低密度区域扩展。再解释4个图

4.1全局最优 pg=pdatap_g=p_{data}pg=pdata

首先固定G,寻求D使,GAN目标函数V(G,D)V(G,D)V(G,D)最大化。等价于求pdatap_{data}pdatapgp_gpg之间的JS散度。
固定D∗D^*D,寻求G使得V(G,D∗)V(G,D^*)V(G,D)最小,就是使pdatap_{data}pdatapgp_gpg之间的JS散度最小化,当pg=pdatap_g=p_{data}pg=pdata,V(G,D∗)V(G,D^*)V(G,D)最小。

4.2算法1的收敛性质

理论分析:严格按照4.1求解,pgp_gpg会收敛于pdatap_{data}pdata。但是采用迭代优化时,求出最优的D∗D^*D之后,迭代一步G0−>G1G_0->G_1G0>G1,此时D∗D^*D不是V(G1,D)V(G_1,D)V(G1,D)的最大值,那么,继续迭代将会愈加偏离收敛目标。且迭代找到最优值需要的次数很多,所以,在实际算法中,没更新k次判别器后更新一次生成器。虽然pgp_gpg不会严格收敛于pdatap_{data}pdata,但是,生成器的效果已经能够符合人么的需求。

5.Experiments

我们用一系列数据集训练了对抗网络,包括 MNIST [23],多伦多人脸数据库(TFD)[28]和CIFAR-10 [21]。 生成网络使用线性激活[19,9]和 S 形激活的混合激活层,而判别网络使用 Maxout[10]激活。随机丢弃算法(Dropout)[17]用于训练判别网络。 虽然我们的理论框架允许在生成器的中间层使用压差和其他噪声,但我们使用噪声作为生成网络最底层的输入。.

我们通过将高斯 Parzen 窗口拟合到用 G 生成的样本并在该分布下报告对数似然来估计测试集数据在pgp_gpg下的概率。参数σ通过验证集上的交叉验证获得高斯算子。 该程序在 Breuleux 等人的研究中[8]引入并用于各种生成模型,其确切的可能性是不易处理的[25,3,5]。实验结果 显示在表 1 中。这种估计概率的方法具有稍高的方差,并且在高维空间中表现不佳,但它是我们所知的最佳方法。 可以采样但不能估计概率的生成模型的进步直接激发了对如何评估此类模型的进一步研究。

6.Advantagesa and disadvantages

与以前的建模框架相比,这个新框架具有优点和缺点。缺点主要在于没有pg(x)p_g(x)pg(x)的明确表示,并且 D 在训练期间必须与 G 很好地同步(特别是,在不更新 D 的情况下,G 不得过多训练,以避免“Helvetica 场景” “其中 G 将太多的 z 值折叠到 x 的相同值以具有足够的多样性来模拟pdatap_{data}pdata ”,就像Boltzmann 机器的负链必须在学习步骤之间保持最新一样。优点是永远不需要马尔可夫链,只有反向传播,学习期间不需要推理,并且可以将多种功能合并到模型中。表 2 总结了生成对抗网络与其他生成建模方法的比较。
上述优点主要是在计算上。对抗模型也可能从生成网络中获得一些统计优势,而不是直接用数据示例更新,而是仅通过流经判别器的梯度。这意味着输入的组件不会直接复制到生成器的参数中。对抗性网络的另一个优点是它们可以表示非常尖锐,甚至是较为初始的分布,而基于马尔可夫链的方法要求分布有些模糊,以便链能够在模式之间混合.

7.Conclusions and future work

该框架有许多直接的扩展 :
1.条件生成模型p(x∣c)p(x|c)p(xc): 可以通过将 c 作为 G 和 D 的输入来得到这个后验概率 。

2.给定 x,可以通过训练一个辅助的网络来学习近似推理,达到预测 z 的目的。这和 wakesleep 算法[15]训练出的推理网络类似,但是它具有一个优势,就是在生成器训练完成后,这个推理网络可以针对固定的生成器进行训练。

3.可以通过训练共享参数的条件模型族来近似地对所有条件概率p(xs∣xs′)p(x_s|x_{s'})p(xsxs)进行建模,其中 S是 x 下标的子集。本质上,可以使用敌对网络来实现确定性 MP-DBM[11]的随机扩展。

4.半监督学习:当有限的标签数据可用时,来自鉴别器或推理网络的特征可以改善分类器的性能。

5.改善效率:通过为协调 G 和 D 设计更好的方法,或在训练期间确定更好的分布来采样 z,能够极大的加速训练。
本文已经展示了对抗模型框架的可行性,表明这些研究方向是有用的。

8.GAN-代码实现资料

自2014年GAN一文发布以来,网上出现了各种各样GAN的变体。原文网络结构:D和G均采用多层感知器,但是具体代码实现没找到。以下整理了4个最基本的GAN架构实现的教程与代码。

8.1 pytorch 教程

pytorch 教程中有DGGAN的例子代码,主要是处理人脸生成问题。英文教程,英文注释代码,G与D用深度卷积神经网络搭建。
官网教程:
https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html
github资料:
https://github.com/pytorch/tutorials/blob/master/beginner_source/dcgan_faces_tutorial.py
https://github.com/pytorch/examples/blob/master/dcgan

8.2 简书教程

莫烦的简书教程(一如既往的好),主要实现给定上下界之后,曲线生成问题。中文教程,曲线拟合问题比较简单,用两层感知器搭建G与D.
https://morvanzhou.github.io/tutorials/machine-learning/torch/4-06-GAN/
https://github.com/MorvanZhou/PyTorch-Tutorial/blob/master/tutorial-contents/406_GAN.py

8.3 CSDN博客

CSDN博客,手写数字生成代码实现。中英参半的教程,图片代码,D和G都用多层感知器搭建。
https://blog.csdn.net/IAMoldpan/article/details/78711426

8.4 pytorch 中文文档

pytorch 中文文档中的一篇教程。手写数字生成代码实现,中文教程,图片代码,D和G都用多层感知器搭建。3和4的结构稍有不同,但是在输入数据时,肯定得先将图片变成向量才能输入。
https://ptorch.com/news/14.html

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

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

相关文章

深度学习(05)--典型CNN结构(VGG13,16,19)

文章目录目录1.VGG结构2.VGG结构解释3.3*3卷积核的优点4.VGG的muti-scale方法5.VGG的应用目录 1.VGG结构  LeNet5用大的卷积核来获取图像的相似特征  AlexNet用99、1111的滤波器  VGG 巨大的进展是通过依次采用多个 33 卷积,模仿出更大的感受野(r…

redis——发布和订阅

频道的订阅和退订 当一个客户端执行 SUBSCRIBE 命令, 订阅某个或某些频道的时候, 这个客户端与被订阅频道之间就建立起了一种订阅关系。 Redis 将所有频道的订阅关系都保存在服务器状态的 pubsub_channels 字典里面, 这个字典的键是某个被订…

redis——事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存。收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。在事务执行过程,其他客户端…

深度学习(06)-- Network in Network(NIN)

文章目录目录1.NIN 结构2.MLP卷积3.全局均值池化4.总体网络架构5.NIN补充5.1 广义线性模型(GLM)的局限性5.2 CCCP层5.3 1*1卷积核作用(补充)6.手势识别RGB图像--NIN结构目录 1.NIN 结构 2.MLP卷积 传统CNN的局部感受野窗口的运算…

Pytorch(2)-tensor常用操作

tensor常用数学操作1. 随机数1.1 torch.rand() - 均匀分布数字1.2 torch.randn() - 正态分布数字2. 求和2.1 torch.sum(data, dim)2.2 numpy.sum(data, axis)3. 求积3.1 点乘--对应位置相乘3.2 矩阵乘法4. 均值、方差4.1 torch tensor.mean() .std()4.2 numpy array.mean() .st…

深度学习(07)-- 经典CNN网络结构(Inception (v1-v4))

文章目录目录1.Inception介绍1.1 Inception结构1.2 Inception V1(GoogleNet)1.3 Inception V2(Batch Norm)1.4 Inception V3(Factorization)1.5 Inception V4(ResNet)1.5 Inception v1~v4 总结1.6 Inception进阶2.Inception实现目…

Python(13)-函数,lambda语句

函数1 函数定义2 函数调用3 函数注释文档4 函数参数4.1 参数列表,默认参数,任意参数4.1.1 无缺省值参数4.1.2(部分)缺省值参数4.1.3 数量不定形参数4.2 可变对象和不可变对象4.3 作用域4.3.1 globals()函数4.3.2 global 声明变量为全局变量5 函数返回值5…

深度学习(08)-- Residual Network (ResNet)

文章目录目录1.残差网络基础1.1基本概念1.2VGG19、ResNet34结构图1.3 梯度弥散和网络退化1.4 残差块变体1.5 ResNet模型变体1.6 Residual Network补充1.7 1*1卷积核(补充)2.残差网络介绍(何凯明)3.ResNet-50(Ng)3.1 非常深的神经网…

redis——命令请求的执行过程

发送命令请求 当用户在客户端中键入一个命令请求时, 客户端会将这个命令请求转换成协议格式, 然后通过连接到服务器的套接字, 将协议格式的命令请求发送给服务器。 读取命令请求 当客户端与服务器之间的连接套接字因为客户端的写入而变得可…

深度学习(09)-- DenseNet

文章目录目录1.DenseNet网络结构2.稠密连接及其优点3.代码实现4.补充说明目录 1.DenseNet网络结构 2.稠密连接及其优点 每层以之前层的输出为输入,对于有L层的传统网络,一共有L个连接,对于DenseNet,则有L*(L1)/2。 这篇论文主要…

redis——缓存击穿/穿透/雪崩

缓存穿透 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就去后端系统查找(比如DB)。 一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透…

python(15)-window7配置iPython

前提:安装了Pythonanaconda anaconda安装参考:https://www.zhihu.com/question/58033789 在window系统下可以使用两种方法来实现类似与于Linux终端命令运行程序的方法(推荐方式2): 1.cmd:自己没有操作过,可以参考下面…

深度学习(10)-- Capsules Networks(CapsNet)

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/malele4th/article/details/79430464 </div><div id"content_views" class"markdown_views"><!-- flowchart 箭头图标 勿删 --&g…

手把手maven的功能/安装/使用/idea集成

看这篇文章不用着急安装&#xff0c;跟着步骤一定会成功&#xff0c;要理解maven是什么&#xff0c;如何使用。 介绍 maven官网 对于一个小白来说&#xff0c;官网有用的信息就是这些 不管如何介绍maven&#xff0c;作为使用者来说&#xff0c;主要感觉两个方面有帮助&#x…

python(16)-列表list,for循环

高级数据类型--列表1列表定义2列表中取值3列表的增&#xff0c;删&#xff0c;查&#xff0c;改3.1修改指定位置的数据3.2确定指定元素的索引3.3增加操作3.4删除操作3.5 元素是否存在与列表中 in3.6在指定索引位置插入元素4列表的数据统计5列表排序6列表的循环遍历-for7多维度l…

深度学习(11)-- GAN

TensorFlow &#xff08;GAN&#xff09; 目录 TensorFlow &#xff08;GAN&#xff09;目录1、GAN1.1 常见神经网络形式1.2 生成网络1.3 新手画家 & 新手鉴赏家1.4 GAN网络1.5 例子 1、GAN 今天我们会来说说现在最流行的一种生成网络, 叫做 GAN, 又称生成对抗网络, 也…

redis——数据结构和对象的使用介绍

redis官网 微软写的windows下的redis 我们下载第一个 额案后基本一路默认就行了 安装后&#xff0c;服务自动启动&#xff0c;以后也不用自动启动。 出现这个表示我们连接上了。 redis命令参考链接 String 字符串结构 struct sdshdr{//记录buf数组中已使用字节的数量int …

Python模块(1)-Argparse 简易使用教程

argparse 简易使用教程1.概况2. action3. argparse 使用demo3.1 argparse 实现加法器3.2 D-Model parser1.概况 argparse是Python中用于解析命令行参数的一个模块&#xff0c;可以自动生成help和usage信息&#xff1b;当从终端输入的参数无效时&#xff0c;模块会输出提示信息…

redis——NOSQL及redis概述

NoSql入门概述 单机Mysql的美好时代 瓶颈&#xff1a; 数据库总大小一台机器硬盘内存放不下数据的索引&#xff08;B tree&#xff09;一个机器的运行内存放不下访问量&#xff08;读写混合&#xff09;一个实例不能承受Memcached&#xff08;缓存&#xff09; MySql 垂直拆…

Python(17)-元组tuple

高级数据类型--元组1.元组的定义2.元组基本操作3.元组的循环遍历4.元组的应用场景5.元组与格式化字符串6.元组与列表之间的转换元组的最大特征就是可访问不可改&#xff0c;可作为字典的键值&#xff0c;因为键值必须是唯一的。字符串也是不可边类型&#xff0c;因此也适合做字…