【人工智能】--生成对抗网络

2a20c54b85e042bfa2440367ae4807e9.gif

https://blog.csdn.net/2302_76516899?spm=1000.2115.3001.5343

个人主页:欢迎来到 Papicatch的博客

 课设专栏 :学生成绩管理系统

专业知识专栏: 专业知识 

文章目录

🍉引言

🍉GAN 的基本原理

🍈生成器(Generator) 

🍈判别器(Discriminator)

🍈两者的对抗过程 

🍉GAN 的训练过程

🍈初始化

🍈生成器生成假数据

🍈判别器判断数据来源

🍈计算损失函数

🍈反向传播与参数更新

🍈重复训练 

🍈小结

🍉GAN 的应用领域

🍈图像生成

🍈视频生成 

🍈语音和音频生成

🍈自然语言处理

🍈医学领域

🍈数据增强

🍈工业设计

🍈金融领域

🍉GAN 的优点和挑战

🍈优点

🍈挑战 

🍉未来展望

🍈技术进步

🍈应用领域扩大

🍈产业影响加深

🍈与其他技术融合

🍈伦理和社会问题凸显

🍉示例

🍈示例流程

🍍定义模型

🍍超参数设置和数据准备

🍍初始化模型和优化器

🍍定义损失函数

🍍训练循环

🍍生成并展示图像

🍈代码实现

🍈代码解析

🍉总结


2a20c54b85e042bfa2440367ae4807e9.gif

🍉引言

        在当今的人工智能领域,生成对抗网络(GAN)无疑是一项引人注目的技术突破。它为我们提供了一种全新的方式来生成逼真的数据,从图像到音频,从文本到视频,GAN 的应用范围极其广泛。 

🍉GAN 的基本原理

        生成对抗网络(Generative Adversarial Network,GAN)的基本原理基于博弈论中的零和博弈思想。

🍈生成器(Generator) 

        生成器的作用是从随机噪声(通常是一个随机向量)出发,尝试生成与真实数据分布相似的数据。它就像是一个“造假者”,努力学习真实数据的特征和模式,以便能够生成足以以假乱真的样本。

        例如,在图像生成任务中,生成器可能由多层神经网络构成。输入的随机噪声经过一系列的卷积、反卷积、池化和激活函数等操作,逐渐生成具有一定结构和细节的图像。

        生成器的目标是使它生成的数据在判别器那里被误判为真实数据的概率尽可能高。为了实现这个目标,生成器不断调整自身的参数,优化生成结果。

🍈判别器(Discriminator)

        判别器则像是一个“警察”,负责判断输入的数据是来自真实数据分布还是由生成器生成的。它同样由神经网络构成,接收输入的数据,并输出一个概率值,表示该数据为真实数据的可能性。

        判别器通过学习真实数据的特征,来区分真实数据和生成器生成的假数据。它的目标是尽可能准确地判断数据的来源,从而给生成器提供反馈。

🍈两者的对抗过程 

        在训练过程中,生成器和判别器相互竞争、相互对抗。

        初始阶段,生成器生成的样本质量较差,判别器很容易将其与真实数据区分开。但随着训练的进行,生成器逐渐从判别器的反馈中学习,不断改进生成的样本,使其越来越接近真实数据的特征。

        同时,判别器也在不断提升自己的判别能力,以应对生成器生成的越来越逼真的样本。

        这种对抗过程不断持续,直到达到一种平衡状态,即判别器无法准确区分真实数据和生成数据。此时,生成器就已经学习到了真实数据的分布规律,可以生成与真实数据非常相似的新样本。

        举个简单的例子来说明这个过程。假设我们要生成手写数字的图像,生成器一开始可能生成一些模糊、扭曲的数字图像。判别器很容易判断出这些是假的。然后生成器根据判别器的反馈,调整参数,比如改变线条的粗细、数字的形状等,再次生成图像。判别器再次进行判断,如此反复,最终生成器能够生成逼真的手写数字图像。

        总之,GAN 的基本原理就是通过生成器和判别器之间的不断对抗和优化,使得生成器能够学习到真实数据的分布,从而实现数据的生成。

🍉GAN 的训练过程

        生成对抗网络(GAN)的训练是一个复杂但有趣的过程,它主要包括以下几个关键步骤:

🍈初始化

  • 首先,需要分别初始化生成器(Generator)和判别器(Discriminator)的参数。这些参数通常是随机初始化的。

🍈生成器生成假数据

  • 生成器接收随机噪声作为输入,并通过其内部的神经网络结构生成假的数据样本。例如,如果是图像生成任务,生成器可能输出一个看起来像是图像的矩阵。

🍈判别器判断数据来源

  • 判别器同时接收真实数据样本和生成器生成的假数据样本。它会对每个样本进行判断,输出一个表示该样本为真实数据的概率值。

🍈计算损失函数

  • 对于判别器,损失函数通常基于它对真实数据判断为真的概率和对假数据判断为假的概率来计算。目标是让判别器对真实数据判断为真的概率接近 1,对假数据判断为假的概率接近 1。
  • 对于生成器,其损失函数基于判别器对其生成数据判断为真的概率。生成器的目标是让判别器将其生成的数据判断为真的概率接近 1。

🍈反向传播与参数更新

  • 根据计算出的损失函数,通过反向传播算法来计算参数的梯度。
  • 对于判别器,根据梯度更新其参数,以提高判别能力。
  • 对于生成器,根据其损失函数的梯度更新参数,以改进生成数据的质量。

🍈重复训练 

  • 不断重复上述步骤,生成器和判别器在相互对抗中不断优化自己的性能。
  • 例如,在训练初期,生成器可能生成一些非常模糊、毫无规律的图像。判别器很容易判断出这些是假的,并给予较低的概率值。随着训练的进行,生成器逐渐学习到真实图像的一些特征,生成稍微清晰一些的假图像。判别器也随之变得更加敏锐,能够识别出更细微的差异。如此反复,直到生成器生成的图像能够让判别器难以区分真假。

🍈小结

  • 在训练过程中,还需要注意一些问题,比如训练的稳定性、模式崩溃(生成器总是生成相似的样本)等。为了缓解这些问题,研究者们提出了许多改进的 GAN 架构和训练技巧,如 WGAN(Wasserstein GAN)、DCGAN(Deep Convolutional GAN)等。
  • 总的来说,GAN 的训练是一个动态的、不断优化的过程,通过生成器和判别器的相互博弈,最终实现生成逼真数据的目标。

🍉GAN 的应用领域

        生成对抗网络(GAN)由于其强大的生成能力,在众多领域都有广泛且深入的应用。

🍈图像生成

        GAN 在图像生成方面表现出色。它可以生成逼真的人物肖像、风景图像、艺术作品等。例如:

  • 人脸生成:能够创建出具有各种表情、特征和肤色的虚拟人脸,这在虚拟现实、游戏角色设计等方面有很大的应用价值。
  • 风格迁移:将一张图像的风格应用到另一张图像上,创造出独特的艺术效果。
  • 图像修复:对于受损或缺失部分的图像进行修复和补充。

🍈视频生成 

        能够生成连贯的视频序列。比如:

  • 合成自然场景的视频,如森林中的动态景色、城市街道的交通状况等。
  • 为电影和动画制作提供创意素材,生成虚拟的角色动作和场景。

🍈语音和音频生成

  • 合成自然流畅的语音,包括不同的口音、语调。这在语音助手、有声读物制作等方面有应用。
  • 创作音乐,如生成新的旋律、节奏等。

🍈自然语言处理

  • 文本生成,例如生成文章、故事、诗歌等。
  • 对话生成,构建智能聊天机器人,使其能够生成自然而连贯的对话回复。

🍈医学领域

  • 医学图像生成,帮助生成模拟的 X 光、CT 扫描、MRI 等图像,用于辅助医疗培训和研究。
  • 药物研发,通过生成新的分子结构来探索潜在的药物化合物。

🍈数据增强

  • 在数据量有限的情况下,GAN 可以生成新的数据样本用于扩充数据集,从而提高机器学习模型的性能和泛化能力。

🍈工业设计

  • 生成产品的设计概念,如汽车外观、家具款式等。
  • 为 3D 打印提供创意模型。

🍈金融领域

  • 预测金融市场的走势和模式。
  • 生成模拟的交易数据用于风险评估和策略测试。

🍉GAN 的优点和挑战

🍈优点

  • 无监督学习:GAN 可以在无标签数据的情况下进行训练,降低了数据标注的成本。
  • 高质量的生成结果:GAN 可以生成逼真的图像、文本等数据,具有较高的商业价值。
  • 可扩展性:GAN 可以通过调整网络结构和损失函数来适应不同的任务和数据集。

🍈挑战 

  • 训练不稳定:生成器和判别器的训练过程容易出现梯度消失、模式崩溃等问题。
  • 评估困难:由于生成结果的多样性,缺乏统一的评价指标来衡量 GAN 的性能。
  • 计算资源消耗大:GAN 的训练过程通常需要大量的计算资源,如 GPU、TPU 等。

🍉未来展望

🍈技术进步

        随着计算能力的提升和算法的不断创新,未来 GAN 模型将变得更加高效和精准,能够生成更加逼真的图像、视频和三维模型。同时,稳定性和多样性也将得到提升,更好地避免训练过程中的模式崩溃问题。

🍈应用领域扩大

        GAN 在数据增强和分析、个性化内容创造、模拟和预测等领域的应用将不断拓展。它可以为用户定制个性化的娱乐内容,在科学研究和工业设计中进行模拟和预测。

🍈产业影响加深

        GAN 的发展将对娱乐、广告、教育和培训等产业产生深远影响。例如,在电影、游戏和虚拟现实中创建逼真的虚拟角色和环境,为广告创造出吸引眼球的视觉内容,以及在教育领域生成教学材料等。

🍈与其他技术融合

        GAN 可能与其他技术如物联网、边缘计算和量子计算等融合,创造出更多新的应用和解决方案。

🍈伦理和社会问题凸显

        随着 GAN 技术的发展,如深度伪造等应用可能引发更多的伦理和社会问题,需要社会各界共同努力来解决。

🍉示例

        以下是一个使用 DCGAN(Deep Convolutional Generative Adversarial Network,深度卷积生成对抗网络)生成图像的示例。

🍈示例流程

🍍定义模型

  • Generator类:构建生成器网络,通过一系列全连接层和激活函数将输入的潜在向量(latent_dim)逐步映射为具有指定图像形状(img_shape)的输出。
  • Discriminator类:构建判别器网络,通过一系列全连接层和激活函数对输入图像进行判断,输出一个表示其为真实图像的概率值。

🍍超参数设置和数据准备

  • 选择设备(cuda如果可用,否则cpu)。
  • 设定潜在向量维度、批大小、训练轮数、学习率和图像形状等超参数。
  • 对 MNIST 数据集进行预处理,包括调整大小、转换为张量和归一化,并使用数据加载器加载数据。

🍍初始化模型和优化器

  • 将生成器和判别器模型移动到选定的设备上。
  • 为生成器和判别器分别定义优化器(Adam)。

🍍定义损失函数

  • 使用二进制交叉熵损失函数(BCELoss)来计算判别器和生成器的损失。

🍍训练循环

  • 在每个训练轮次中,遍历数据加载器中的批次。
  • 对于判别器训练:
    • 为真实图像标记为1real_labels),为生成的假图像标记为0fake_labels)。
    • 通过判别器对真实图像进行判断,计算真实图像的损失(d_real_loss)。
    • 生成假图像,通过判别器对假图像进行判断,计算假图像的损失(d_fake_loss)。
    • 综合真实图像和假图像的损失,得到判别器的总损失(d_loss)。
    • 清零判别器的梯度,反向传播损失,更新判别器的参数。
  • 对于生成器训练:
    • 生成新的假图像。
    • 通过判别器对假图像进行判断,计算生成器的损失(g_loss)。
    • 清零生成器的梯度,反向传播损失,更新生成器的参数。

🍍生成并展示图像

  • 在训练结束后,使用随机的潜在向量生成一批图像。
  • 使用make_grid函数将生成的图像组合成一个网格。
  • 使用plt.imshow展示生成的图像网格。

🍈代码实现

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.datasets as datasets
import torchvision.transforms as transforms
from torchvision.utils import make_grid
from matplotlib import pyplot as plt

# 定义生成器
class Generator(nn.Module):
    def __init__(self, latent_dim, img_shape):
        super(Generator, self).__init__()
        self.img_shape = img_shape
        self.latent_dim = latent_dim

        def block(in_feat, out_feat, normalize=True):
            layers = [nn.Linear(in_feat, out_feat)]
            if normalize:
                layers.append(nn.BatchNorm1d(out_feat, 0.8))
            layers.append(nn.LeakyReLU(0.2, inplace=True))
            return layers

        self.model = nn.Sequential(
            *block(latent_dim, 128, normalize=False),
            *block(128, 256),
            *block(256, 512),
            *block(512, 1024),
            nn.Linear(1024, int(torch.prod(torch.tensor(img_shape))))
            nn.Tanh()
        )

    def forward(self, z):
        img = self.model(z)
        img = img.view(img.size(0), *self.img_shape)
        return img

# 定义判别器
class Discriminator(nn.Module):
    def __init__(self, img_shape):
        super(Discriminator, self).__init__()

        self.model = nn.Sequential(
            nn.Linear(int(torch.prod(torch.tensor(img_shape))), 512),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(512, 256),
            nn.LeakyReLU(0.2, inplace=True),
            nn.Linear(256, 1),
            nn.Sigmoid()
        )

    def forward(self, img):
        img_flat = img.view(img.size(0), -1)
        validity = self.model(img_flat)
        return validity

# 超参数设置
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
latent_dim = 100
batch_size = 64
num_epochs = 200
lr = 0.0002
img_shape = (1, 28, 28)  # 假设生成 28x28 的单通道图像

# 加载 MNIST 数据集
transform = transforms.Compose([
    transforms.Resize(28),
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

dataset = datasets.MNIST(root='../data/', train=True, transform=transform, download=True)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 初始化生成器和判别器
generator = Generator(latent_dim, img_shape).to(device)
discriminator = Discriminator(img_shape).to(device)

# 优化器
optimizer_G = optim.Adam(generator.parameters(), lr=lr, betas=(0.5, 0.999))
optimizer_D = optim.Adam(discriminator.parameters(), lr=lr, betas=(0.5, 0.999))

# 损失函数
adversarial_loss = nn.BCELoss()

# 训练循环
for epoch in range(num_epochs):
    for i, (imgs, _) in enumerate(dataloader):
        imgs = imgs.to(device)

        # 训练判别器
        real_labels = torch.ones(imgs.size(0), 1).to(device)
        fake_labels = torch.zeros(imgs.size(0), 1).to(device)

        # 真实图像判别
        real_validity = discriminator(imgs)
        d_real_loss = adversarial_loss(real_validity, real_labels)

        # 生成假图像
        z = torch.randn(imgs.size(0), latent_dim).to(device)
        fake_imgs = generator(z)

        # 假图像判别
        fake_validity = discriminator(fake_imgs.detach())
        d_fake_loss = adversarial_loss(fake_validity, fake_labels)

        # 总判别器损失
        d_loss = (d_real_loss + d_fake_loss) / 2

        discriminator.zero_grad()
        d_loss.backward()
        optimizer_D.step()

        # 训练生成器
        z = torch.randn(imgs.size(0), latent_dim).to(device)
        fake_imgs = generator(z)
        validity = discriminator(fake_imgs)
        g_loss = adversarial_loss(validity, real_labels)

        generator.zero_grad()
        g_loss.backward()
        optimizer_G.step()

    if epoch % 10 == 0:
        print(f"Epoch [{epoch}/{num_epochs}], D Loss: {d_loss.item()}, G Loss: {g_loss.item()}")

# 生成并展示图像
with torch.no_grad():
    z = torch.randn(64, latent_dim).to(device)
    generated_imgs = generator(z)
    grid = make_grid(generated_imgs, nrow=8, normalize=True)
    plt.imshow(grid.permute(1, 2, 0))
    plt.show()

🍈代码解析

  • 首先,定义了生成器 Generator 和判别器 Discriminator 类。生成器将随机的潜在向量映射为图像,判别器则判断输入的图像是真实的还是生成的。
  • 超参数设置部分指定了设备(GPU 或 CPU)、潜在向量维度、批大小、训练轮数、学习率和图像形状等。
  • 数据加载部分使用 torchvision 加载 MNIST 数据集,并进行预处理。
  • 初始化生成器和判别器,并定义优化器和损失函数。
  • 在训练循环中,交替训练判别器和生成器。判别器通过对真实图像和生成的假图像进行判断来更新参数,生成器则通过生成让判别器认为是真实的图像来更新参数。
  • 最后,生成一些图像并展示。

🍉总结

        生成对抗网络(GAN)是一种创新的深度学习架构,由生成器和判别器两个核心部分组成。

        生成器负责生成看似真实的数据,试图欺骗判别器;判别器则努力区分真实数据和生成器生成的数据。两者在不断的对抗训练中逐渐优化自身能力。

        GAN 在多个领域展现出强大的应用潜力,如生成逼真的图像、实现图像到图像的转换、用于数据增强、语音合成、自然语言处理等。然而,GAN 的训练过程存在不稳定、模式崩溃等挑战,需要不断改进和优化技术来解决。

        尽管面临一些困难,GAN 仍然为人工智能的发展带来了新的思路和方法,其未来的发展有望进一步推动各领域的创新和进步。

2a20c54b85e042bfa2440367ae4807e9.gif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端知识】一篇速成 建议收藏

HTML基础概念 正式敲代码之前呢,我们先来看几个概念: 0 静态网页和动态网页 静态网页: 页面的内容和显示效果就基本上不会发生变化了--除非你修改页面代码。 动态网页: 页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的…

解决SeaTunnel 2.3.4版本写入S3文件报错问题

在使用Apache SeaTunnel时,我遇到了一个写入S3文件的报错问题。通过深入调试和分析,找到了问题所在,并提出了相应的解决方案。 本文将详细介绍报错情况、参考资料、解决思路以及后续研究方向,希望对大家有帮助! 一、…

PyTorch - 神经网络基础

神经网络的主要原理包括一组基本元素,即人工神经元或感知器。它包括几个基本输入,例如 x1、x2… xn ,如果总和大于激活电位,则会产生二进制输出。 样本神经元的示意图如下所述。 产生的输出可以被认为是具有激活电位或偏差的加权…

Java通过GeoLite2-City.mmdb 进行IP信息查询地理定位和经纬度筛选。

引入依赖 <dependency><groupId>com.maxmind.geoip2</groupId><artifactId>geoip2</artifactId><version>4.2.0</version> </dependency>下载数据文件&#xff1a;https://download.lin2ur.cn/GeoLite2/ package com.cqclo…

经典递归分析

在前面一篇中, 已经看过许多直观的递归的例子, 在这篇里, 将分析两个经典的递归问题, 阶乘与菲波那契数列数列, 在此过程中, 还将对比递归与循环(迭代)间的异同, 探讨递归与内存中的栈的关系, 以及递归的效率等问题. 如无特别说明, 示例使用的是 Java, IDE 则为 Eclipse. 阶乘(…

Matplotlib 简介

import matplotlib.pyplot as plt plt.plot([1, 2, 3, 4]) plt.ylabel(some numbers) plt.show() 当使用plot只传入单个数组时&#xff0c;matplotlib会认为这是y的值&#xff0c;并自动生成长度相同&#xff0c;但是从0开始的x值&#xff0c;所以这里的x会自动生成为 [0,1,2,…

python自动化办公之BeautifulSoup爬取并解析html文本

用到的库&#xff1a;BeautifulSoup 实现效果&#xff1a;爬取网站内容&#xff0c;拿到html文本并解析html文本 代码&#xff1a; 先爬取 # 先导入requests包 import requests urlhttps://www.baidu.com responserequests.get(url) # 做1个断言&#xff0c;如果执行成功&a…

java的工厂设备管理系统-计算机毕业设计源码16179

摘要 在现代制造业中&#xff0c;高效的设备管理对于确保生产过程的顺利进行至关重要。为了满足工厂对于设备管理的需求&#xff0c;我们设计并实现了一个基于 Java 的工厂设备管理系统。 该系统旨在提供一个全面、可靠且易于使用的解决方案&#xff0c;以帮助工厂有效地管理…

QT截屏,截取控件为图片,指定范围截屏三种截屏方式

项目中我们常用到截取屏幕&#xff0c;Qt给我的们多种方式&#xff1a; 主要有以下三种&#xff1a; 截取全屏&#xff1b;截取控件为图片&#xff1b;指定位置截屏三种截屏方式&#xff1b; 1.截取全屏 常用&#xff1a; 实现&#xff1a; QScreen *screen QGuiApplicat…

【超万卡GPU集群关键技术深度分析 2024】

文末有福利&#xff01; 1. 集群高能效计算技术 随着大模型从千亿参数的自然语言模型向万亿参数的多模态模型升级演进&#xff0c;超万卡集群吸需全面提升底层计算能力。 具体而言&#xff0c;包括增强单芯片能力、提升超节点计算能力、基于 DPU (Data Processing Unit) 实现…

波动方程 - 在三维图中动态显示二维波动方程的解就像水面波澜起伏

波动方程 - 在三维图中动态显示二维波动方程的解就像水面波澜起伏 flyfish 波动方程的求解结果通常不是一个单一的数值&#xff0c;而是一个函数或一组函数&#xff0c;这些函数描述了波随时间和空间的传播情况。具体来说&#xff0c;波动方程的解可以是关于时间和空间变量的…

#LinuxC高级 笔记二

makefile gcc gdb makefile 1. 分文件编程 1.1 源文件&#xff1a;.c结尾的文件 包含main函数的.c 包含子函数的.c 1.2 头文件&#xff1a;.h结尾的文件 头文件、宏定义、typedef 、结构体、共用体、枚举、函数声明 include引用时“”和<>的区别&#xff1a; <>去系…

JSON字符串中获取一个指定字段的值

一、方式一&#xff0c;引用gson工具 测试报文&#xff1a; {"account":"yanxiaosheng","password":"123456" } 引入pom <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency><gr…

假设性文档嵌入 HyDE:大模型 + 对比学习,从关键词相似度搜索到语义搜索

假设性文档嵌入 HyDE&#xff1a;大模型 对比学习&#xff0c;从关键词相似度搜索到语义搜索 提出背景流程图解法拆解类比1. 单一文档嵌入空间的搜索2. 指令跟随型语言模型&#xff08;InstructLM&#xff09;的引入3. 生成文档的嵌入编码 提出背景 论文&#xff1a;https://…

保存huggingface缓存中AI模型(从本地加载AI模型数据)

在github下拉项目后,首次运行时会下拉一堆模型数据&#xff0c;默认是保存在缓存的&#xff0c;如果你的系统盘空间快满的时候就会被系统清理掉&#xff0c;每次运行又重新下拉一次&#xff0c;特别麻烦。 默认下载的缓存路径如下&#xff1a;C:\Users\用户名\.cache\huggingf…

【Unity性能消耗】ScriptableObject复用数据节省内存占用

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

APP INVENTOR硬件交互学习教程05——自动连接蓝牙实现

每次打开手机APP&#xff0c;需要选择蓝牙&#xff0c;用起来很麻烦。有没有方法实现自动连接上次的地址呢&#xff0c;接下来请看吧&#xff01;1.界面设计增加了一个微数据库组件&#xff0c;借助它用来存储硬件地址 2.程序设计这里主要用两个方法&#xff0c;存储地址方法…

Python基础语法(与C++对比)(持续更新ing)

代码块 Python在统一缩进体系内&#xff0c;为同一代码块C{...}内部的为同一代码块 注释 Python 单行注释&#xff1a;#... 多行注释&#xff1a;... C 单行注释&#xff1a;//... 多行注释: /*...*/ 数据类型 1. Python数据类型 Python中支持数字之间使用下划线 _ 分割…

LVS+Nginx高可用集群--基础篇

1.集群概述 单体部署&#xff1a; 可以将上面内容分别部署在不同的服务器上。 单体架构的优点&#xff1a; 小团队成型就可完成开发&#xff0c;测试&#xff0c;上线 迭代周期短&#xff0c;速度快 打包方便&#xff0c;运维简单 单体架构的挑战&#xff1a;单节点宕机造成…

day03-numpy数据类型

numpy数据类型 名称描述名称描述bool_布尔型数据类型&#xff08;True 或者 False&#xff09;float_float64 类型的简写int_默认的整数类型&#xff08;类似于 C 语言中的 long&#xff0c;int32 或 int64&#xff09;float16/32/64半精度浮点数:1 个符号位&#xff0c;5 个指…