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

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1:GAN是个啥?

生成式对抗网络(Generative Adversarial Networks, GAN),名字听着就有点“对抗”的意思,没错!它其实是两个神经网络互相斗智斗勇的游戏:

  1. 生成器(Generator):负责造假,生成一些以假乱真的数据。
  2. 判别器(Discriminator):负责打假,判断数据是真还是假。

想象一下,生成器是个假币制造商,判别器是个验钞机。假币制造商不断提升造假能力,验钞机也不断升级打假技巧。最终的目标是生成的假币足以以假乱真,让验钞机无法区分。

生成式对抗网络(GAN)是一种由 Ian Goodfellow 和他的团队在2014年提出的深度学习模型。GAN 本质上是一种用于生成与真实数据分布相似的“新数据”的方法,常用于图像生成、风格转换和数据增强等任务。

一、GAN 的基本概念
1. 两个网络:生成器(Generator)和判别器(Discriminator)

GAN 的核心思想是利用两个神经网络相互对抗:

  • 生成器 (G): 学习生成接近真实数据的“假数据”。其目标是“骗过”判别器,使其认为假数据是真的。
  • 判别器 (D): 学习区分真实数据和生成器生成的假数据。其目标是提高“识别假数据的能力”。

两者形成了一种动态博弈:

  • 生成器不断改进以生成更逼真的数据。
  • 判别器不断改进以更准确地区分真假数据。

最终目标:生成器生成的数据和真实数据难以区分,判别器无法给出明确的判断。

2. 训练目标

GAN 的训练目标可以通过以下损失函数来描述:

  • 判别器的损失:最大化真实数据的得分,最小化假数据的得分。
  • 生成器的损失:最小化判别器对假数据的判断分数(即尽量骗过判别器)。

数学公式为:

这里:

  • D(x)D(x) 表示判别器给真实数据 xx 的打分。
  • G(z)G(z) 表示生成器根据随机噪声 zz 生成的假数据。
3. GAN 的对抗过程

训练过程通常分为两步:

  1. 更新判别器: 让判别器学习如何区分真实和假数据。
  2. 更新生成器: 让生成器学习生成更真实的数据,以骗过判别器。

二、直观例子:警察与造假者

你可以将 GAN 的训练过程类比为“警察(判别器)与造假者(生成器)”之间的较量:

  • 一开始,造假者技术拙劣,警察很容易识破假币。
  • 随着时间推移,造假者的造假技术逐渐提高,而警察也在不断升级检测手段。
  • 最终,假币与真币变得极为相似,警察几乎无法分辨。

阶段2:从头写个最简单的GAN

import torch
import torch.nn as nn
import torch.optim as optim# 1. 生成器(Generator):简单的全连接网络
class Generator(nn.Module):def __init__(self):super(Generator, self).__init__()self.model = nn.Sequential(nn.Linear(100, 256),  # 输入 100 维噪声,输出中间隐藏层 256 维nn.ReLU(),            # 激活函数 ReLU,增加非线性nn.Linear(256, 784),  # 隐藏层输出 784 维数据(28x28 图像展平后)nn.Tanh()             # 将输出限制到 [-1, 1],方便后续训练)def forward(self, z):return self.model(z)# 2. 判别器(Discriminator):另一个简单的全连接网络
class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Linear(784, 256),       # 输入 784 维数据(展平的图像)nn.LeakyReLU(0.2),         # 激活函数,允许小负值(更鲁棒)nn.Linear(256, 1),         # 输出一个值(真 or 假)nn.Sigmoid()               # 输出概率,范围 [0, 1])def forward(self, x):return self.model(x)# 初始化网络
G = Generator()
D = Discriminator()# 优化器
optimizer_G = optim.Adam(G.parameters(), lr=0.0002)
optimizer_D = optim.Adam(D.parameters(), lr=0.0002)# 损失函数:二分类交叉熵
criterion = nn.BCELoss()

 代码释疑:

这段代码实现了生成式对抗网络(GAN)的生成器(Generator)和判别器(Discriminator),并为它们设置了优化器和损失函数。以下是对相关内容的详细解释,帮助你理解各个部分的功能。


1. Generator 类:生成器

生成器的作用是生成假数据,用来骗过判别器。

class Generator(nn.Module):def __init__(self):super(Generator, self).__init__()self.model = nn.Sequential(nn.Linear(100, 256),  # 输入 100 维噪声,输出中间隐藏层 256 维nn.ReLU(),            # 激活函数 ReLU,增加非线性nn.Linear(256, 784),  # 隐藏层输出 784 维数据(28x28 图像展平后)nn.Tanh()             # 将输出限制到 [-1, 1],方便后续训练)def forward(self, z):return self.model(z)
关键点:
  • 输入:

    • 生成器的输入是一个随机噪声 z,形状为 [batch_size, 100]
    • 噪声是生成器的起点,让它从随机性中学习目标数据分布。
  • 输出:

    • 输出 784 个值,对应一张 28x28 的图像展平(如 MNIST 数据)。
    • 使用 Tanh 将输出限制在 [-1, 1] 区间,通常是为了和真实数据的归一化范围一致。

2. Discriminator 类:判别器

判别器的作用是判断输入数据是真实的还是生成的。

class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Linear(784, 256),       # 输入 784 维数据(展平的图像)nn.LeakyReLU(0.2),         # 激活函数,允许小负值(更鲁棒)nn.Linear(256, 1),         # 输出一个值(真 or 假)nn.Sigmoid()               # 输出概率,范围 [0, 1])def forward(self, x):return self.model(x)
关键点:
  • 输入:

    • 输入是展平的 28x28 图像(784 维),可以是真实数据或生成器的假数据。
  • 输出:

    • 输出是一个概率值,0 表示假,1 表示真。
    • 使用 Sigmoid 将值映射到 [0, 1] 区间。
  • LeakyReLU:

    • 激活函数 LeakyReLU(0.2) 在输入为负值时保留一定斜率(0.2),解决 ReLU 的“死区”问题,使训练更稳定。

3. 优化器

优化器用于更新模型的参数,使损失函数逐渐减小。

optimizer_G = optim.Adam(G.parameters(), lr=0.0002)
optimizer_D = optim.Adam(D.parameters(), lr=0.0002)
  • Adam 优化器:

    • 一种改进的梯度下降算法,适用于深度学习模型,尤其是 GAN。
    • 自动调整学习率,提高收敛速度。
  • 学习率 (lr=0.0002):

    • 学习率设置为 0.0002,是 GAN 训练中一个常见的经验值。
  • 目标:

    • optimizer_G 优化生成器的参数,使其生成更逼真的数据。
    • optimizer_D 优化判别器的参数,使其更好地区分真假数据。

4. 损失函数:BCELoss

BCELoss 是二分类交叉熵损失函数,用于计算判别器和生成器的损失。

criterion = nn.BCELoss()
什么是交叉熵?

交叉熵是一种用来衡量两个概率分布相似度的损失函数,公式如下:

  • yiy_i:真实标签(1 表示真,0 表示假)。
  • pip_i:模型预测的概率值(判别器的输出)。
在 GAN 中的作用:
  1. 判别器的损失:

    • 判别器的目标是区分真实数据和生成器生成的假数据。
    • 对于真实数据,y = 1;对于假数据,y = 0
    • 损失函数让判别器尽量输出接近真实标签的概率。
  2. 生成器的损失:

    • 生成器的目标是让判别器认为假数据是真实的。
    • 生成器通过 GAN 的损失函数间接影响判别器的输出,目标是让判别器输出 y = 1

5. 上述代码小结

  • 生成器 (G): 学习生成逼真的假数据。
  • 判别器 (D): 学习区分真实数据和假数据。
  • 损失函数 (BCELoss): 衡量模型输出概率和目标标签之间的差异。
  • 优化器 (Adam): 调整模型参数,使损失函数最小化。

在训练过程中:

  • 生成器试图最小化生成器的损失。
  • 判别器试图最大化判别器的准确率。

这段代码是 GAN 的基础骨架,你可以在此基础上进行实验,比如用它来生成 MNIST 图像!

题外话:

PyTorch(简称 torch)是一个流行的开源深度学习框架,它提供了许多用于构建和训练神经网络的功能。它特别以易用性、灵活性和性能而著称,是机器学习和深度学习领域的常用工具之一。下面,我们来了解一下 PyTorch 的作用,以及在这段 GAN 代码中它是如何发挥作用的。

1. PyTorch 的基本功能

PyTorch 提供了以下几个关键功能:

  • 张量(Tensor):

    • PyTorch 中的核心数据结构是张量(torch.Tensor),类似于 NumPy 的数组,但是张量支持 GPU 加速。
    • 张量是神经网络中的数据载体,存储输入数据、权重、偏置等。
  • 自动求导(Autograd):

    • PyTorch 提供自动求导功能,能够计算神经网络中每一层的梯度,简化了反向传播算法的实现。
    • 当你定义模型并传入数据后,PyTorch 会自动计算损失函数的梯度,并更新模型的参数。
  • 构建和训练神经网络:

    • 使用 torch.nn 提供的模块,可以方便地构建神经网络的各层(如全连接层、卷积层、激活函数等)。
    • torch.optim 提供了优化算法(如 SGD、Adam)来训练模型。
  • GPU 加速:

    • PyTorch 可以利用 GPU(如 CUDA)来加速计算。你可以将张量和模型移动到 GPU 上,这样就能提高训练速度。

阶段3:它们怎么斗起来?

核心是两步:

  1. 训练判别器:真图片标为1,假图片标为0,看看它能不能区分真伪。
  2. 训练生成器:假图片骗过判别器,努力让判别器给它打1分。
from torchvision import datasets, transforms
from torch.utils.data import DataLoader# 数据加载(MNIST 数据集)
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize([0.5], [0.5])])
mnist = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
dataloader = DataLoader(mnist, batch_size=64, shuffle=True)# 训练循环
epochs = 10
for epoch in range(epochs):for i, (real_imgs, _) in enumerate(dataloader):# ========== 1. 训练判别器 ==========# 真数据real_imgs = real_imgs.view(real_imgs.size(0), -1)  # 展平图片real_labels = torch.ones(real_imgs.size(0), 1)  # 真图片标签为1# 假数据z = torch.randn(real_imgs.size(0), 100)  # 随机噪声fake_imgs = G(z)fake_labels = torch.zeros(real_imgs.size(0), 1)  # 假图片标签为0# 判别器的预测和损失real_preds = D(real_imgs)fake_preds = D(fake_imgs.detach())  # 假图片不更新生成器loss_real = criterion(real_preds, real_labels)loss_fake = criterion(fake_preds, fake_labels)loss_D = loss_real + loss_fake# 优化判别器optimizer_D.zero_grad()loss_D.backward()optimizer_D.step()# ========== 2. 训练生成器 ==========z = torch.randn(real_imgs.size(0), 100)fake_imgs = G(z)fake_preds = D(fake_imgs)loss_G = criterion(fake_preds, real_labels)  # 欺骗判别器的损失# 优化生成器optimizer_G.zero_grad()loss_G.backward()optimizer_G.step()# 打印进度if i % 200 == 0:print(f"Epoch [{epoch+1}/{epochs}], Step [{i}/{len(dataloader)}], "f"D Loss: {loss_D.item():.4f}, G Loss: {loss_G.item():.4f}")

这段代码实现了一个基本的 生成式对抗网络(GAN) 训练过程,使用 MNIST 数据集 生成与真实手写数字类似的图像。执行这段代码会产生以下几个结果:

1. 数据加载(MNIST 数据集)

首先,代码通过 torchvision 中的 datasets.MNIST 加载了 MNIST 数据集。这个数据集包含了 60,000 张手写数字的训练图像和 10,000 张测试图像(这里只使用了训练集)。数据被转换为 PyTorch 张量并做了标准化处理,使每个像素值在 [-1, 1] 之间。然后,DataLoader 将数据划分为批次(batch),每次加载 64 张图像。

2. 训练循环

接下来,代码进入训练循环,在每个 epoch 中,它会进行以下操作:

(1)训练判别器(Discriminator)
  • 真数据:

    • 从 MNIST 数据集中提取实际的手写数字图像,将图像展平为 784 维(28x28 的像素展平)。
    • 创建真实标签,所有真实图像的标签为 1
  • 假数据:

    • 从随机噪声 z(100 维的向量)中生成假图像。
    • 创建假的标签,所有生成的假图像标签为 0
  • 判别器损失:

    • 判别器会分别计算它对真实数据和假数据的预测,使用二元交叉熵损失 BCELoss 计算真实数据和假数据的损失。
    • loss_real 是判别器对真实图像的损失,loss_fake 是对假图像的损失,最终判别器的总损失是两者之和 loss_D
  • 优化判别器:

    • 使用 optimizer_D.zero_grad() 清除先前的梯度,进行反向传播并更新判别器的参数。
(2)训练生成器(Generator)
  • 生成假图像:
    • 使用随机噪声 z 通过生成器生成一批假图像。
  • 生成器损失:
    • 生成器的目标是欺骗判别器,让它认为生成的假图像是真实的。因此,生成器的损失是判别器对这些假图像的预测(希望是 1)的损失,即 loss_G
  • 优化生成器:
    • 使用 optimizer_G.zero_grad() 清除先前的梯度,进行反向传播并更新生成器的参数。

3. 打印进度

每训练 200 个批次,代码会打印出当前 epoch 和 step 的进度,并显示判别器和生成器的损失:

Epoch [1/10], Step [0/938], D Loss: 0.6881, G Loss: 0.7014
Epoch [1/10], Step [200/938], D Loss: 0.6834, G Loss: 0.7102
...

实际运行效果:

执行结果

  1. 训练输出:

    • 在训练过程中,随着生成器和判别器的不断优化,你会看到输出的 D Loss(判别器损失)和 G Loss(生成器损失)。初始时,这两个损失通常较大,因为模型还没有学会如何生成和判断图像。
    • 随着训练的进行,损失会逐渐减小,表示生成器和判别器在相互博弈中逐渐变得更强。
  2. 图像生成:

    • 由于 GAN 的训练是一个对抗过程,因此每个 epoch 训练后,生成器的输出图像会逐渐接近真实图像的分布。
    • 生成器在训练中会变得越来越善于生成逼真的手写数字图像,直到它能够生成看起来很像 MNIST 数据集中的真实数字。

小结

  • 判别器:学习区分真实和假图像,给出图像是“真”还是“假”的概率。
  • 生成器:学习生成越来越像真实手写数字的图像,目的是“欺骗”判别器,使判别器认为生成的假图像是真实的。

执行完这段代码后,生成器(G)会经过 10 个 epoch 的训练,逐步学会生成类似 MNIST 手写数字的图像。你可以根据损失值的变化和生成的图像的质量,观察训练过程的进展。


阶段4:GAN生成的图像是啥样?

每训练一段时间,我们让生成器画个画,看看它有没有长进:

import matplotlib.pyplot as pltdef show_images(generator, num_images=16):z = torch.randn(num_images, 100)  # 随机噪声fake_imgs = generator(z).view(num_images, 1, 28, 28)  # 恢复图片形状fake_imgs = (fake_imgs + 1) / 2.0  # 把值范围从 [-1, 1] 变到 [0, 1]grid = torch.cat([fake_imgs[i] for i in range(num_images)], dim=2).squeeze(0)plt.imshow(grid.detach().numpy(), cmap='gray')plt.axis('off')  # 不显示坐标轴plt.savefig("generated_images.png", bbox_inches='tight')  # 保存图像到文件plt.close()  # 关闭图形窗口

 这是最终生成地图像:

局部放大

是不是可以联想到:生成式对抗网络的应用场景相当广泛,比如半导体晶圆缺陷检测领域,医学影像疾病识别领域等等。


阶段5:GAN训练的问题

GAN不是一帆风顺的,训练GAN像哄熊孩子:生成器和判别器常常互相欺负对方导致训练不稳定。
怎么办?我们可以尝试改进:

  1. 改网络结构:比如用更强大的卷积网络。
  2. 改损失函数:比如使用Wasserstein GAN。
  3. 调参:改动学习率、优化器等等。

这就是生成式对抗网络的基础啦,希望它的斗智斗勇能让你觉得有趣!你也可以试试用它生成其他类型的数据,比如音乐、画作或者文字!

相关文章:

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1:GAN是个啥? 生成式对抗网络(Generative Adversarial Networks, GAN),名字听着就有点“对抗”的意思,没错!它其实是两个神经网络互相斗智斗勇的游戏: 生成器(Gene…...

68 mysql 的 临键锁

前言 我们这里来说的就是 我们在 mysql 这边常见的 一种锁, 行临键锁 虽然 在平时我们用到的不是很多, 我们这里 主要是 讲一下 它的主要的触发的场景 行临键锁 等价于 行锁 间隙锁, 行间隙锁是一个 左开右开的区间, 行临键锁 是一个左开右闭的区间 但是 它 和 行锁的差异…...

(十一)Python3 接口自动化测试,Pytest-Allure报告的使用

(十一)Python3 接口自动化测试,Pytest-Allure报告的使用 1、安装和使用 1、安装pytest和allure-pytest插件: pip install pytest allure-pytest 2、在你的pytest测试用例中使用allure装饰器或者上下文管理器来生成报告。 例如,你可以使用@allure.feature装饰器来标记特性…...

【Rust 学习笔记】Rust 基础数据类型介绍(一)

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 博客内容主要围绕: 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 Rust 基础数据类型介绍(一)一、固定宽…...

深入理解Oracle DB的锁和闩

1. 引言 本文深入介绍Oracle DB的锁和闩。 2. Oracle DB 锁的基本概念 2.1 定义与作用 锁是 Oracle 数据库用于控制并发访问的一种机制。它用于防止多个事务同时对同一数据进行不一致的操作,确保数据的完整性和一致性。例如,当一个事务正在更新一行数…...

mcu上一种利用伪随机数防止mac地址冲突的方法

一 前言 前段时间开发的一个带tcp功能的项目,出现了mac地址冲突的问题,领导让随机生成一个mac地址,因此研究了下随机数。 二 预研 1.硬随机数 硬随机数又叫真随机数,英文名称”true random number generator“,即通过硬件随机数…...

C# 索引器(Indexer)

文章目录 前言一、索引器的语法规则二、索引器的用途及与属性的对比三、索引器的重载 前言 在 C# 编程中,索引器(Indexer)是一项极具特色且实用的语言特性,它赋予了对象一种独特的访问方式,使得对象能够如同数组一般&a…...

【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数

1. UDF函数(用户自定义函数) 一般指的是用户自己定义的单行函数。一进一出,函数接受的是一行中的一个或者多个字段值,返回一个值。比如MySQL中的,日期相关的dateDiff函数,字符串相关的substring函数。 先…...

Springboot集成通义大模型

1.先到阿里云平台开头阿里云白炼账号&#xff0c;创建apiKey 2. 引入maven依赖 <dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><version>2.8.3</version></dependency><!-- htt…...

Xilinx PCIe高速接口入门实战(一)

引言&#xff1a;本文对Xilinx 7 Series Intergrated Block for PCI Express PCIe硬核IP进行简要介绍&#xff0c;主要包括7系列FPGA PCIe硬核资源支持、三IP硬核差异、PCIe硬核资源利用等相关内容。 1. 概述 1.1 7系列FPGA PCIe硬件资源支持 7系列FPGA对PCIe接口最大支持如…...

区块链游戏的新观察:自治世界能否成为未来链游的突破口?

区块链游戏&#xff08;链游&#xff09;作为加密领域的创新方向&#xff0c;一直被寄予厚望。然而&#xff0c;尽管各类链游层出不穷&#xff0c;大多只是靠代币激励一时爆火&#xff0c;缺乏持久吸引力。这种现象让人对链游未来的发展充满疑虑&#xff1a;是否有一种全新的设…...

Linq中的投影运算 (C#):Select、SelectMany、Zip

投影是指将对象转换为一种新形式的操作&#xff0c;该形式通常只包含那些将随后使用的属性。 通过使用投影&#xff0c;您可以构造从每个对象生成的新类型。 可以投影属性&#xff0c;并对该属性执行数学函数。 还可以在不更改原始对象的情况下投影该对象。 1、Select 下面的…...

GPU 服务器厂家:怎样铸就卓越 AI 算力?

文章来源于百家号&#xff1a;GPU服务器厂家 今天咱来聊聊 GPU 服务器厂家那些事儿&#xff0c;而这其中衡量 AI 算力的因素可是关键所在哦。 先讲讲计算速度这一块。咱都知道 AI 那复杂的活儿&#xff0c;像训练超厉害的图像识别模型&#xff0c;得处理海量图像数据&#x…...

数据结构与算法——N叉树(自学笔记)

本文参考 N 叉树 - LeetBook - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 遍历 前序遍历&#xff1a;A->B->C->E->F->D->G后序遍历&#xff1a;B->E->F->C->G->D->A层序遍历&#xff1a;A->B->C->D->…...

浏览器的数据六种存储方法比较 :LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite

在构建该 Web 应用程序&#xff0c;并且希望将数据存储在用户浏览器中。也许您只需要存储一些小标志&#xff0c;或者甚至需要一个成熟的数据库。 我们构建的 Web 应用程序类型发生了显着变化。在网络发展的早期&#xff0c;我们提供静态 html 文件。然后我们提供动态渲染的 h…...

Rust个人认为将抢占C和C++市场,逐渐成为主流的开发语言

本人使用C开发8年、C#开发15年、中间使用JAVA开发过项目、后期在学习过程中发现了Rust语言说它是最安全的语言&#xff0c;能够解决C、C的痛点、于是抽出一部分时间网上买书&#xff0c;看网上资料进行学习&#xff0c;这一学习起来发现和其它语言比较起来&#xff0c;在编码的…...

electron-updater软件自动检测更新 +无服务器本地测试

大家好&#xff0c;我是小黄。 今天分享一下如何0基础实现electron自动检测更新功能。 一. 安装 electron-updater 实现自动更新 安装依赖 electron-updater npm install electron-updater 二. 修改package.josn "publish": {"provider": "generi…...

Flink在Linux系统上的安装与入门

一、Flink的引入 这几年大数据的飞速发展&#xff0c;出现了很多热门的开源社区&#xff0c;其中著名的有Hadoop、Storm&#xff0c;以及后来的Spark&#xff0c;他们都有着各自专注的应用场景。Spark 掀开了内存计算的先河&#xff0c;也以内存为赌注&#xff0c;赢得了内存计…...

鸿蒙面试---都用过哪些装饰器

必答的 State装饰器&#xff1a;组件内状态 State装饰的变量&#xff0c;或称为状态变量&#xff0c;一旦变量拥有了状态属性&#xff0c;就可以触发其直接绑定UI组件的刷新。当状态改变时&#xff0c;UI会发生对应的渲染改变。Prop装饰器&#xff1a;父子单向同步Prop装饰的变…...

微信小游戏/抖音小游戏SDK接入踩坑记录

文章目录 前言问题记录1、用是否存在 wx 这个 API 来判断是微小平台还是抖小平台不生效2、微小支付的参数如何获取?3、iOS 平台不支持虚拟支付怎么办?微小 iOS 端支付时序图:抖小 iOS 端支付:4、展示广告时多次回调 onClose5、在使用单例时 this 引起的 bug6、使用 fetch 或…...

uniapp配置全局消息提醒

1.H5使用根标签插入dom的方式实现。 2.app端使用plus.nativeObj.View的方式绘制实现 H5端app端 H5端 创建组件orderAlert.vue <template><div class"view"><div class"content" v-if"visible"><div class"message&q…...

Docker学习

&#x1f389;Docker 简介和安装 Docker 是什么 Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机&#xff0c;它只虚拟你软件需要的运行环境&#xff0c;多余的一点都不要&#xff0c; 而普通虚拟机则是一个完整而庞大的系统&#xff0c;包含各…...

【Electron学习笔记(三)】Electron的主进程和渲染进程

Electron的主进程和渲染进程 Electron的主进程和渲染进程前言正文1、主进程2、渲染进程3、Preload 脚本3.1 在项目目录下创建 preload.js 文件3.2 在 main.js 文件下创建路径变量并将 preload.js 定义为桥梁3.3 在 preload.js 文件下使用 electron 提供的contextBridge 模块3.4…...

人工智能的微积分基础

目录 ​编辑 引言 微积分的基本概念 1. 导数 2. 积分 3. 微分方程 微积分在人工智能中的应用 1. 机器学习中的优化 2. 反向传播算法 3. 概率与统计 4. 控制理论 5. 自然语言处理中的梯度 6. 计算机视觉中的积分 7. 优化算法中的微积分 8. 微分几何在深度学习中的…...

关于BeanUtils.copyProperties是否能正常复制字段【详细版】

话不多说&#xff01;先总结&#xff1a; 1、字段相同&#xff0c;类型不同&#xff08;不复制&#xff0c;也不报错&#xff09; 2、子类父类 (1)子类传给父类&#xff08;可以正常复制&#xff09; (2)父类传给子类&#xff08;可以正常复制&#xff09; 3、子类父类&#x…...

oracle将select作为字段查询

在Oracle中&#xff0c;如果你想将一个SELECT语句作为字段的值&#xff0c;你可以使用子查询或者使用WITH子句&#xff08;也称为公用表表达式CTE&#xff09;。以下是两种方法的示例&#xff1a; 方法1&#xff1a;使用子查询 语法如下&#xff1a; SELECTcolumn1,(SELECT …...

FFmpeg 简介与编译

1. ffmpeg 简介&#xff1a; FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移…...

qt QLinearGradient详解

1、概述 QLinearGradient是Qt框架中QGradient的一个子类&#xff0c;用于创建线性渐变效果。线性渐变是一种颜色沿着一条直线平滑过渡到另一种颜色的效果。QLinearGradient允许你定义渐变的起点和终点&#xff0c;以及在这些点之间的颜色变化。你可以使用它来为图形、背景、边…...

点击A组件跳转到B页面的tab的某一列

1、使用vuex存储点击的数据&#xff1b; 点击A组件里面的button按钮&#xff1a; <div><button click"banli(first)">已办理</button><button click"banli(second)">未办理</button><button click"banli(third)&quo…...

图像小波去噪与总变分去噪详解与Python实现

目录 图像小波去噪与总变分去噪详解与实现1. 基础概念1.1 噪声类型及去噪问题定义1.2 小波去噪算法基础1.3 总变分去噪算法基础2. 小波去噪算法2.1 理论介绍2.2 Python实现及代码详解2.3 案例分析3. 总变分去噪算法3.1 理论介绍3.2 Python实现及代码详解3.3 案例分析4. 两种算法…...

mvn-mac操作小记

1.安装brew 如果报错&#xff0c;Warning: /opt/homebrew/bin is not in your PATH. vim ~/.zshrc&#xff0c;最后一行追加 export PATH“/opt/homebrew/bin:$PATH” source ~/.zshrc 2.安装brew install maven mvn -version查看路径 Maven home: /opt/homebrew/Cellar/mav…...

【娱乐项目】基于批处理脚本与JavaScript渲染视频列表的Web页面

Demo介绍 一个简单的视频播放器应用&#xff0c;其中包含了视频列表和一个视频播放区域。用户可以通过点击视频列表中的项来选择并播放相应的视频&#xff0c;播放器会自动播放每个视频并在播放完毕后切换到下一个视频。本项目旨在通过自动化脚本和动态网页渲染&#xff0c;帮助…...

Faster R-CNN (目标检测)

Faster R-CNN (Faster Region-based Convolutional Neural Networks) Faster R-CNN 是一种高效的目标检测模型&#xff0c;它是在 R-CNN 系列&#xff08;包括 R-CNN 和 Fast R-CNN&#xff09;的基础上发展而来的&#xff0c;能够实现对图像中多个对象的检测。Faster R-CNN 引…...

Diffusion中的Unet (DIMP)

针对UNet2DConditionModel模型 查看Unet的源码&#xff0c;得知Unet的down,mid,up blocks的类型分别是&#xff1a; down_block_types: Tuple[str] ("CrossAttnDownBlock2D","CrossAttnDownBlock2D","CrossAttnDownBlock2D","DownBlock2…...

docker服务容器化

docker服务容器化 1 引言2 多个容器间网络联通2.1 单独创建关联2.2 创建时关联 3 服务搭建3.1 镜像清单3.2 容器创建 4 联合实战4.2 flink_sql之kafka到starrocks4.2 flink_sql之mysql到starrocks 5 文献借鉴 1 引言 ​ 利用docker可以很效率地搭建服务&#xff0c;本文在win1…...

Flink 从入门到实战

Flink中的批和流 批处理的特点是有界、持久、大量&#xff0c;非常适合需要访问全部记录才能完成的计算工作&#xff0c;一般用于离线统计。 流处理的特点是无界、实时, 无需针对整个数据集执行操作&#xff0c;而是对通过系统 传输的每个数据项执行操作&#xff0c;一般用于实…...

ffmpeg安装(windows)

ffmpeg安装-windows 前言ffmpeg安装路径安装说明 前言 ffmpeg的安装也是开箱即用的,并没有小码哥说的那么难 ffmpeg安装路径 这就下载好了! 安装说明 将上面的bin目录加入到环境变量,然后在cmd中测试一下: C:\Users\12114\Desktop\test\TaskmgrPlayer\x64\Debug>ffmpe…...

深度解析:Android APP集成与拉起微信小程序开发全攻略

目录 一、背景以及功能介绍 二、Android开发示例 2.1 下载 SDK 2.2 调用接口 2.3 获取小程序原始Id 2.4 报错提示&#xff1a;bad_param 2.4.1 错误日志 2.4.2 解决方案 相关推荐 一、背景以及功能介绍 需求&#xff1a;产品经理需要APP跳转到公司的小程序(最好指定页…...

DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly Detection

DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly Detection 清华、苹果 个人感觉 Introduction 很自然的让读者理解作者问题的提出&#xff0c;也有例子直接证明了这个问题的存在&#xff0c;值得借鉴&#xff01;&#xff01; Related work写的也很不…...

Xilinx Blockset Gateway In 和Gateway out模块使用及参数配置

目录 一、Gateway InSimulink数据到System Generator数据的转换Gateway BlocksBlock Parameters&#xff08;模块参数&#xff09;Basic选项卡参数Implementation选项卡参数 二、Gateway OutGateway BlocksBlock Parameters&#xff08;模块参数&#xff09;Basic选项卡参数Imp…...

set up RAGFlow on your Mac

个人思考&#xff1a;这些仅仅是工具&#xff0c;和人的思维实际还是有很大差距。 可能是我认知片面&#xff0c;你需要投喂大量的内容给它&#xff0c;它自己其实并不会思考&#xff0c;只是从它的认知里告诉它他知道的东西。举个不太巧当的例子&#xff0c;和以往的方式恰恰相…...

SSM搭建(1)——配置MyBatis

目录 一、框架概述 1.什么是JDBC&#xff1f; 2.JDBC基本流程 3.JDBC的缺点 二、MyBatis的入门程序 1. 创建数据库和表结构 2. MyBatis入门流程总结 3. MyBatis的入门步骤 &#xff08;1&#xff09; 创建maven的项目&#xff0c;创建Java工程即可。 &…...

SickOs: 1.1靶场学习小记

学习环境 kali攻击机&#xff1a;Get Kali | Kali Linux vulnhub靶场&#xff1a;https://download.vulnhub.com/sickos/sick0s1.1.7z 靶场描述&#xff1a; 这次夺旗赛清晰地模拟了在安全环境下如何对网络实施黑客策略从而入侵网络的过程。这个虚拟机与我在进攻性安全认证专…...

Flume 监控配置和实践

要解释 Flume 的监控机制&#xff0c;需要了解 Flume 是如何设计其监控架构的&#xff0c;以及如何将性能指标暴露给用户或集成工具。下面我将详细分解 Flume 的监控机制&#xff0c;从基础架构、实现原理到源码解析&#xff0c;并提供非专业人也能理解的通俗解释。 Flume 的监…...

二分法算法

提示&#xff1a;文章 文章目录 前言一、背景二、二分法2.2 最坏情况下冒泡排序的比较次数 三、大算法之一&#xff1a;分治法总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 二分法 一、背景 问题来源是一个题目&#xff0c;在A[N]字符串数组中匹配长度为M的字符串&…...

3.27浮点数计算

-127就是说&#xff0c;有8位的数来表示指数&#xff0c;然后给他减去127就是这八位劈半&#xff0c;一半表示负数的指数&#xff0c;一半表示整数的指数&#xff1b;对于移码来说&#xff0c;最高位为1时表示为正&#xff0c;为0时表示为负 对阶是要小阶向大阶对齐&#xff0c…...

存储过程与自然语言处理逻辑的不同与结合

在现代软件开发中&#xff0c;存储过程与自然语言处理&#xff08;NLP&#xff09;逻辑都发挥着重要作用。存储过程是一种在数据库内部运行的预编译程序&#xff0c;通常用于处理与数据相关的任务&#xff0c;例如插入、更新、删除数据以及复杂的查询操作。而自然语言处理&…...

数据集搜集器(百科)008

对数据集搜集器&#xff08;百科&#xff09;007进行一下改进&#xff1a; 错误处理&#xff1a;增加更多的错误处理&#xff0c;比如网络请求超时、解析错误等。 用户界面&#xff1a;增加一些提示信息&#xff0c;让用户更清楚当前的操作状态。 多线程处理&#xff1a;确保多…...

用Pycharm安装manim

由于版本和工具的差异&#xff0c;manim的安装方式不尽相同。本文用Pycharm来安装manim. 一、准备工作&#xff1a;安装相应版本的python、pycharm和ffmpeg. 此处提供一种安装ffmpeg的方式 下载地址&#xff1a;FFmpeg 下载后&#xff0c;解压到指定目录。 配置环境变量&am…...

HTB:Love[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机开放端口进行脚本、服务扫描 使用浏览器访问靶机443端口 尝试利用该功能访问靶机自身80端口 使用ffuf对靶机80端口进行路径FUZZ 漏洞利用 使用searchsploit搜索靶机80端…...