深度學習入門Day8:生成模型革命——從GAN到擴散模型

一、開篇:創造力的算法革命

從昨天的Transformer到今天的生成模型,我們正從"理解"世界邁向"創造"世界。生成對抗網絡(GAN)和擴散模型(Diffusion Model)代表了當前生成式AI的兩大主流范式,它們讓機器能夠生成逼真的圖像、音樂甚至視頻。今天我們將深入這兩種技術的核心原理,并親自動手實現圖像生成的神奇過程。

二、上午攻堅:GAN原理與實戰

2.1 GAN核心架構解析

最小最大博弈公式:
min_G max_D V(D,G) = E_{x~p_data}[log D(x)] + E_{z~p_z}[log(1-D(G(z)))]

DCGAN關鍵實現:
# 生成器網絡
class Generator(nn.Module):
def __init__(self, latent_dim=100):
super().__init__()
self.main = nn.Sequential(
# 輸入: (latent_dim, 1, 1)
nn.ConvTranspose2d(latent_dim, 512, 4, 1, 0, bias=False),
nn.BatchNorm2d(512),
nn.ReLU(True),
# 輸出: (512, 4, 4)
nn.ConvTranspose2d(512, 256, 4, 2, 1, bias=False),
nn.BatchNorm2d(256),
nn.ReLU(True),
# 輸出: (256, 8, 8)
nn.ConvTranspose2d(256, 128, 4, 2, 1, bias=False),
nn.BatchNorm2d(128),
nn.ReLU(True),
# 輸出: (128, 16, 16)
nn.ConvTranspose2d(128, 1, 4, 2, 1, bias=False),
nn.Tanh() ?# 輸出范圍[-1,1]
# 最終輸出: (1, 28, 28)
)

? ? def forward(self, input):
return self.main(input)

# 判別器網絡
class Discriminator(nn.Module):
def __init__(self):
super().__init__()
self.main = nn.Sequential(
# 輸入: (1, 28, 28)
nn.Conv2d(1, 128, 4, 2, 1, bias=False),
nn.LeakyReLU(0.2, inplace=True),
# 輸出: (128, 14, 14)
nn.Conv2d(128, 256, 4, 2, 1, bias=False),
nn.BatchNorm2d(256),
nn.LeakyReLU(0.2, inplace=True),
# 輸出: (256, 7, 7)
nn.Conv2d(256, 512, 4, 2, 1, bias=False),
nn.BatchNorm2d(512),
nn.LeakyReLU(0.2, inplace=True),
# 輸出: (512, 3, 3)
nn.Conv2d(512, 1, 3, 1, 0, bias=False),
nn.Sigmoid() ?# 輸出概率
)

? ? def forward(self, input):
return self.main(input).view(-1)

2.2 GAN訓練技巧與可視化

訓練循環關鍵代碼:
for epoch in range(epochs):
for i, (real_imgs, _) in enumerate(dataloader):

# 訓練判別器
optimizer_D.zero_grad()

# 真實圖像損失
real_loss = criterion(D(real_imgs), real_labels)

# 生成假圖像
z = torch.randn(batch_size, latent_dim, 1, 1)
fake_imgs = G(z)
fake_loss = criterion(D(fake_imgs.detach()), fake_labels)

d_loss = real_loss + fake_loss
d_loss.backward()
optimizer_D.step()

# 訓練生成器
optimizer_G.zero_grad()
g_loss = criterion(D(fake_imgs), real_labels) ?# 騙過判別器
g_loss.backward()
optimizer_G.step()

模式坍塌診斷與解決:
- 現象:生成器只產生少量模式樣本
- 解決方案:
- 使用Wasserstein GAN (WGAN)
- 添加多樣性懲罰項
- 嘗試小批量判別(Minibatch Discrimination)

生成過程可視化:
# 固定潛在向量觀察生成演變
fixed_z = torch.randn(64, latent_dim, 1, 1)
sample_imgs = G(fixed_z).detach()
grid = torchvision.utils.make_grid(sample_imgs, nrow=8)
plt.imshow(grid.permute(1, 2, 0))
plt.show()

三、下午探索:擴散模型原理與實踐

3.1 擴散過程數學描述

前向擴散(加噪):
q(x_t|x_{t-1}) = N(x_t; √(1-β_t)x_{t-1}, β_tI)
其中β_t是噪聲調度

反向去噪(生成):
p_θ(x_{t-1}|x_t) = N(x_{t-1}; μ_θ(x_t,t), Σ_θ(x_t,t))

DDPM簡化訓練目標:
def diffusion_loss(model, x0, t):
# 隨機時間步
t = torch.randint(0, T, (x0.size(0),)

# 計算加噪后的樣本
sqrt_alpha_bar = extract(sqrt_alpha_bar_t, t, x0.shape)
sqrt_one_minus_alpha_bar = extract(sqrt_one_minus_alpha_bar_t, t, x0.shape)
noise = torch.randn_like(x0)
xt = sqrt_alpha_bar * x0 + sqrt_one_minus_alpha_bar * noise

# 預測噪聲
predicted_noise = model(xt, t)

# 計算損失
return F.mse_loss(predicted_noise, noise)

3.2 擴散模型實踐

使用Diffusers庫生成圖像:
from diffusers import DDPMPipeline, DDPMScheduler

# 加載預訓練模型
pipe = DDPMPipeline.from_pretrained("google/ddpm-cifar10-32")

# 生成圖像
image = pipe().images[0]
image.save("generated_image.png")

自定義采樣過程:
def sample_ddpm(model, shape, steps=50):
x = torch.randn(shape)
for t in reversed(range(steps)):
t_tensor = torch.full((shape[0],), t, dtype=torch.long)
with torch.no_grad():
pred_noise = model(x, t_tensor)

alpha_t = alpha[t]
alpha_bar_t = alpha_bar[t]
beta_t = beta[t]

if t > 0:
noise = torch.randn_like(x)
else:
noise = 0

x = (x - (1-alpha_t)/torch.sqrt(1-alpha_bar_t)*pred_noise)/torch.sqrt(alpha_t)
x += torch.sqrt(beta_t) * noise

return x

四、生成模型應用全景

4.1 圖像超分辨率實現

# 使用ESRGAN (Enhanced Super-Resolution GAN)
from basicsr.archs.rrdbnet_arch import RRDBNet
model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64, num_block=23)

4.2 藝術風格遷移

# 基于擴散模型的風格遷移
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
image = pipe("Van Gogh style landscape").images[0]

4.3 醫學圖像合成

# 使用條件GAN生成CT掃描圖像
class MedGAN(nn.Module):
def __init__(self):
super().__init__()
self.encoder = ... ?# 編碼臨床參數
self.generator = ... ?# 生成圖像
self.discriminator = ... ?# 判別真實/生成

五、學習總結與明日計劃

5.1 今日核心成果

? 實現DCGAN并生成MNIST/Fashion-MNIST圖像 ?
? 理解擴散模型的前向/反向過程 ?
? 使用Diffusers庫完成圖像生成 ?
? 探索生成模型在超分辨率等場景的應用 ?

5.2 關鍵問題記錄

? GAN訓練不穩定的根本原因 ?
? 擴散模型采樣加速方法 ?
? 生成結果的評估指標選擇 ?

5.3 明日學習重點

- 圖神經網絡(GNN)基礎概念
- 圖卷積網絡(GCN)實現
- 節點分類與圖分類任務
- 圖注意力網絡(GAT)初探

六、資源推薦與延伸閱讀

1. GAN Zoo:各類GAN變體集合 ?
2. Diffusion Models Beat GANs:擴散模型里程碑論文 ?
3. Stable Diffusion WebUI:最強開源圖像生成工具 ?
4. 生成模型可視化:交互式理解GAN訓練 ?

七、實踐心得與倫理思考

1. 生成模型調試技巧:
- GAN:監控D_loss和G_loss的平衡
- 擴散:可視化中間去噪過程
- 通用:使用固定隨機種子復現問題

2. 倫理邊界警示:
# 人臉生成倫理檢查
if task == "face_generation":
assert has_ethical_approval, "需要倫理審查"
add_watermark(output_image)

3. 實用代碼片段:
# 潛在空間插值
z1 = torch.randn(1, latent_dim)
z2 = torch.randn(1, latent_dim)
for alpha in torch.linspace(0, 1, 10):
z = alpha*z1 + (1-alpha)*z2
generated = G(z)

下篇預告:《Day9:圖神經網絡入門—非歐空間的數據智慧》 ?
將探索社交網絡、分子結構等圖數據的深度學習處理方法!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918510.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918510.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918510.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于WRF-Chem的不同氣溶膠的輻射效應的研究

前言目前我對于氣溶膠輻射效應的理解就是設計敏感性實驗,基礎實驗打開氣溶膠參與輻射開關(aer_ra_feedback),其他的實驗則關閉氣溶膠參與輻射過程開關,也有去掉某些氣溶膠的影響,如黑碳(BC&…

專題:2025人形機器人與服務機器人技術及市場報告|附130+份報告PDF匯總下載

原文鏈接:https://tecdat.cn/?p43583 當特斯拉Optimus在工廠里精準分揀電池,當普渡機器人在酒店完成跨樓層配送,一個萬億級的智能革命正在拉開序幕。服務機器人與人形機器人不再是實驗室里的概念,而是正在重塑制造業、服務業的“…

JS 模塊化與打包工具

一、模塊化體系:ESM vs CJS 深入1.語法與靜態性(1)ESM:靜態語法,可被打包器做 Tree-shakingexport function play() {}export default ...import { play } from ./mod.js(2)CJS:運行時 require() , 分析能力弱,不利于 Tree-shaking2.Node 解析…

防御保護11

帶寬管理 --- 設備對自身的流量進行管理和控制,去提供帶寬保證、帶寬限制等等功能。 帶寬限制 帶寬保證 連接數限制 應用場景 實現帶寬管理 帶寬通道 --- 定義了被管理對象所能使用的帶寬資源 整體的保證帶寬和最大帶寬; SW1-SW2:VLAN 201 --…

[激光原理與應用-254]:理論 - 幾何光學 - 自動對焦的原理

自動對焦(Auto Focus, AF)是現代光學系統(如相機、手機攝像頭、監控設備等)的核心功能之一,其原理是通過檢測成像面的清晰度或測量物體距離,驅動透鏡組移動至最佳對焦位置。以下是自動對焦的詳細原理及技術…

【Python辦公】Mermaid代碼轉圖片工具 - Tkinter GUI版本

目錄 專欄導讀 項目簡介 功能特性 ?? 直觀的圖形界面 ?? 代碼編輯功能 ??? 圖片生成與預覽 ?? 文件操作 ? 性能優化 技術架構 核心技術棧 架構設計 安裝與使用 環境要求 依賴安裝 運行程序 使用步驟 代碼示例 基本流程圖 時序圖 甘特圖 核心代碼解析 1. 主類結構 2. …

【Activiti】要點初探

Activiti 7.0.0配置 流程配置節點流程XML流程部署部署后會操作表:(每部署一次增加一條記錄) ACT_RE_DEPLOYMENT 流程定義部署表 ACT_RE_PROCDEF 流程定義表 ACT_GE_BYTEARRAY 流程啟動查看任務(張三要查看準備辦理任務&#xff0…

VBS 字符串處理

一. 字符串是由Unicode字符組成的一串字符。通常由數字,字母,符號組成。二. 常用函數1. 消除空格 Ltrim: 刪除字符串左側的空格。 Rtrim: 刪除字符串右側的空格。 trim: 刪除字符串左側和右側的空格。a" hello " b"sx"msgbo…

《算法導論》第 21 章-用于不相交集合的數據結構

引言不相交集合(Disjoint Set),也稱為并查集(Union-Find),是一種非常實用的數據結構,主要用于處理一些元素分組的問題。它支持高效的集合合并和元素查找操作,在很多算法中都有重要應…

基于51單片機RFID智能門禁系統紅外人流量計數統計

1 系統功能介紹 本設計基于STC89C52單片機,集成RFID讀卡器、紅外避障傳感器、繼電器、LCD1602液晶顯示和蜂鳴器,實現智能門禁與人流量統計功能。系統能夠識別合法的RFID卡開門,并實時統計通過人數,具有安全報警和直觀顯示功能。具…

c#,vb.net全局多線程鎖,可以在任意模塊或類中使用,但盡量用多個鎖提高效率

Public ReadOnly LockObj As New Object() 全局多線程鎖 VB.NET模塊中的LockObj 可以在任意模塊或類中使用吧 在 VB.NET 中,模塊(Module)中聲明的 Public ReadOnly LockObj 可以被其他模塊或類訪問和使用,但需要注意其可見性范圍…

企業安全運維服務計劃書

安全運維服務計劃書 一、概述 為保障企業信息系統安全、穩定、高效運行,防范各類網絡安全風險,提升整體安全防護能力,特制定本安全運維服務計劃書。本計劃旨在通過系統化、規范化的安全運維流程,全面識別、評估、處置并持續監控企業網絡環境中的安全風險,構建主動防御與…

小杰python高級(four day)——matplotlib庫

1.繪制子圖的方式pyplot中函數subplotFigure類中的函數add_subplotpyplot中函數subplotsfig, ax plt.subplots(nrows1, ncols1, *, sharexFalse, shareyFalse,squeezeTrue, subplot_kwNone, gridspec_kwNone, **fig_kw) 功能:繪制多個子圖,可以一次生成…

C# 編程out 參數需要在函數體內部初始化,然后引用的時候無需初始化

核心規則方法內部必須初始化:在方法體中,必須在方法返回前對 out 參數顯式賦值(未賦值會導致編譯錯誤)調用時無需初始化:調用方傳遞 out 參數前不需要初始化變量(可直接使用未賦值的局部變量)下…

【Redis在數據治理與數據隱私保護策略中的優化】

## Redis的自動補全功能:用戶體驗的無縫之助Redis作為一款高效的開源緩存數據庫,始終在用戶體驗優化方面走在前列。其自動補全功能的引入,為用戶帶來了全新的搜索體驗。這種功能不僅提升了搜索效率,更為用戶提供了更智能化的服務。…

Sklearn 機器學習 異常值檢測 局部異常因子算法LOF

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 Sklearn 機器學習異常值檢測:局部異常因子算法(LOF) 在實際的機器學習任務中,異常…

衡量機器學習模型的指標

為了進一步了解模型的能力,我們需要某個指標來衡量,這就是性能度量的意義。有了一個指標,我們就可以對比不同的模型了,從而知道哪個模型相對好,哪個模型相對差,并通過這個指標來進一步調參以逐步優化我們的…

Day24|學習前端CSS

HTML把一大段雜亂無章的話,調整變成文章格式顏色rgba,16進制CSS選擇器(從上往下,權重越低)類選擇器#(為多個元素設計相同樣式偽類選擇器:和類選擇器.元素選擇器p,div,li通…

初識數據結構——優先級隊列(堆!堆!堆!)

數據結構專欄 ?(click) 今天就讓我們來聊聊這個讓無數程序員又愛又恨的數據結構——堆(Heap)。 一、優先級隊列 vs 普通隊列 特性普通隊列優先級隊列出隊順序FIFO(先進先出)按優先級高低(默認小的先出)底…

嵌入式學習day25

fwrite&#xff1a;fread&#xff1a;fread/fwrite&#xff1a;拷貝圖片&#xff1a;#include <stdio.h>int main(void) {FILE *fsrc NULL;FILE *fdst NULL;char tmpbuff[4096] {0};size_t nret 0;fsrc fopen("src.jpg", "r");if (NULL fsrc){…