生成模型:变分自编码器-VAE
1.基本概念
1.1 概率
这里有:
- x为真实图像,开源为数据集, 编码器将其编码为分布参数
- x ^ \hat{x} x^为生成图像, 通过解码器获得
- p ( x ) ^ \hat{p(x)} p(x)^: 观测数据的分布, 即数据集所构成的经验分布
- p r e a l ( x ) p_{real}(x) preal(x): 真实世界的数据分布,这个是最理想的情况
- p ( x ) p(x) p(x):生成模型的分布,目的是接近 p r e a l ( x ) p_{real}(x) preal(x),避免过拟合到 p ( x ) ^ \hat{p(x)} p(x)^
- z ∼ N ( μ , σ ) 2 z \sim \mathcal{N}(\mu, \sigma)^2 z∼N(μ,σ)2 :潜空间向量, 通常希望约束于正态分布
- p ( z ) p(z) p(z):先验分布,即假设分布,在 VAE 中通常假设为标准正态分布
- q ϕ ( z ∣ x ) q_\phi(z∣x) qϕ(z∣x): 后验分布,是一种近似分布以逼近目标分布。依赖输入数据x,预测潜向量分布,即编码器
- p θ ( x ∣ z ) p_\theta(x∣z) pθ(x∣z): 条件分布,通过z生成x,即解码器
KL散度, 衡量分布相似性:
-
当 q ϕ ( z ∣ x ) = p ( z ) q_\phi(z∣x)=p(z) qϕ(z∣x)=p(z), 散度为 0,表示两个分布完全一致。
-
q ϕ ( z ∣ x ) ≠ p ( z ) q_\phi(z∣x)≠p(z) qϕ(z∣x)=p(z) 时,散度为正,值越大表示分布之间的差异越大。
KL 散度用于约束编码器生成的后验分布 q ϕ ( z ∣ x ) q_\phi(z∣x) qϕ(z∣x) 接近先验分布 p ( z ) p(z) p(z)
1.2 模型
VAE与普通自编码器区别如下:
- 普通自编码器(AE) 会直接将 x映射到一个固定的潜向量z
- 变分自编码器(VAE) 则通过学习概率分布的参数(均值 μ ( x ) \mu(x) μ(x),方差 σ 2 ( x ) \sigma^2(x) σ2(x) 来学习一个潜在分布 q ϕ ( x ∣ z ) q_\phi(x|z) qϕ(x∣z),
VAE训练一个自编码器, 目标是生成潜空间的分布参数,即潜向量z的均值和方差,而不是z本身。
因为学习的是一个分布参数,z具有随机性,即 x 和 z 不是一一对应的,是一对多的关系,
其设计原因分析如下:
1.数据分布复杂:真实世界中的非结构化数据分布是及其复杂且多样的。如果每个
x都严格映射到一个z,则潜在空间无法表达数据的多样性,数据映射的z存在随机性。
2.有助于模型泛化: 学习一个分布近似分布而不是固定映射。在生成任务中,随机采样z具有多样性,而不仅仅是直接复现训练数据, 适应未见过的数据。
2.方法
2.1 编码器-E
E将输入数据映射为潜在空间的概率分布参数: 均值 μ \mu μ 与 方差 σ 2 \sigma^2 σ2。
μ \mu μ 和 σ 2 \sigma^2 σ2 分别代表潜空间向量的各元素均值和方差。
这里假定 q q q是可以通过学习参数 θ \theta θ学到,公式如下:
N ( z ; μ ( x ) , σ 2 ( x ) ) \mathcal{N}(z; \mu(x), \sigma^2(x)) N(z;μ(x),σ2(x))
表示z服从正态分布,其均值为 μ ( x ) \mu(x) μ(x)$
即 q θ q_\theta qθ用编码器E来学习:
$E(x) = \mu(x), \sigma^2(x), z \sim ( \mu(x), \sigma^2(x)) $
2.2 解码器-D
D的目的是,输入潜向量 z,重构输入数据 x, 得到 x ^ \hat{x} x^
- 重参数化
由于分布输出的z是随机采样,存在不确定性,这里在送入D前重参数化:
z = u + σ ⋅ ϵ , ϵ ∼ N ( 0 , 1 ) z = u + \sigma \cdot \epsilon, \epsilon \sim \mathcal{N}(0,1) z=u+σ⋅ϵ,ϵ∼N(0,1)
即z是一个确定的函数,将随机性与模型参数 μ , σ \mu, \sigma μ,σ分离。
再送入解码器:
x ^ = D ( z ) \hat{x} = D(z) x^=D(z)
2.3 训练
VAE是将E和D作为一个整体训练(即整个自编码器), 损失函数如下:
L VAE = E z ∼ q ϕ ( z ∣ x ) [ − log p θ ( x ∣ z ) ] + D KL ( q ϕ ( z ∣ x ) ∥ p ( z ) ) \mathcal{L}_{\text{VAE}} = \mathbb{E}_{z \sim q_\phi(z|x)} \left[ -\log p_\theta(x|z) \right] + D_\text{KL}(q_\phi(z|x) \parallel p(z)) LVAE=Ez∼qϕ(z∣x)[−logpθ(x∣z)]+DKL(qϕ(z∣x)∥p(z))
简化为:
L VAE \mathcal{L}_{\text{VAE}} LVAE = 重构损失 + KL散度
2.3.1 重构损失
表示在潜向量z按照近似后验分布 q ϕ ( z ∣ x ) q_\phi(z∣x) qϕ(z∣x)采样时,模型重构数据 x ^ \hat{x} x^的对数似然期望值:
− E z ∼ q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] -\mathbb{E}_{z \sim q_\phi(z \mid x)}\left[\log p_\theta(x \mid z)\right] −Ez∼qϕ(z∣x)[logpθ(x∣z)]
这里加了负号,即最大化重构概率转为损失值最小化。
直观理解:
1.编码器 q ϕ ( z ∣ x ) q_\phi(z|x) qϕ(z∣x)为每个输入数据x提供一组潜向量z的分布参数。
2.解码器$p_\theta(x|z)尝试根据z重构原始数据x。
3.对 log θ ( x ∣ z ) \log_\theta(x|z) logθ(x∣z)取期望值,是对不同z的采样重构结果进行平均。
如果解码器能很好地重构x, log θ ( x ∣ z ) \log_\theta(x|z) logθ(x∣z)值就大,相反就小。
- 如果是二值像素, 即0 和 1。可以用交叉熵,即BCE(Binary Cross Entropy)
即判断像素值接近 0 还是接近 1:
BCE = − 1 N ∑ i = 1 N [ x i log ( x ^ i ) + ( 1 − x i ) log ( 1 − x ^ i ) ] \text{BCE} = -\frac{1}{N} \sum_{i=1}^{N} \left[ x_i \log(\hat{x}_i) + (1 - x_i) \log(1 - \hat{x}_i) \right] BCE=−N1∑i=1N[xilog(x^i)+(1−xi)log(1−x^i)]
- 如果是[0,255],或者归一化为[0,1],[-1,1]的像素,可以用MSE
MSE = 1 N ∑ i = 1 N ( x i − x ^ i ) 2 \text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (x_i - \hat{x}_i)^2 MSE=N1∑i=1N(xi−x^i)2
2.3.2 KL散度
KL 散度的定义:
D KL ( q ϕ ( z ∣ x ) ∥ p ( z ) ) = E q ϕ ( z ∣ x ) [ log q ϕ ( z ∣ x ) p ( z ) ] D_\text{KL}(q_\phi(z|x) \parallel p(z)) = \mathbb{E}_{q_\phi(z|x)} \left[ \log \frac{q_\phi(z|x)}{p(z)} \right] DKL(qϕ(z∣x)∥p(z))=Eqϕ(z∣x)[logp(z)qϕ(z∣x)]
展开:
D KL = E z ∼ q ϕ ( z ∣ x ) [ − log p θ ( x ∣ z ) + log q ϕ ( z ∣ x ) p ( z ) ] D_\text{KL} = \mathbb{E}_{z \sim q_\phi(z|x)} \left[ -\log p_\theta(x|z) + \log \frac{q_\phi(z|x)}{p(z)} \right] DKL=Ez∼qϕ(z∣x)[−logpθ(x∣z)+logp(z)qϕ(z∣x)]
进一步分解为:
D KL = − 1 2 ∑ i = 1 d ( 1 + log σ i 2 − μ i 2 − σ i 2 ) D_\text{KL} = -\frac{1}{2} \sum_{i=1}^d \left( 1 + \log \sigma_i^2 - \mu_i^2 - \sigma_i^2 \right) DKL=−21∑i=1d(1+logσi2−μi2−σi2)
3.代码实现
训练VAE生成手写数字。
3.1 参数设置
-
模型:极简的7层全连接自编码器(E-4层, D-3层)
-
数据集:pytorch自带的mnist手写数据集,每个样本像素为单通道 [28,28]
-
epoch: 50次
-
batch-size:64
-
learing-rate:1e-3 或 5e-4
3.2 代码概述
- 导入必要的库
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
- 编码器:将输入数据映射为潜在变量 z 的均值 μ \mu μ 和方差 σ 2 \sigma^2 σ2
- 解码器:从潜在变量 z 重构原始数据
class VAE(nn.Module):def __init__(self, input_dim, latent_dim):super(VAE, self).__init__()# 编码器self.encoder = nn.Sequential(nn.Linear(input_dim, 512),nn.ReLU(),nn.Linear(512, 256),nn.ReLU())self.fc_mu = nn.Linear(256, latent_dim) # 均值self.fc_logvar = nn.Linear(256, latent_dim) # 对数方差# 解码器self.decoder = nn.Sequential(nn.Linear(latent_dim, 256),nn.ReLU(),nn.Linear(256, 512),nn.ReLU(),nn.Linear(512, input_dim),nn.Sigmoid() # 用 Sigmoid 将输出值压缩到 [0, 1])def reparameterize(self, mu, logvar):"""使用重参数化技巧生成潜在变量 z"""std = torch.exp(0.5 * logvar) # 标准差eps = torch.randn_like(std) # 标准正态分布的随机噪声return mu + eps * stddef forward(self, x):# 编码h = self.encoder(x)mu = self.fc_mu(h)logvar = self.fc_logvar(h)# 重参数化z = self.reparameterize(mu, logvar)# 解码recon_x = self.decoder(z)return recon_x, mu, logvar
- 损失函数
def vae_loss(recon_x, x, mu, logvar):# 重构误差(BCE)recon_loss = nn.functional.binary_cross_entropy(recon_x, x, reduction='sum')# KL 散度kl_div = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())return recon_loss + kl_div
- 数据加载和超参数设置
# 超参数
latent_dim = 20 # 潜在空间维度
input_dim = 28 * 28 # MNIST 图像大小
batch_size = 64
epochs = 50
lr = 0.001# 数据加载器
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
- 训练 VAE, 先初始化模型和优化器
vae = VAE(input_dim=input_dim, latent_dim=latent_dim).to('cuda')
optimizer = optim.Adam(vae.parameters(), lr=lr)for epoch in range(epochs):vae.train()total_loss = 0for images, _ in dataloader:# 预处理数据images = images.view(-1, input_dim).to('cuda')# 前向传播recon_images, mu, logvar = vae(images)# 计算损失loss = vae_loss(recon_images, images, mu, logvar)# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()total_loss += loss.item()print(f"Epoch [{epoch+1}/{epochs}] Loss: {total_loss / len(dataloader.dataset):.4f}")
- 生成新样本时,只需要随机从潜在空间中采样z,然后通过解码器生成数据:
vae.eval()
with torch.no_grad():# 从标准正态分布采样z = torch.randn(256, latent_dim).to('cuda') # 16x16 = 256 个样本generated_images = vae.decoder(z).view(-1, 1, 32, 32).cpu()# 创建 16x16 的网格grid = torchvision.utils.make_grid(generated_images, nrow=16, normalize=True)# 保存生成的图像为文件torchvision.utils.save_image(grid, 'generated_images.png', normalize=True)# 显示图像plt.imshow(grid.permute(1, 2, 0))plt.axis('off') # 去除坐标轴plt.show()
4.实验结果
4.1 损失函数
损失函数值有效下降,在数据集迭代34次(ep33)后下降约一半:

4.2 最终效果
- epoch-1:

- epoch-12:

- epoch-33:

5.概率相关补充
5.1 条件概率-贝叶斯定理
p ( x , z ) = p ( x ∣ z ) p ( z ) p(x,z) = p(x|z)p(z) p(x,z)=p(x∣z)p(z)
p ( z ∣ x ) = p ( x , z ) p ( x ) = p ( x ∣ z ) p ( z ) p ( x ) p(z \mid x) = \frac{p(x, z)}{p(x)} = \frac{p(x \mid z) p(z)}{p(x)} p(z∣x)=p(x)p(x,z)=p(x)p(x∣z)p(z)
5.2 KL散度函数:
D K L ( q ( z ∣ x ) ∥ p ( z ) ) = E q ( z ∣ x ) [ log p ( z ) q ( z ∣ x ) ] = ∫ q ( z ∣ x ) log q ( z ∣ x ) p ( z ) d z = ∑ z q ( z ∣ x ) log q ( z ∣ x ) p ( z ) D_{KL}(q(z|x) \parallel p(z)) = \mathbb{E}_{q(z|x)} \left[ \log \frac{p(z)}{q(z|x)} \right] = \int q(z|x) \log \frac{q(z|x)}{p(z)} \, dz = \sum_{z} q(z|x) \log \frac{q(z|x)}{p(z)} DKL(q(z∣x)∥p(z))=Eq(z∣x)[logq(z∣x)p(z)]=∫q(z∣x)logp(z)q(z∣x)dz=∑zq(z∣x)logp(z)q(z∣x)
KL衡量一个分布相对于另一个分布的信息损失或“距离”,是一个正数:
证明可利用:
log x ≤ x − 1 , ∀ x > 0 \log x \leq x - 1, \quad \forall x > 0 logx≤x−1,∀x>0
给log内分数上负号,颠倒分子分母,则:
∑ z q ( z ∣ x ) log p ( z ) q ( z ∣ x ) ≤ ∑ z − p ( z ) q ( z ∣ x ) < 0 \sum_{z}q(z|x) \log \frac{p(z)}{q(z|x)} \leq \sum_z -\frac{p(z)}{q(z|x)} < 0 ∑zq(z∣x)logq(z∣x)p(z)≤∑z−q(z∣x)p(z)<0
5.3 概率密度函数:
p ( z ) ∼ N ( 0 , 1 ) p(z) \sim \mathcal{N}(0,1) p(z)∼N(0,1):
p ( z ) = 1 ( 2 π ) d / 2 exp ( − 1 2 ∑ i = 1 d z i 2 ) p(z) = \frac{1}{(2\pi)^{d/2}} \exp \left( -\frac{1}{2} \sum_{i=1}^{d} z_i^2 \right) p(z)=(2π)d/21exp(−21∑i=1dzi2)
注:d是维度
p ( z ) ∼ N ( μ , σ ) p(z) \sim \mathcal{N}(\mu,\sigma) p(z)∼N(μ,σ):
q ( z ∣ x ) = 1 ( 2 π ) d / 2 ∣ Σ ∣ 1 / 2 exp ( − 1 2 ∑ i = 1 d ( z i − μ i ) 2 σ i 2 ) ; Σ = d i a g ( σ 1 2 , . . . , σ d 2 ) q(z|x) = \frac{1}{(2\pi)^{d/2} |\Sigma|^{1/2}} \exp \left( -\frac{1}{2} \sum_{i=1}^{d} \frac{(z_i - \mu_i)^2}{\sigma_i^2} \right); \Sigma = diag(\sigma_1^2,...,\sigma_d^2) q(z∣x)=(2π)d/2∣Σ∣1/21exp(−21∑i=1dσi2(zi−μi)2);Σ=diag(σ12,...,σd2)
也可以写成这样:
q ( z ∣ x ) = 1 ( 2 π ) d / 2 σ 1 σ 2 ⋯ σ d exp ( − 1 2 ∑ i = 1 d ( z i − μ i ) 2 σ i 2 ) q(z|x) = \frac{1}{(2\pi)^{d/2} \sigma_1 \sigma_2 \cdots \sigma_d} \exp \left( -\frac{1}{2} \sum_{i=1}^{d} \frac{(z_i - \mu_i)^2}{\sigma_i^2} \right) q(z∣x)=(2π)d/2σ1σ2⋯σd1exp(−21∑i=1dσi2(zi−μi)2)
Ref
- Auto-Encoding Variational Bayes / Variational autoencoder
- https://arxiv.org/abs/1312.6114
- https://www.zhihu.com/question/579890053/answer/38625999761
本文全部代码:
- https://github.com/disanda/GM.git
相关文章:
生成模型:变分自编码器-VAE
1.基本概念 1.1 概率 这里有: x为真实图像,开源为数据集, 编码器将其编码为分布参数 x ^ \hat{x} x^为生成图像, 通过解码器获得 p ( x ) ^ \hat{p(x)} p(x)^: 观测数据的分布, 即数据集所构成的经验分布 p r e a l ( x ) p_{real}(x) preal(x): …...
Hive sql执行文件合并配置参数
HIVE自动合并输出的小文件的主要优化手段为:HIVE将会启动一个独立的map-reduce任务进行输出文件的merge。 set hive.merge.mapfiles true: 在只有map的作业结束时合并小文件, set hive.merge.mapredfiles true: 在Map-Reduce的任…...
鸿蒙 ArkUI实现地图找房效果
常用的地图找房功能,是在地图上添加区域、商圈、房源等一些自定义 marker,然后配上自己应用的一些筛选逻辑构成,在这里使用鸿蒙 ArkUI 简单实现下怎么添加区域/商圈、房源等 Marker. 1、开启地图服务 在华为开发者官网,注册应用&…...
一套极简易的直流无刷电机(Deng FOC)开发套件介绍
目录 概述 1. 硬件组成介绍 1.1 主要硬件 1.2 电机驱动板介绍 1.3 2208电机模块 1.3.1 参数介绍 1.3.2 认识2208电机 2 驱动板接口介绍 2.1 PCB接口(MCU)定义 2.2 功能描述 2.2.1 电机驱动接口 2.2.2 编码器接口 2.2.3 电流输入引脚接口 2.…...
Inception模型详解及代码分析
模型背景 Inception系列模型由Google团队提出,旨在解决CNN分类模型面临的两大挑战: 如何在增加网络深度的同时提升分类性能 如何在保证分类准确率的同时降低计算和内存开销 Inception V1通过引入 并行卷积结构 和 1x1卷积 ,巧妙地解决了这两个问题,在保证模型质量的前提下…...
Springboot AOP 每个接口运行前 修改入参
控制台log输出为何频频失踪? wxss代码为何频频失效? wxml布局为何乱作一团? 究竟是道德的沦丧?还是人性的缺失? 让我们一起来 走 跑进科学 前言 麻蛋被这个功能恶心好久 终于解决了 特此记录一下 正文 Before("authCut()")public void cutProc…...
课题推荐——基于GPS的无人机自主着陆系统设计
关于“基于GPS的无人机自主着陆系统设计”的详细展开,包括项目背景、具体内容、实施步骤和创新点。如需帮助,或有导航、定位滤波相关的代码定制需求,请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …...
【深度学习】在深度学习训练过程中,数据量太少会导致模型过拟合还是欠拟合?
过拟合与欠拟合 过拟合 : 是指在训练集上表现非常好,但是在新的数据集上表现较差的现象。具体来说,模型在训练集上过度学习,捕捉了数据中的噪声和偶然性,导致它对训练数据的拟合非常精确,但缺乏泛化能力,无…...
js迭代器模式
以前JS原生的集合类型数据结构,只有Array(数组)和Object(对象); 而ES6中,又新增了Map和Set。四种数据结构各自有着自己特别的内部实现,但我们仍期待以同样的一套规则去遍历它们&…...
测试开发基础知识2
10.什么是等价类和边界值法? 1)等价类划分 等价类划分是将系统的输入域划分为若干部分,然后从每个部分选取少量代表性数据进行测试。等价类划分认为如果一个测试用例在某个等价类中的一个值上通过测试,那么它在这个类中的其他值上也…...
PromQL基础使用和案例解析
文章目录 PromQL简介数据类型1、瞬时数据 (Instant vector)2、区间数据 (Range vector)➢ Time Durations➢ Offest modifier➢ modifier 3、标量数据 (Scalar)4、字符串 (String) 条件匹配1、完全匹配2、正则匹配 运算符1、比较运算符2、算数运算符3、逻辑运算符4、聚合运算符…...
使用Python实现基于机器学习的垃圾邮件过滤
友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将深…...
MySql根据经纬度查询距离
一、搭建测试 创建数据表() CREATE TABLE sys_test (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键ID,name varchar(20) DEFAULT NULL COMMENT 名称,longitude decimal(10,6) DEFAULT NULL COMMENT 经度,latitude decimal(10,6) DEFAULT NULL COMMENT 维度,PRIMARY KEY (id…...
Aviatrix Controller 未授权命令注入漏洞复现(CVE-2024-50603)
0x01 产品简介 Aviatrix Controller是一款强大的云网络管理平台,提供简化的跨云网络管理、自动化配置、安全策略、流量监控等功能,帮助企业实现更加灵活、安全和高效的云网络架构,特别适用于多云和混合云环境。主要用于编排和管理各种网络和连接解决方案。它为用户提供了一…...
数据结构与算法之二叉树: LeetCode 109. 有序链表转换二叉搜索树 (Ts版)
有序链表转换二叉搜索树 https://leetcode.cn/problems/convert-sorted-list-to-binary-search-tree/description/ 描述 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为 平衡 二叉搜索树 示例 1 输入: head [-10,-3,0,5,9] 输出:…...
Android NDK开发入门2之适应idm环境
环境搭建 Android NDK开发实战之环境搭建篇(so库,Gemini ai)-CSDN博客 初始配置 前面已经运行了一个简单的初始程序,现在我们来往初始程序添加类和函数,并成功运行的实验。 一级配置 第一层配置主要是cmake文件环境和一些编译选项。 build配置 可参…...
如何隐藏 Nginx 版本号 并自定义服务器信息,提升安全性
🏡作者主页:点击! Nginx-从零开始的服务器之旅专栏:点击! 🐧Linux高级管理防护和群集专栏:点击!点击!点击! ⏰️创作时间:2025年1月8日8点14分…...
鸿蒙的APP真机调试以及发布
目录: 1、创建好鸿蒙项目2、创建AGC项目3、实现自动签名3.1、手动方式创建签名文件和密码 4、运行项目5、无线真机调试 1、创建好鸿蒙项目 2、创建AGC项目 (1)在File->Project Structure->Project->Signing Configs中进行登录。(未…...
图像处理|膨胀操作
在图像处理领域,形态学操作是一种基于图像形状的操作,用于分析和处理图像中对象的几何结构。**膨胀操作(Dilation)**是形态学操作的一种,它能够扩展图像中白色区域(前景)或减少黑色区域…...
攻防世界 ics-07
点击之后发现有个项目管理能进,点进去,点击看到源码,如下三段 <?php session_start(); if (!isset($_GET[page])) { show_source(__FILE__); die(); } if (isset($_GET[page]) && $_GET[page] ! index.php) { include(flag.php);…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
