NYU-DLSP20 第 9 周讲义精读:能量模型视角下的 GAN 原理、三大陷阱与 DCGAN PyTorch 实战
示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载本文基于 NYU Deep Learning Spring 2020NYU-DLSP20课程第 9 周讲义docs/en/week09/09-3.md讲师 Alfredo Canziani2020-03-31整理先从能量基础模型EBM的视角拆解生成对抗网络GAN中生成器与代价网络的对抗机制再对比其与变分自编码器VAE的架构差异随后剖析训练中常见的收敛不稳定、梯度消失与模式崩溃三大陷阱最后逐行解读 PyTorch 官方 DCGAN 示例的生成器、判别器与两阶段训练循环帮助读者既能理解 GAN 的理论本质也能直接照搬代码上手训练。引言GAN 是什么GANGenerative Adversarial Network是一类用于无监督机器学习的神经网络。它由两个相互对抗的模块组成生成器Generator负责把随机变量映射成以假乱真的样本 $\hat{\vect{x}}$代价网络Cost Network负责打假给虚假样本打出高代价。二者互相竞争代价网络努力过滤掉伪造样本生成器则不断改进试图骗过这张过滤网。通过这种对抗模型最终学习到一个能生成逼真数据的生成器可用于未来预测future prediction或在特定数据集上训练后生成图像。Fig.1GAN 架构图片源自docs/images/week09/09-3/GANArchitecture.png。其典型流程为从 Sampler 采样潜在变量 $\vect{z}$ → Generator 生成 $\hat{\vect{x}}$ → 与真实样本 $\vect{x}$ 一起送入 Cost 网络计算损失。能量模型视角代价网络即能量函数GAN 是**能量基础模型Energy-Based Model, EBM**的典型例子。同周前序讲义docs/en/week09/09-2.md明确指出可以把 GAN 理解为一种使用对比方法contrastive method的能量模型——推高对比样本的能量压低训练样本的能量。代价网络回归式能量打分代价网络被训练成对接近真实数据分布的输入Fig.2 中粉色 $\vect{x}$输出低代价对来自其他分布的输入Fig.2 中蓝色 $\hat{\vect{x}}$输出高代价。其性能通常用均方误差MSE损失衡量。需要注意代价函数输出的是指定范围内的正标量$$\text{cost} : \mathbb{R}^n \rightarrow \mathbb{R}^ \cup {0}$$这与经典判别器discriminator有本质区别经典判别器输出的是离散的分类结果如 0/1而代价网络输出的是连续的、可微的能量标量这正是它能作为能量模型被梯度方法优化的前提。Fig.2随机变量 $\vect{z}$ 经生成器映射到样本空间图片源自docs/images/week09/09-3/GANMapping.png。靠近真实数据流形粉色螺旋的点能量低远离流形的点能量高。生成器最小化生成样本的能量生成器网络 $\text{generator} : \mathcal{Z} \rightarrow \mathbb{R}^n$ 的训练目标是改进随机变量 $\vect{z}$ 到逼真数据 $\hat{\vect{x}}$ 的映射以骗过代价网络。它根据代价网络的输出来训练尽量最小化 $\hat{\vect{x}}$ 的能量记为 $C(G(\vect{z}))$其中 $C(\cdot)$ 是代价网络$G(\cdot)$ 是生成器网络。于是两个网络的训练方向恰好相反代价网络通过最小化MSE 损失训练生成器通过最小化代价网络的输出训练即利用 $C(\hat{\vect{x}})$ 对 $\hat{\vect{x}}$ 的梯度$\partial C / \partial \hat{\vect{x}}$来更新生成器参数$\partial C / \partial W_G$。代价网络与生成器的损失函数为保证数据流形之外的点高代价、流形之内的点低代价代价网络的损失函数 $\mathcal{L}_C$ 采用带边距margin的 hinge 型损失$$\mathcal{L}_C C(\vect{x}) [m - C(G(\vect{z}))]^$$其中 $m$ 为正的边距参数$[\cdot]^$ 表示取正部即 $\max(\cdot, 0)$。最小化 $\mathcal{L}_C$ 要求 $C(\vect{x}) \rightarrow 0$ 且 $C(G(\vect{z})) \rightarrow m$——即真实样本能量压到 0伪造样本能量推到边距 $m$。生成器的损失则非常简单$$\mathcal{L}_G C(G(\vect{z}))$$它促使生成器把 $C(G(\vect{z}))$ 推向 0。但这也正是 GAN 不稳定的根源$C(G(\vect{z}))$ 同时被代价网络推向 $m$与生成器推向 $0$拉扯即 $0 \leftarrow C(G(\vect{z})) \rightarrow m$ 的对抗性张力两个目标函数相互冲突、需要同时最小化本质上是寻找二者的Nash 均衡而非普通的梯度下降收敛此观点同样见docs/en/week09/09-2.md。GAN 与 VAE 的差异第 8 周课程介绍的变分自编码器VAE与 GAN 都是生成模型但生成机制截然不同可对照仓库中的10-autoencoder.ipynb了解 VAE 实现Fig.3VAE左与 GAN右架构对比图片源自docs/images/week09/09-3/GANvsVAEArchitecture.png。VAE 依赖 Encoder→Sampler→Decoder 的重建链路GAN 只有 Sampler→Generator→Cost 的对抗链路。VAE用编码器把输入 $\vect{x}$ 映射到潜在空间 $\mathcal{Z}$输出潜在变量 $\vect{z}$ 的均值与方差再用解码器从 $\mathcal{Z}$ 映射回数据空间得到 $\hat{\vect{x}}$最后用重建损失reconstruction loss把 $\vect{x}$ 与 $\hat{\vect{x}}$ 拉近。GAN在对抗环境下训练——从采样器直接采样 $\vect{z}$无需编码器生成网络把 $\vect{z}$ 映射为 $\hat{\vect{x}}$再由代价网络评估其真实程度。两个网络通过反向传播与基于梯度的方法交替训练。Fig.4VAE左与 GAN右从随机样本 $\vect{z}$ 出发的映射对比图片源自docs/images/week09/09-3/GANvsVAEMapping.jpg。VAE 用 encodernoise 与 decoder 构成闭环并施加重建损失 $\ell(\vect{x}, \hat{\vect{x}})$GAN 用 generator 单向映射并用 cost 高低区分真假。两者在如何使用 $\vect{z}$上也有差异VAE 中的 $\vect{z}$ 是编码得到的潜在码code需要配一个解码步骤GAN 中的 $\vect{z}$ 只是一个输入例如从高斯/正态分布直接采样因此只需一个生成步骤。二者最核心的区别在于GAN 不需要直接度量生成网络输出 $\hat{\vect{x}}$ 与真实数据 $\vect{x}$ 之间的直接关系即不需要重建损失。它通过迫使生成器生成让代价网络给出与真实数据 $\vect{x}$ 相似甚至更真实分数的 $\hat{\vect{x}}$来间接实现 $\hat{\vect{x}}$ 与 $\vect{x}$ 的相似。正如实践课字幕docs/en/week09/practicum09.sbv中所强调的GAN 用判别器网络取代了重建损失且 $\vect{z}$ 的分布是固定的改变的是生成器——生成器会把固定的 $\vect{z}$ 分布塑形成尽量贴合真实数据分布的 $\hat{\vect{x}}$ 分布。GAN 的三大陷阱GAN 威力强大但训练中容易踩坑讲义归纳了三个主要问题。1. 收敛不稳定随着训练推进、生成器越来越好判别器将越来越难分辨真假性能随之变差。若生成器完美真假数据的流形完全重合判别器会大量误分类。此时判别器的反馈逐渐失去意义若继续训练到判别器给出完全随机的反馈生成器将基于垃圾反馈训练生成质量可能崩塌可参考 Google ML 教程中关于 GAN 训练收敛的论述此处不展开外链。因此生成器与判别器的对抗本质导致的是一个不稳定的均衡点而非稳定均衡。2. 梯度消失考虑用二元交叉熵BCE损失训练 GAN$$\mathcal{L} \mathbb{E}\boldsymbol{x}[\log(D(\boldsymbol{x}))] \mathbb{E}\boldsymbol{\hat{x}}[\log(1-D(\boldsymbol{\hat{x}}))]$$随着判别器越来越自信$D(\vect{x})$ 逼近 1、$D(\hat{\vect{x}})$ 逼近 0。这种自信把代价网络的输出推向平坦区饱和区那里的梯度极小甚至消失阻碍生成器训练。因此训练 GAN 时要确保判别器越自信代价应逐步上升而不是骤变——这也解释了为什么 09-2 讲义强调要对能量函数做正则化、并提及 Wasserstein GAN 通过限制判别器权重来改善这一问题。3. 模式崩溃Mode Collapse如果生成器把所有 $\vect{z}$ 都映射到同一个能骗过判别器的 $\hat{\vect{x}}$它就只会输出那一个 $\hat{\vect{x}}$。判别器随后学会专门识别这个假样本生成器便转而寻找下一个最像的 $\hat{\vect{x}}$如此循环往复。其后果是判别器陷入在多个假 $\hat{\vect{x}}$ 之间打转的局部最小值。一个可行的缓解方案是对生成器施加惩罚——当输入不同而输出相同时给予惩罚迫使它保持样本多样性。DCGAN 源码实战PyTorch 逐模块解析讲义以 PyTorch 官方示例仓库中的DCGANDeep Convolutional GAN示例main.py为教学素材下面按模块完整解读其核心代码。生成器Generator生成器的三个要点用多个nn.ConvTranspose2d模块对输入升采样层间穿插nn.BatchNorm2d与nn.ReLU序列末尾使用nn.Tanh()把输出压缩到 $(-1, 1)$匹配归一化后的图像像素范围输入随机向量大小为 $nz$输出大小为 $nc \times 64 \times 64$$nc$ 为通道数。class Generator(nn.Module): def __init__(self): super().__init__() self.main nn.Sequential( # input is Z, going into a convolution nn.ConvTranspose2d( nz, ngf * 8, 4, 1, 0, biasFalse), nn.BatchNorm2d(ngf * 8), nn.ReLU(True), # state size. (ngf*8) x 4 x 4 nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, biasFalse), nn.BatchNorm2d(ngf * 4), nn.ReLU(True), # state size. (ngf*4) x 8 x 8 nn.ConvTranspose2d(ngf * 4, ngf * 2, 4, 2, 1, biasFalse), nn.BatchNorm2d(ngf * 2), nn.ReLU(True), # state size. (ngf*2) x 16 x 16 nn.ConvTranspose2d(ngf * 2, ngf, 4, 2, 1, biasFalse), nn.BatchNorm2d(ngf), nn.ReLU(True), # state size. (ngf) x 32 x 32 nn.ConvTranspose2d( ngf, nc, 4, 2, 1, biasFalse), nn.Tanh() # state size. (nc) x 64 x 64 ) def forward(self, input): output self.main(input) return output尺寸演化规律输入 $\vect{z}$ 形状为 $nz \times 1 \times 1$第一层ConvTranspose2d(nz, ngf*8, 4, 1, 0)用 stride 1、无 padding 将 $1\times1$ 扩为 $4\times4$此后每层kernel4, stride2, padding1使空间尺寸翻倍依次得到 $8\times8 \rightarrow 16\times16 \rightarrow 32\times32 \rightarrow 64\times64$通道数从 $ngf \times 8$ 逐级减半直到输出通道 $nc$。在 PyTorch 官方 DCGAN 示例的默认配置中常取 $nz100$、$ngf64$、$ndf64$$nc$ 依据数据集而定如 RGB 图像为 3。判别器Discriminator两个要点必须使用nn.LeakyReLU作为激活函数避免负区间梯度被杀掉——若负区间梯度为零生成器将收不到任何更新信号序列末尾使用nn.Sigmoid()输出 $[0,1]$ 的真实性概率。class Discriminator(nn.Module): def __init__(self): super().__init__() self.main nn.Sequential( # input is (nc) x 64 x 64 nn.Conv2d(nc, ndf, 4, 2, 1, biasFalse), nn.LeakyReLU(0.2, inplaceTrue), # state size. (ndf) x 32 x 32 nn.Conv2d(ndf, ndf * 2, 4, 2, 1, biasFalse), nn.BatchNorm2d(ndf * 2), nn.LeakyReLU(0.2, inplaceTrue), # state size. (ndf*2) x 16 x 16 nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, biasFalse), nn.BatchNorm2d(ndf * 4), nn.LeakyReLU(0.2, inplaceTrue), # state size. (ndf*4) x 8 x 8 nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, biasFalse), nn.BatchNorm2d(ndf * 8), nn.LeakyReLU(0.2, inplaceTrue), # state size. (ndf*8) x 4 x 4 nn.Conv2d(ndf * 8, 1, 4, 1, 0, biasFalse), nn.Sigmoid() ) def forward(self, input): output self.main(input) return output.view(-1, 1).squeeze(1)结构与生成器镜像对称Conv2d配合stride2, padding1使空间尺寸逐层减半$64\rightarrow32\rightarrow16\rightarrow8\rightarrow4$最后kernel4, stride1, padding0压缩到 $1\times1$ 单值经 Sigmoid 后view(-1,1).squeeze(1)展平成标量。两个类在示例中分别实例化为netG与netD。损失函数与训练设置损失函数直接使用二元交叉熵BCEcriterion nn.BCELoss()训练前的初始化设置构造fixed_noise尺寸为opt.batchSize、向量长度nz并分别为真实数据与生成数据创建标签fixed_noise torch.randn(opt.batchSize, nz, 1, 1, devicedevice) real_label 1 fake_label 0随后为判别器与生成器分别设置优化器Adam学习率opt.lr、动量超参opt.beta1optimizerD optim.Adam(netD.parameters(), lropt.lr, betas(opt.beta1, 0.999)) optimizerG optim.Adam(netG.parameters(), lropt.lr, betas(opt.beta1, 0.999))训练循环每轮 epoch 分两步Step 1 —— 更新判别器。分两个子步骤取真实数据data[0]计算输出与real_label的损失并backward()累积梯度用fixed_noise生成假数据fake计算输出与fake_label的损失并backward()累积梯度最后用累积梯度一次性optimizerD.step()更新判别器参数。两个关键实现细节fake.detach()把假数据从计算图中分离防止判别器训练时梯度反向传播进生成器只调用一次zero_grad()开头的清零让真假两部分梯度累加供同一次参数更新使用。# train with real netD.zero_grad() real_cpu data[0].to(device) batch_size real_cpu.size(0) label torch.full((batch_size,), real_label, devicedevice) output netD(real_cpu) errD_real criterion(output, label) errD_real.backward() D_x output.mean().item() # train with fake noise torch.randn(batch_size, nz, 1, 1, devicedevice) fake netG(noise) label.fill_(fake_label) output netD(fake.detach()) errD_fake criterion(output, label) errD_fake.backward() D_G_z1 output.mean().item() errD errD_real errD_fake optimizerD.step()Step 2 —— 更新生成器。这次把假数据fake送入判别器但用real_label计算损失其目的是训练生成器产出更真实的 $\hat{\vect{x}}$让判别器误以为假样本是真的netG.zero_grad() label.fill_(real_label) # fake labels are real for generator cost output netD(fake) errG criterion(output, label) errG.backward() D_G_z2 output.mean().item() optimizerG.step()实践中常记录D_x判别器对真实样本的平均输出、D_G_z1判别器对当前假样本的平均输出与D_G_z2更新生成器后判别器对同一批假样本的平均输出三个监控指标用来判断训练的对抗进程。此外实践课中还讨论了交替训练策略可以固定一方、更新另一方避免移动靶问题但相关证据在文献中存在矛盾需要针对具体任务实验确定。结合仓库进一步学习本仓库是 NYU-DLSP20 课程的中英多语言讲义仓库围绕第 9 周 GAN 主题可继续阅读docs/en/week09/09-2.md第 9 周 B 部分从世界模型World Models、强化学习过渡到 GAN 的能量模型/对比方法视角并讨论 Wasserstein GAN 等改进方向docs/en/week09/09.md第 9 周总览说明 A/B 两部分与实验课的内容分工docs/en/week09/practicum09.sbv本讲实验课字幕包含假钞与间谍的直观类比、cost 与 loss 的严格区分等补充讲解docs/zh/week09/09-3.md本讲的中文译本便于对照阅读10-autoencoder.ipynb仓库中的 VAE 实战 notebook可用于对比 GAN 与 VAE 的实现差异docs/en/week08/08.md第 8 周 VAE 讲义入口帮助理解VAE 用重建损失拉近 $\vect{x}$ 与 $\hat{\vect{x}}$这一对比基准。一句话总结GAN 用对抗取代了重建——代价网络能量函数负责给真实样本低分、给伪造样本高分生成器则通过最小化自身输出被赋予的能量来学会以假乱真而收敛不稳定、梯度消失与模式崩溃这三大陷阱正是这种零和博弈在梯度优化下的必然副产品理解了它们也就理解了为什么 DCGAN 的工程细节LeakyReLU、BatchNorm、交替更新、detach每一处都不可或缺。赞分享示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载相关推荐世界模型、强化学习与生成对抗网络NYU-DLSP20 第 9 周讲义精解World Models, RL GAN as Energy-Based Models世界模型、强化学习与生成对抗网络NYU DLSP20 第 9 周讲义精解World Models, RL GAN as Energy Based Mod示例工程NYU-DLSP20 第七周笔记精讲Energy-Based Models 能量模型框架全解析NYU DLSP20 第七周笔记精讲Energy Based Models 能量模型框架全解析 课程来源 NYU Deep Learning Spring示例工程能量模型中的对比方法NYU-DLSP20 第 8 周课程笔记精读能量模型中的对比方法NYU DLSP20 第 8 周课程笔记精读 本文系统梳理 NYU DLSP20NYU Deep Learning Spring 202示例工程上一篇N_m3u8DL-RE3 条命令把流媒体视频存到本地下一篇如何永久保存微信聊天记录WeChatMsg完全指南让珍贵对话永不丢失创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

70B大模型单卡部署:量化压缩与推理优化全攻略

70B大模型单卡部署:量化压缩与推理优化全攻略

先说结论:70B 模型放进单张 A100 80G 跑起来,早就是常规操作;连 RTX 4090 这种 24G 消费卡,通过 4bit 量化加 CPU offload,也能跑出能用的速度。很多人一听“70B”就默认得上多卡集群,其实没必要。这件事的…

2026/10/9 2:08:24 阅读更多 →
select、poll、epoll深度解析:多路IO复用与高并发编程

select、poll、epoll深度解析:多路IO复用与高并发编程

1. 多路IO复用到底解决了什么问题聊到Linux系统编程,很多同学一开始接触的是阻塞式IO:调用read等数据,没数据就挂在那儿,直到内核把数据准备好。这种模型写起来简单,但一遇到要同时处理几十个、几百个连接的服务端场景…

2026/10/9 2:08:24 阅读更多 →
PLC诞生史:从继电器柜到梯形图的工业自动化革命

PLC诞生史:从继电器柜到梯形图的工业自动化革命

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 2:08:24 阅读更多 →

最新新闻

GESP六级动态规划核心:01背包问题从入门到优化

GESP六级动态规划核心:01背包问题从入门到优化

1. 为什么GESP六级绕不开01背包GESP六级的大纲里,动态规划是重头戏,而动态规划的考题里,背包问题出现的频率又出奇地高。我刷过不少往年的六级真题和模拟题,发现一个规律:要么直接考背包模型,要么把背包问题…

2026/10/9 3:35:15 阅读更多 →
Matlab实现PSO优化SVM参数:粒子群替代网格搜索实战

Matlab实现PSO优化SVM参数:粒子群替代网格搜索实战

做了这么多年预测模型,我一直有个很深的体会:算法本身不是瓶颈,参数调不好才是。尤其是支持向量机(SVM),C和gamma这两个参数一旦选得不准,模型精度直接掉一个档次,而常规的网格搜索在…

2026/10/9 3:35:15 阅读更多 →
数据库原子性不是免费午餐:从事务到分布式的一致性代价

数据库原子性不是免费午餐:从事务到分布式的一致性代价

很多刚接触数据库的人,包括我以前刚入行那会儿,看待“atomict”三个字都是带着光环的:BEGIN 执行一串 SQL,COMMIT 收工;中间哪条出错了,ROLLBACK 一切恢复原样。好像数据库天然赠送了这么一项能力&#xff…

2026/10/9 3:35:15 阅读更多 →
ASP+ACCESS房产信息管理系统毕设实战:部署、改造与答辩指南

ASP+ACCESS房产信息管理系统毕设实战:部署、改造与答辩指南

简介:一份面向计算机专业毕业生的ASPACCESS房产信息管理系统完整毕业设计资源,可供正在选题或需要参考实际开发流程的学生使用。系统基于ASP服务器脚本语言与ACCESS小型数据库,实现房产信息的前后端管理,覆盖房源录入、信息查询、…

2026/10/9 3:35:15 阅读更多 →
852页计算机网络技术PPT:文本提取、修复与教学备课全攻略

852页计算机网络技术PPT:文本提取、修复与教学备课全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 3:35:15 阅读更多 →
蓄电池与超级电容混合储能Simulink仿真:能量管理策略与模型搭建

蓄电池与超级电容混合储能Simulink仿真:能量管理策略与模型搭建

做混合储能仿真的朋友,多少都经历过这种场面:负载一开,蓄电池电流瞬间拉满,SOC曲线像过山车,控制器忙得团团转,可效果始终不尽如人意。其实问题往往不在控制器本身,而在能量管理策略没有把"…

2026/10/9 3:34:14 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →