国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Diffusion Models擴(kuò)散模型簡單講解與簡單實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了Diffusion Models擴(kuò)散模型簡單講解與簡單實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Diffusion Models

Diffusion Models擴(kuò)散模型簡單講解與簡單實(shí)現(xiàn)

圖中: x 0 x_0 x0?為圖像, z z z為采樣自正態(tài)分布的噪音

擴(kuò)散模型**是受非平衡熱力學(xué)的啟發(fā)。它們定義一個(gè)擴(kuò)散步驟的馬爾可夫鏈,逐漸向數(shù)據(jù)添加隨機(jī)噪聲,然后學(xué)習(xí)逆擴(kuò)散過程,從噪聲中構(gòu)建所需的數(shù)據(jù)樣本。與VAE或流動(dòng)模型不同,擴(kuò)散模型是用固定的程序?qū)W習(xí)的,而且隱變量具有高維度。

訓(xùn)練階段,是在圖片中添加噪聲,給網(wǎng)絡(luò)輸入這一張?zhí)砑釉肼暤膱D片,網(wǎng)絡(luò)需要預(yù)測(cè)的則是添加的噪聲。

使用階段,由隨機(jī)生成的噪聲,使用網(wǎng)絡(luò)預(yù)測(cè)添加了什么噪聲,然后逐步去除噪聲,直到還原。

、

1、擴(kuò)散過程

  • 擴(kuò)散的過程,是不斷地逐步向圖片中添加噪聲,直到圖像完全變?yōu)榧冊(cè)肼暎?/li>
  • 添加的噪聲為高斯噪聲,而后一時(shí)刻都是由前一時(shí)刻的圖像增加噪聲得到的。

添加噪聲的過程:

這里定義了兩個(gè)參數(shù) α t \alpha_t αt?、 β t \beta_t βt?;( t t t的范圍為0~ T T T之間的整數(shù), β t \beta_t βt? β 1 \beta_1 β1?變化到 β T \beta_T βT?,是逐漸變大的,論文中是從0.0001等量的增加 T T T次,直到0.002 )

α t \alpha_t αt? β t \beta_t βt?的關(guān)系為:

α t = 1 ? β t \alpha_t = 1- \beta_t αt?=1?βt? (1)

T T T表示的是,由圖片通過逐步添加噪聲直至完全變?yōu)榧冊(cè)肼暤倪^程所需要經(jīng)歷的次數(shù),也就是圖片需要總計(jì)需要添加噪聲的步數(shù)。而 t t t則代表的是 T T T中具體的某一步。

則給圖像添加噪聲的過程的表達(dá)式可以寫為:

x t = α t x t ? 1 + 1 ? α t z t x_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{1-\alpha_t}z_t xt?=αt? ?xt?1?+1?αt? ?zt? (2)

x t x_t xt?表示的是第 t t t擴(kuò)散步時(shí),添加噪聲后的圖片,而 x t ? 1 x_{t-1} xt?1?是第 t ? 1 t-1 t?1時(shí)刻所獲得的圖片; z t z_t zt?表示的是 t t t時(shí)刻所添加的噪聲,該噪聲采樣自標(biāo)準(zhǔn)正態(tài)分布 N ( 0 , 1 ) N(0,1) N(0,1)

那么可以依照公式(2)依次從原始圖像 x 0 x_0 x0?逐步添加噪聲,擴(kuò)散至 x T x_T xT?

x 1 = α 1 x 0 + 1 ? α 1 z 1 x_1=\sqrt{\alpha_1}x_{0}+\sqrt{1-\alpha_1}z_1 x1?=α1? ?x0?+1?α1? ?z1?

x 2 = α 2 x 1 + 1 ? α 2 z 2 x_2=\sqrt{\alpha_2}x_{1}+\sqrt{1-\alpha_2}z_2 x2?=α2? ?x1?+1?α2? ?z2?

……

x t = α t x t ? 1 + 1 ? α t z t x_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{1-\alpha_t}z_t xt?=αt? ?xt?1?+1?αt? ?zt?

……

x T = α T x T ? 1 + 1 ? α T z T x_T=\sqrt{\alpha_T}x_{T-1}+\sqrt{1-\alpha_T}z_T xT?=αT? ?xT?1?+1?αT? ?zT?

由此可以看出 β t \beta_t βt?逐漸增加,相應(yīng)的 α t \alpha_t αt?逐漸減小, 1 ? α t 1-\alpha_t 1?αt?則是逐漸增大的,也就是說,添加的噪聲是逐步增加的,而原始圖像的比例是逐漸減小的,并且噪聲添加的程度是逐次擴(kuò)大的。

但對(duì)網(wǎng)絡(luò)的訓(xùn)練,數(shù)據(jù)是需要隨機(jī)采樣的,每次采樣到 t t t時(shí)刻的時(shí)候,都從 x 0 x_0 x0?開始遞推則太過于繁瑣。

所以需要一次就計(jì)算出來:

將式 : x t ? 1 = α t ? 1 x t ? 2 + 1 ? α t ? 1 z t ? 1 x_{t-1}=\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_{t-1}}z_{t-1} xt?1?=αt?1? ?xt?2?+1?αt?1? ?zt?1?帶入(2)式中,可得

x t = α t ( α t ? 1 x t ? 2 + 1 ? α t ? 1 z t ? 1 ) + 1 ? α t z t x_t=\sqrt{\alpha_t}(\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_{t-1}}z_{t-1})+\sqrt{1-\alpha_t}z_t xt?=αt? ?(αt?1? ?xt?2?+1?αt?1? ?zt?1?)+1?αt? ?zt?

式子展開為:

x t = α t α t ? 1 x t ? 2 + α t 1 ? α t ? 1 z t ? 1 + 1 ? α t z t x_t=\sqrt{\alpha_t}\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{\alpha_t}\sqrt{1-\alpha_{t-1}}z_{t-1}+\sqrt{1-\alpha_t}z_t xt?=αt? ?αt?1? ?xt?2?+αt? ?1?αt?1? ?zt?1?+1?αt? ?zt?

= α t α t ? 1 x t ? 2 + ( α t ( 1 ? α t ? 1 ) z t ? 1 + 1 ? α t z t ) =\sqrt{\alpha_t}\sqrt{\alpha_{t-1}}x_{t-2}+(\sqrt{\alpha_t (1- \alpha_{t-1})}z_{t-1}+\sqrt{1-\alpha_t}z_t) =αt? ?αt?1? ?xt?2?+(αt?(1?αt?1?) ?zt?1?+1?αt? ?zt?)

其中每次加入的噪聲—— z 1 , z 2 , . . . , z t ? 1 , z t , . . . z T z_1,z_2,...,z_{t-1},z_t,...z_T z1?,z2?,...,zt?1?,zt?,...zT?——都是服從正態(tài)分布 N ( 0 , 1 ) N(0,1) N(0,1)

所以可以將

z t ? 1 z_{t-1} zt?1? z t z_t zt?之間的系數(shù)合并在一起,因?yàn)檎植汲艘砸粋€(gè)系數(shù),只改變方差,而 N ( 0 , σ 1 2 ) + N ( 0 , σ 2 2 ) ~ N ( 0 , σ 1 2 + σ 2 2 ) N(0,\sigma_1^2)+N(0,\sigma_2^2) \sim N(0,\sigma_1^2+\sigma_2^2 ) N(0,σ12?)+N(0,σ22?)N(0,σ12?+σ22?)

所以

x t = α t α t ? 1 x t ? 2 + ( α t ( 1 ? α t ? 1 ) z t ? 1 + 1 ? α t z t ) x_t=\sqrt{\alpha_t}\sqrt{\alpha_{t-1}}x_{t-2}+(\sqrt{\alpha_t (1- \alpha_{t-1})}z_{t-1}+\sqrt{1-\alpha_t}z_t) xt?=αt? ?αt?1? ?xt?2?+(αt?(1?αt?1?) ?zt?1?+1?αt? ?zt?)

= α t α t ? 1 x t ? 2 + ( a t ( 1 ? a t ? 1 ) + 1 ? a t ) z =\sqrt{\alpha_t}\sqrt{\alpha_{t-1}}x_{t-2}+(\sqrt{a_t(1-a_{t-1})+1-a_t})z =αt? ?αt?1? ?xt?2?+(at?(1?at?1?)+1?at? ?)z

= α t α t ? 1 x t ? 2 + ( 1 ? a t a t ? 1 ) z =\sqrt{\alpha_t\alpha_{t-1}}x_{t-2}+(\sqrt{1-a_t a_{t-1}})z =αt?αt?1? ?xt?2?+(1?at?at?1? ?)z

再將 x t ? 2 = α t ? 2 x t ? 3 + 1 ? α t ? 2 z t ? 2 x_{t-2}=\sqrt{\alpha_{t-2}}x_{t-3}+\sqrt{1-\alpha_{t-2}}z_{t-2} xt?2?=αt?2? ?xt?3?+1?αt?2? ?zt?2?帶入上式,循環(huán)往復(fù),將 x 1 x_1 x1?帶入,可得

x t = α t α t ? 1 . . . α 2 α 1 x t ? 1 + ( 1 ? α t α t ? 1 . . . α 2 α 1 ) z x_t=\sqrt{\alpha_t\alpha_{t-1}...\alpha_2 \alpha_1}x_{t-1}+(\sqrt{1-\alpha_t\alpha_{t-1}...\alpha_2 \alpha_1})z xt?=αt?αt?1?...α2?α1? ?xt?1?+(1?αt?αt?1?...α2?α1? ?)z

= α t  ̄ x 0 + ( 1 ? a t  ̄ ) z =\sqrt{\overline{\alpha_t}}x_{0}+(\sqrt{1-\overline{a_t}})z =αt?? ?x0?+(1?at?? ?)z (3)

其中 α t  ̄ \overline{\alpha_t} αt??表示從 α 1 \alpha_1 α1? α t \alpha_t αt?的連乘

、

2、訓(xùn)練過程

因此,擴(kuò)散模型的訓(xùn)練過程如下:

Diffusion Models擴(kuò)散模型簡單講解與簡單實(shí)現(xiàn)

  1. 從數(shù)據(jù)集中隨機(jī)抽選一張圖片,
  2. 隨機(jī)從1~T中抽取一個(gè)擴(kuò)散步,
  3. 按照式(3)計(jì)算得到 x t x_t xt?,
  4. 輸入網(wǎng)絡(luò),得到輸出,輸出同添加的噪聲做損失,更新梯度,
  5. 反復(fù)訓(xùn)練,直至滿意。

詳細(xì)訓(xùn)練過程的代碼過程如下:

for i, (x_0) in enumerate(tqdm_data_loader):  # 由數(shù)據(jù)加載器加載數(shù)據(jù),
	x_0 = x_0.to(device)  # 將數(shù)據(jù)加載至相應(yīng)的運(yùn)行設(shè)備(device)
    t = torch.randint(1, T, size=(x_0.shape[0],), device=device)  # 對(duì)每一張圖片隨機(jī)在1~T的擴(kuò)散步中進(jìn)行采樣
    sqrt_alpha_t_bar = torch.gather(sqrt_alphas_bar, dim=0, index=t).reshape(-1, 1, 1, 1)  # 取得不同t下的 根號(hào)下alpha_t的連乘
    """取得不同t下的 根號(hào)下的一減alpha_t的連乘"""
    sqrt_one_minus_alpha_t_bar = torch.gather(sqrt_one_minus_alphas_bar, dim=0, index=t).reshape(-1, 1, 1, 1)
    noise = torch.randn_like(x_0).to(device)  # 從標(biāo)準(zhǔn)正態(tài)分布中采樣得到z
    x_t = sqrt_alpha_t_bar * x_0 + sqrt_one_minus_alpha_t_bar * noise  # 計(jì)算x_t
    out = net_model(x_t, t)  # 將x_t輸入模型,得到輸出
    loss = loss_function(out, noise) # 將模型的輸出,同添加的噪聲做損失
    optimizer.zero_grad()  # 優(yōu)化器的梯度清零
    loss.backward()  # 由損失反向求導(dǎo)
    optimizer.step()  # 優(yōu)化器更新參數(shù)

、

3、正向使用過程

使用過程是從 x T x_T xT?一步一步取出噪聲,推測(cè)出 x 0 x_0 x0?

也就是說,需要在已知 x T x_T xT?的情況下,先反推 x t ? 1 x_{t-1} xt?1?,然后推 x t ? 2 x_{t-2} xt?2?……最終推測(cè)得到 x 0 x_0 x0?

根據(jù)貝葉斯公式推導(dǎo)為:
x t ? 1 = 1 α t ( x t ? 1 ? α t 1 ? α t  ̄ M ( x t , t ) ) + β t z x_{t-1}=\frac{1}{\sqrt{\alpha_t}}(x_t-\frac{1-\alpha_t}{\sqrt{1-\overline{\alpha_t}}}M(x_t, t))+\sqrt{\beta_t}z xt?1?=αt? ?1?(xt??1?αt?? ?1?αt??M(xt?,t))+βt? ?z
則整個(gè)算法為:

Diffusion Models擴(kuò)散模型簡單講解與簡單實(shí)現(xiàn)

  1. x T x_T xT?隨機(jī)采樣自標(biāo)準(zhǔn)正態(tài)分布;
  2. 從T到1開始循環(huán),
  3. 按照上述公式計(jì)算 x t ? 1 x_{t-1} xt?1?,依次往復(fù),其中 M ( x t , t ) M(x_t, t) M(xt?,t)為網(wǎng)絡(luò)模型,輸入的是 x t x_t xt?步的結(jié)果和第t步,因?yàn)槟P鸵獙?duì)每一步的位置進(jìn)行編碼, z z z取樣至標(biāo)準(zhǔn)正態(tài)分布,在t為最后一步的時(shí)候,z取零

具體代碼如下:

for t_step in reversed(range(T)):  # 從T開始向零迭代
    t = t_step
    t = torch.tensor(t).to(device)

    z = torch.randn_like(x_t,device=device) if t_step > 0 else 0  # 如果t大于零,則采樣自標(biāo)準(zhǔn)正態(tài)分布,否則為零
    """按照公式計(jì)算x_{t-1}"""
    x_t_minus_one = torch.sqrt(1/alphas[t])*(x_t-(1-alphas[t])*model(x_t, t.reshape(1,))/torch.sqrt(1-alphas_bar[t]))+torch.sqrt(betas[t])*z
    
    x_t = x_t_minus_one

4、結(jié)果

因?yàn)樵O(shè)備有限,訓(xùn)練網(wǎng)紅人臉數(shù)據(jù),測(cè)試時(shí)網(wǎng)絡(luò)生成的結(jié)果如下:這是在一張3080ti上訓(xùn)練得到的結(jié)果

Diffusion Models擴(kuò)散模型簡單講解與簡單實(shí)現(xiàn)

、

5、網(wǎng)絡(luò)模型

模型使用UNet,并具有第t擴(kuò)散步的位置編碼信息。

、

6、其他

github:https://github.com/HibikiJie/Diffusion-Models

權(quán)重
鏈接:https://pan.baidu.com/s/19PuZr6duixJaSU1kvmn8Vg
碼:yhR9文章來源地址http://www.zghlxwxcb.cn/news/detail-401105.html

到了這里,關(guān)于Diffusion Models擴(kuò)散模型簡單講解與簡單實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 擴(kuò)散模型相關(guān)論文閱讀,擴(kuò)散模型和知識(shí)蒸餾的結(jié)合提升預(yù)測(cè)速度:Progressive Distillation for Fast Sampling of Diffusion Models

    擴(kuò)散模型相關(guān)論文閱讀,擴(kuò)散模型和知識(shí)蒸餾的結(jié)合提升預(yù)測(cè)速度:Progressive Distillation for Fast Sampling of Diffusion Models

    谷歌research的成果,ICLR 2022 https://arxiv.org/abs/2202.00512 tenserflow官方開源代碼: https://github.com/google-research/google-research/tree/master/diffusion_distillation pytorch非官方代碼:https://github.com/lucidrains/imagen-pytorch 1.擴(kuò)散模型雖然取得了很好的效果,但是預(yù)測(cè)速度慢。 2.作者提出了一種逐步蒸餾

    2024年02月16日
    瀏覽(20)
  • High-Resolution Image Synthesis with Latent Diffusion Models 穩(wěn)定擴(kuò)散模型論文筆記

    High-Resolution Image Synthesis with Latent Diffusion Models 穩(wěn)定擴(kuò)散模型論文筆記

    一、研究現(xiàn)狀 ? ? ? ?早期圖像生成方法主要是變分自動(dòng)編碼器(Variational Autoencoders, VAEs),該算法利用編碼器和解碼器以及變分推斷的方法學(xué)習(xí)隱空間到真實(shí)圖像空間的映射從而完成圖像的生成。其優(yōu)勢(shì)是特征空間可遷移并且訓(xùn)練較為穩(wěn)定,但是不容易進(jìn)行模型評(píng)估,當(dāng)輸入

    2024年02月20日
    瀏覽(26)
  • 【深度學(xué)習(xí)模型】擴(kuò)散模型(Diffusion Model)基本原理及代碼講解

    【深度學(xué)習(xí)模型】擴(kuò)散模型(Diffusion Model)基本原理及代碼講解

    生成式建模的擴(kuò)散思想實(shí)際上已經(jīng)在2015年(Sohl-Dickstein等人)提出,然而,直到2019年斯坦福大學(xué)(Song等人)、2020年Google Brain(Ho等人)才改進(jìn)了這個(gè)方法,從此引發(fā)了生成式模型的新潮流。目前,包括OpenAI的GLIDE和DALL-E 2,海德堡大學(xué)的Latent Diffusion和Google Brain的ImageGen,都基

    2023年04月22日
    瀏覽(22)
  • 2022圖像翻譯/擴(kuò)散模型:UNIT-DDPM: UNpaired Image Translation with Denoising Diffusion Probabilistic Models

    2022圖像翻譯/擴(kuò)散模型:UNIT-DDPM: UNpaired Image Translation with Denoising Diffusion Probabilistic Models

    我們提出了一種新的無配對(duì)圖像間翻譯方法,該方法使用去噪擴(kuò)散概率模型而不需要對(duì)抗訓(xùn)練。我們的方法,UNpaired Image Translation with Denoising Diffusion Probabilistic Models(UNIT-DDPM),訓(xùn)練一個(gè)生成模型,通過最小化另一個(gè)域條件下的去噪分?jǐn)?shù)匹配目標(biāo),推斷圖像在兩個(gè)域上的聯(lián)合分

    2023年04月18日
    瀏覽(20)
  • Stable Diffusion生成式擴(kuò)散模型代碼實(shí)現(xiàn)原理

    Stable Diffusion可以使用PyTorch或TensorFlow等深度學(xué)習(xí)框架來實(shí)現(xiàn)。這些框架提供了一系列的工具和函數(shù),使得開發(fā)者可以更方便地構(gòu)建、訓(xùn)練和部署深度學(xué)習(xí)模型。因此可以使用PyTorch或TensorFlow來實(shí)現(xiàn)Stable Diffusion模型。 安裝PyTorch:確保您已經(jīng)安裝了PyTorch,并具備基本的PyTorch使用

    2024年03月13日
    瀏覽(34)
  • Consistency Models終結(jié)擴(kuò)散模型

    最近看到一篇論文,覺得特別有意思,并且在學(xué)術(shù)界引起了不小的動(dòng)靜,他就是一致性模型,據(jù)說圖像生成效果快、質(zhì)量高,并且還可以實(shí)現(xiàn)零樣本圖像編輯,即不進(jìn)行一些視覺任務(wù)訓(xùn)練,可以實(shí)現(xiàn)圖像超分、修復(fù)、上色等功能。 目前代碼已經(jīng)開源到GitHub上面:https://github

    2023年04月26日
    瀏覽(18)
  • 擴(kuò)散模型diffusion model用于圖像恢復(fù)任務(wù)詳細(xì)原理 (去雨,去霧等皆可),附實(shí)現(xiàn)代碼

    擴(kuò)散模型diffusion model用于圖像恢復(fù)任務(wù)詳細(xì)原理 (去雨,去霧等皆可),附實(shí)現(xiàn)代碼

    話不多說,先上代碼: 擴(kuò)散模型diffusion model用于圖像恢復(fù)完整可運(yùn)行代碼,附詳細(xì)實(shí)驗(yàn)操作流程 令外一篇簡化超分?jǐn)U散模型SR3來實(shí)現(xiàn)圖像恢復(fù)的博客見: 超分?jǐn)U散模型 SR3 可以做圖像去雨、去霧等恢復(fù)任務(wù)嗎? 1. 去噪擴(kuò)散概率模型 擴(kuò)散模型是一類生成模型, 和生成對(duì)抗網(wǎng)絡(luò)

    2024年02月03日
    瀏覽(26)
  • 番外篇Diffusion&Stable Diffusion擴(kuò)散模型與穩(wěn)定擴(kuò)散模型

    番外篇Diffusion&Stable Diffusion擴(kuò)散模型與穩(wěn)定擴(kuò)散模型

    本篇文章為閱讀筆記,,主要內(nèi)容圍繞擴(kuò)散模型和穩(wěn)定擴(kuò)散模型展開,介紹了kl loss、vae模型的損失函數(shù)以及變分下限作為擴(kuò)展部分。擴(kuò)散模型是一種生成模型,定義了一個(gè)逐漸擴(kuò)散的馬爾科夫鏈,逐漸項(xiàng)數(shù)據(jù)添加噪聲,然后學(xué)習(xí)逆擴(kuò)散過程,從噪聲中構(gòu)建所需的數(shù)據(jù)樣本。穩(wěn)

    2024年02月03日
    瀏覽(27)
  • 擴(kuò)散模型 - Stable Diffusion

    擴(kuò)散模型 - Stable Diffusion

    ? Stable Diffusion 是由 Stability AI 開發(fā)的 開源 擴(kuò)散模型。Stable Diffusion 可以完成多模態(tài)任務(wù),包括:文字生成圖像(text2img)、圖像生成圖像(img2img)等。 4.1 Stable Diffusion 的組成部分 ? Stable Diffusion 由兩部分 組成 : 文本編碼器:提取文本 prompt 的信息 圖像生成器:根據(jù)文本

    2024年02月11日
    瀏覽(24)
  • [學(xué)習(xí)筆記] 擴(kuò)散模型 Diffusion

    [學(xué)習(xí)筆記] 擴(kuò)散模型 Diffusion

    機(jī)器學(xué)習(xí)是人工智能的一種,它是一種通過利用數(shù)據(jù),訓(xùn)練出模型,然后使用模型預(yù)測(cè)的一種方法。 機(jī)器學(xué)習(xí)分為監(jiān)督學(xué)習(xí)、無監(jiān)督學(xué)習(xí)和強(qiáng)化學(xué)習(xí),這是根據(jù)數(shù)據(jù)訓(xùn)練方式分類的,通俗來說,監(jiān)督學(xué)習(xí)是基于已知結(jié)果的數(shù)據(jù)集進(jìn)行訓(xùn)練,而無監(jiān)督學(xué)習(xí)的數(shù)據(jù)集沒有明確的已

    2024年02月12日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包