欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample?Dropout方式

 更新時間:2024年02月20日 09:42:38   作者:JOYCE_Leo16  
這篇文章主要介紹了PyTorch使用Tricks:Dropout,R-Dropout和Multi-Sample?Dropout方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1、為什么使用Dropout?

Dropout是一種在神經(jīng)網(wǎng)絡(luò)訓(xùn)練過程中用于防止過擬合的技術(shù)。在訓(xùn)練過程中,Dropout會隨機(jī)地關(guān)閉一部分神經(jīng)元,這樣可以使模型更加健壯,不會過度依賴于任何一個特定的神經(jīng)元,從而提高模型的泛化能力。下面是一些使用技巧:

技巧1:在輸入層和隱藏層上使用Dropout。這個技巧是基于Dropout的兩個作用,即增加網(wǎng)絡(luò)的多樣性和增加數(shù)據(jù)的多樣性。在輸入層上使用Dropout,相當(dāng)于對數(shù)據(jù)進(jìn)行噪聲注入,可以提高數(shù)據(jù)的魯棒性,防止網(wǎng)絡(luò)對數(shù)據(jù)的細(xì)節(jié)過度敏感。在隱藏層上使用Dropout,相當(dāng)于對網(wǎng)絡(luò)進(jìn)行子采樣,可以提高網(wǎng)絡(luò)的泛化能力,防止網(wǎng)絡(luò)對特定的特征過度依賴。在網(wǎng)絡(luò)的每一層都使用Dropout,可以進(jìn)一步增強(qiáng)這兩個作用,但也要注意不要過度使用,導(dǎo)致網(wǎng)絡(luò)的訓(xùn)練不充分。

技巧2:網(wǎng)絡(luò)中的Dropout率為0.2~0.5。這個技巧是基于經(jīng)驗的建議,一般來說,Dropout率太低會導(dǎo)致Dropout的效果不明顯,Dropout率太高會導(dǎo)致網(wǎng)絡(luò)的訓(xùn)練不充分。不過,這個技巧也不是絕對的,有些研究發(fā)現(xiàn),Dropout率可以超過0.5,甚至接近1,仍然可以取得很好的效果。這可能取決于網(wǎng)絡(luò)的復(fù)雜度,數(shù)據(jù)的規(guī)模,以及其他的正則化方法。

技巧3:在較大的網(wǎng)絡(luò)上使用Dropout。這個技巧是基于Dropout的本質(zhì),即通過隨機(jī)地刪除網(wǎng)絡(luò)中的一些連接,來防止網(wǎng)絡(luò)的過擬合。在較大的網(wǎng)絡(luò)上,過擬合的風(fēng)險更高,因此Dropout的作用更明顯。不過,這并不意味著在較小的網(wǎng)絡(luò)上使用Dropout就沒有意義,只是效果可能不如在較大的網(wǎng)絡(luò)上顯著。

技巧4:使用較高的學(xué)習(xí)率,使用學(xué)習(xí)率衰減和設(shè)置較大的動量值。這個技巧是基于Dropout的另一個作用,即增加網(wǎng)絡(luò)的穩(wěn)定性。由于Dropout會隨機(jī)地改變網(wǎng)絡(luò)的結(jié)構(gòu),導(dǎo)致網(wǎng)絡(luò)的輸出有較大的方差,因此需要使用較高的學(xué)習(xí)率,來加快網(wǎng)絡(luò)的收斂速度。同時,使用學(xué)習(xí)率衰減,可以在網(wǎng)絡(luò)接近最優(yōu)解時,減小學(xué)習(xí)率,避免網(wǎng)絡(luò)的震蕩。另外,使用較大的動量值,可以增加網(wǎng)絡(luò)的慣性,抵抗Dropout帶來的擾動,保持網(wǎng)絡(luò)的方向。這個技巧的具體參數(shù),需要根據(jù)網(wǎng)絡(luò)的結(jié)構(gòu)和數(shù)據(jù)的特點(diǎn)進(jìn)行調(diào)節(jié)。

技巧5:限制網(wǎng)絡(luò)權(quán)重的大小,使用最大范數(shù)正則化。這個技巧是基于Dropout的一個局限,即Dropout不能完全防止網(wǎng)絡(luò)的過擬合。尤其是使用較高的學(xué)習(xí)率時,網(wǎng)絡(luò)的權(quán)重可能會變得非常大,導(dǎo)致網(wǎng)絡(luò)的輸出過于敏感,降低網(wǎng)絡(luò)的泛化能力。因此,需要對網(wǎng)絡(luò)的權(quán)重進(jìn)行約束,限制其大小,防止網(wǎng)絡(luò)的過擬合。最大范數(shù)正則化是一種常用的方法,它可以限制網(wǎng)絡(luò)的權(quán)重的范數(shù)不超過一個給定的閾值,從而控制網(wǎng)絡(luò)的復(fù)雜度。

下面是一個例子:

import torch
import torch.nn as nn
 
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.layer1 = nn.Linear(10, 20)
        self.layer2 = nn.Linear(20, 20)
        self.layer3 = nn.Linear(20, 4)
        self.dropout = nn.Dropout(p=0.5)
 
    def forward(self, x):
        x = F.relu(self.layer1(x))
        x = self.dropout(x)
        x = F.relu(self.layer2(x))
        x = self.dropout(x)
        return self.layer3(x)

2、Dropout的拓展1:R-Dropout

核心思想:R-Dropout的核心思想是在訓(xùn)練過程中通過正則化手段減少模型在同一輸入數(shù)據(jù)上兩次前向傳播(每次都應(yīng)用Dropout)結(jié)果之間的差異。這種方法強(qiáng)制模型在面對輸入數(shù)據(jù)的不同“視角”(即,不同的Dropout掩碼)時,學(xué)習(xí)到更一致的表示。通過這種方式,R-Dropout鼓勵模型捕獲更穩(wěn)健的特征,從而提高模型的泛化能力。

實(shí)現(xiàn)方式:實(shí)現(xiàn)R-Dropout時,通常會對同一批數(shù)據(jù)進(jìn)行兩次獨(dú)立的前向傳播,每次前向傳播都應(yīng)用不同的Dropout模式。然后,通過比較這兩次前向傳播的結(jié)果(例如,使用KL散度作為兩個分布之間差異的度量),將這種差異作為額外的正則化損失添加到總損失中。

下面是一個簡單的例子,展示了如何在一個簡單的全連接神經(jīng)網(wǎng)絡(luò)中實(shí)現(xiàn)R-Dropout。

使用KL散度作為前兩次前向傳播結(jié)果之間差異的度量,并將其添加到原始損失中。

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
 
class RDropoutNN(nn.Module):
    def __init__(self):
        super(RDropoutNN, self).__init__()
        self.fc1 = nn.Linear(784, 256)
        self.dropout = nn.Dropout(0.5)
        self.fc2 = nn.Linear(256, 10)
 
    def forward(self, x, with_dropout=True):
        x = F.relu(self.fc1(x))
        if with_dropout:
            x = self.dropout(x)
        x = self.fc2(x)
        return x
 
def compute_kl_loss(p, q):
    p_log_q = F.kl_div(F.log_softmax(p, dim=1), F.softmax(q, dim=1), reduction='sum')
    q_log_p = F.kl_div(F.log_softmax(q, dim=1), F.softmax(p, dim=1), reduction='sum')
    return (p_log_q + q_log_p) / 2
 
# 假設(shè)
model = RDropoutNN()
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()
 
# 假設(shè)有一個數(shù)據(jù)加載器
# for inputs, labels in data_loader:
    # 模擬數(shù)據(jù)
inputs = torch.randn(64, 784)  # 假設(shè)的輸入
labels = torch.randint(0, 10, (64,))  # 假設(shè)的標(biāo)簽
 
# 清零梯度
optimizer.zero_grad()
 
# 兩次前向傳播,每次都使用Dropout
outputs1 = model(inputs, with_dropout=True)
outputs2 = model(inputs, with_dropout=True)
 
# 計算原始損失
loss1 = criterion(outputs1, labels)
loss2 = criterion(outputs2, labels)
original_loss = (loss1 + loss2) / 2
 
# 計算R-Dropout正則化項
kl_loss = compute_kl_loss(outputs1, outputs2)
 
# 最終損失
lambda_kl = 0.5  # R-Dropout正則化項的權(quán)重
total_loss = original_loss + lambda_kl * kl_loss
 
# 反向傳播和優(yōu)化
total_loss.backward()
optimizer.step()

在這個例子中,對相同的輸入執(zhí)行兩次前向傳播,每次都應(yīng)用Dropout。然后,分別計算這兩個輸出對應(yīng)的交叉熵?fù)p失,并將它們的平均值作為原始損失。接著,使用KL散度計算兩次輸出之間的差異作為R-Dropout的正則化項,并將其加到原始損失中以得到最終的損失。最后,通過反向傳播更新模型的權(quán)重。

通過引入R-Dropout正則化項,鼓勵模型生成更一致的輸出,即使在應(yīng)用不同的Dropout掩碼時也是如此。這有助于提高模型的泛化能力,并進(jìn)一步減少過擬合的風(fēng)險。

3、Dropout的拓展2:Multi-Sample Dropout

核心思想:Multi-Sample Dropout的核心思想是在單次前向傳播過程中對同一輸入應(yīng)用多次Dropout,產(chǎn)生多個不同的掩碼,并對結(jié)果進(jìn)行聚合(例如,通過取平均化)。這種方法的目的是在每次訓(xùn)練迭代中更充分地利用Dropout,以實(shí)現(xiàn)更快的收斂和更好的泛化。

實(shí)現(xiàn)方式:在實(shí)現(xiàn)Multi-Sample Dropout時,會在模型的關(guān)鍵層中并行引入多個Dropout層,每個Dropout層對輸入數(shù)據(jù)應(yīng)用不同的隨機(jī)掩碼。然后,將這些Dropout層的輸出以某種方式(通常是平均)合并,以產(chǎn)生最終的輸出。這種方法運(yùn)行模型在每次迭代中考慮多種“丟棄模式”,從而增加了訓(xùn)練的魯棒性。

以下是一個使用Multi-Sample Dropout的例子:

class MultiSampleDropout(nn.Module):
    def __init__(self, dropout_rate, num_samples):
        super(MultiSampleDropout, self).__init__()
        self.dropout_rate = dropout_rate
        self.num_samples = num_samples
 
    def forward(self, x):
        outputs = []
        for _ in range(self.num_samples):
            output = F.dropout(x, self.dropout_rate, training=self.training)
            outputs.append(output)
        return torch.mean(torch.stack(outputs), dim=0)

在每次前向傳播過程中對輸入進(jìn)行多次采樣,然后將這些采樣的結(jié)果合并,從而得到最終的輸出。

以上兩種拓展的區(qū)別:

  • 目標(biāo)不同:R-Dropout側(cè)重于通過減少同一輸入在不同Dropout模式下的輸出差異來提高輸出的一致性,而Multi-Sample Dropout側(cè)重于在單次迭代中探索多種Dropout模式,以加速訓(xùn)練并提高泛化。
  • 實(shí)現(xiàn)機(jī)制不同:R-Dropout通過對同一批數(shù)據(jù)進(jìn)行兩次前向傳播并計算正則化損失來實(shí)現(xiàn),而Multi-Sample Dropout在單詞前向傳播中應(yīng)用多個Dropout掩碼并聚合結(jié)果。
  • 正則化方法不同:R-Dropout引入了一個基于兩次前向傳播結(jié)果差異的額外正則化項,Multi-Sample Dropout則通過聚合多個Dropout樣本的結(jié)果來提高泛化能力,不需要額外的正則化項。

4、Dropout的拓展3:DropConnect

Dropout通過隨機(jī)將神經(jīng)元的激活輸出置為零來工作,而DropConnect則是隨機(jī)將網(wǎng)絡(luò)的權(quán)重置為零。這意味著在DropConnect中,網(wǎng)絡(luò)的連接(即權(quán)重)部分被隨機(jī)“丟棄”,而不是輸出。這種方法可以視為Dropout的一種泛化形式,并且理論上可以提供更強(qiáng)的正則化效果,因為它直接操作模型的權(quán)重。

DropConnect的工作原理:在每次訓(xùn)練迭代中,DropConnect隨機(jī)選擇一部分權(quán)重,并將這些權(quán)重暫時設(shè)置為0。這個過程減少了模型的容量,迫使網(wǎng)絡(luò)在缺少一部分連接的情況下學(xué)習(xí),從而有助于防止過擬合。與Dropout不同,DropoutConnect不是丟棄神經(jīng)元的輸出,而是直接在網(wǎng)絡(luò)的權(quán)重上施加約束。

DropConnect的實(shí)現(xiàn):在PyTorch中實(shí)現(xiàn)DropConnect相對簡單,但需要自定義網(wǎng)絡(luò)層,因為PyTorch的標(biāo)準(zhǔn)層不直接支持這種操作。下面是一個簡單的示例,展示了如何實(shí)現(xiàn)一個具有DropConnect功能的全連接層:

import torch
import torch.nn as nn
import torch.nn.functional as F
 
class DropConnect(nn.Module):
    def __init__(self, input_dim, output_dim, drop_prob=0.5):
        super(DropConnect, self).__init__()
        self.drop_prob = drop_prob
        self.weight = nn.Parameter(torch.randn(input_dim, output_dim))
        self.bias = nn.Parameter(torch.randn(output_dim))
    
    def forward(self, x):
        if self.training:
            # 生成與權(quán)重相同形狀的掩碼
            mask = torch.rand(self.weight.size()) > self.drop_prob
            # 應(yīng)用DropConnect:用掩碼乘以權(quán)重
            drop_weight = self.weight * mask.float().to(self.weight.device)
        else:
            # 在測試時不應(yīng)用DropConnect,但要調(diào)整權(quán)重以反映丟棄率
            drop_weight = self.weight * (1 - self.drop_prob)
        
        return F.linear(x, drop_weight, self.bias)
 
# 使用DropConnect層的示例網(wǎng)絡(luò)
class ExampleNet(nn.Module):
    def __init__(self):
        super(ExampleNet, self).__init__()
        self.dropconnect_layer = DropConnect(20, 10, drop_prob=0.5)
        self.fc2 = nn.Linear(10, 2)
    
    def forward(self, x):
        x = F.relu(self.dropconnect_layer(x))
        x = self.fc2(x)
        return x
 
# 示例使用
model = ExampleNet()
input = torch.randn(5, 20)  # 假設(shè)的輸入
output = model(input)
print(output)

在這個例子中,DropConnect類定義了一個自定義的全連接層,其中包含了DropConnect功能。在每次前向傳播時,如果模型處于訓(xùn)練模式,它會隨機(jī)生成一個與權(quán)重相同形狀的掩碼,并用這個掩碼乘以權(quán)重,從而實(shí)現(xiàn)DropConnect效果。在評估模式下,為了保持輸出的期望值不變,權(quán)重會被調(diào)整,以反映在訓(xùn)練時的平均丟棄率。

這種自定義層可以被嵌入到更復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)中,以提供DropConnect正則化的效果,從而幫助減少過擬合并提高模型的泛化能力。

5、Dropout的拓展4:Standout

Standout是一種自適應(yīng)的正則化方法,類似于Dropout和DropConnect,但它通過依賴于網(wǎng)絡(luò)的激活來動態(tài)調(diào)整每個神經(jīng)元被丟棄的概率。

這種方法的核心思想是利用神經(jīng)網(wǎng)絡(luò)內(nèi)部的狀態(tài)來決定哪些神經(jīng)元更可能被保留,從而使正則化過程更加依賴于模型當(dāng)前的行為。

這種自適應(yīng)性使Standout能夠在不同的訓(xùn)練階段和不同的數(shù)據(jù)點(diǎn)上實(shí)現(xiàn)個性化的正則化強(qiáng)度。

Standout的工作原理:Standout通過一個額外的網(wǎng)絡(luò)或?qū)觼碛嬎忝總€神經(jīng)元的保留概率。這個保留概率不是固定不變的,而是根據(jù)網(wǎng)絡(luò)當(dāng)前的激活動態(tài)調(diào)整的。具體來說,對于每個神經(jīng)元,其保留概率是其激活的函數(shù),這意味著網(wǎng)絡(luò)在訓(xùn)練過程中自動學(xué)習(xí)每個神經(jīng)元的重要性,并據(jù)此調(diào)整其被丟棄的概率。

Standout是數(shù)學(xué)表達(dá)式如下:

p_i = \frac{1}{1 + \exp(-s_i)}

其中p_i是第i個神經(jīng)元被丟棄的概率,是一個仿射函數(shù),可以表示為:

其中ab是超參數(shù),w_i是第i個神經(jīng)元的權(quán)重。可以看出,權(quán)重越大,丟棄概率越大。

Standout的PyTorch實(shí)現(xiàn):在PyTorch中實(shí)現(xiàn)Standout需要自定義一個層,這個層能夠根據(jù)輸入激活動態(tài)計算每個神經(jīng)元的丟棄概率。

以下是一個簡化的示例,說明如何實(shí)現(xiàn)這樣的層:

import torch
import torch.nn as nn
 
class Standout(nn.Module):
    def __init__(self, input_dim, output_dim):
        super(Standout, self).__init__()
        self.fc = nn.Linear(input_dim, output_dim)
        # 使用一個簡單的全連接層來生成保留概率
        self.prob_fc = nn.Linear(input_dim, output_dim)
    
    def forward(self, x):
        # 計算正常的前向傳播
        x_out = self.fc(x)
        
        if self.training:
            # 計算每個神經(jīng)元的保留概率
            probs = torch.sigmoid(self.prob_fc(x))
            # 生成與激活大小相同的二值掩碼
            mask = torch.bernoulli(probs).to(x.device)
            # 應(yīng)用mask
            x_out = x_out * mask
        # 注意:在評估模式下不應(yīng)用Standout
        
        return x_out

在這個實(shí)現(xiàn)中,self.prob_fc 層輸出的是每個神經(jīng)元的保留概率,而不是丟棄概率,這些概率通過Sigmoid 函數(shù)進(jìn)行了歸一化。接著,使用這些概率生成一個二值掩碼,該掩碼通過伯努利采樣得到,最后將這個掩碼應(yīng)用到 self.fc 層的輸出上,以實(shí)現(xiàn)神經(jīng)元的隨機(jī)保留。

需要注意的是,由于Standout的自適應(yīng)性,它的行為會比傳統(tǒng)的Dropout或DropConnect更復(fù)雜,可能需要更細(xì)致的調(diào)參和監(jiān)控以確保訓(xùn)練穩(wěn)定性和模型性能。

6、Dropout的拓展5:Gaussian Dropout

Gaussian Dropout 是一種正則化技術(shù),它在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時通過引入服從高斯分布的隨機(jī)噪聲來防止過擬合。

不同于傳統(tǒng) Dropout 以固定概率將激活置零,Gaussian Dropout 乘以一個隨機(jī)變量 ( m ),其中 ( m ) 服從高斯分布 ( N(1, \sigma^2) )。

PyTorch 示例:

import torch
import torch.nn as nn
 
class GaussianDropout(nn.Module):
    def __init__(self, sigma=0.1):
        super(GaussianDropout, self).__init__()
        self.sigma = sigma
 
    def forward(self, x):
        if self.training:
            # 生成服從高斯分布 N(1, sigma^2) 的隨機(jī)變量
            gaussian_noise = torch.normal(1.0, self.sigma, size=x.size()).to(x.device)
            # 應(yīng)用高斯 dropout
            return x * gaussian_noise
        else:
            # 測試階段不使用 dropout
            return x
 
# 使用示例
layer = GaussianDropout(sigma=0.1)
input_tensor = torch.randn(10, 20)  # 假設(shè)的輸入
output = layer(input_tensor)

在訓(xùn)練階段,forward 方法生成高斯噪聲并應(yīng)用于輸入 x,而在測試階段直接返回 x,不應(yīng)用噪聲。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python+mysql實(shí)現(xiàn)簡單的web程序

    python+mysql實(shí)現(xiàn)簡單的web程序

    上篇文章我們介紹了簡單的Python web程序,實(shí)現(xiàn)hello world,本文我們來結(jié)合一下mysql,實(shí)現(xiàn)對數(shù)據(jù)庫的簡單操作,希望對大家有所幫助
    2014-09-09
  • pytorch?實(shí)現(xiàn)情感分類問題小結(jié)

    pytorch?實(shí)現(xiàn)情感分類問題小結(jié)

    本文主要介紹了pytorch?實(shí)現(xiàn)情感分類問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python機(jī)器學(xué)習(xí)Logistic回歸原理推導(dǎo)

    python機(jī)器學(xué)習(xí)Logistic回歸原理推導(dǎo)

    這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)Logistic回歸原理推導(dǎo),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • pyQT5 實(shí)現(xiàn)窗體之間傳值的示例

    pyQT5 實(shí)現(xiàn)窗體之間傳值的示例

    今天小編就為大家分享一篇pyQT5 實(shí)現(xiàn)窗體之間傳值的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python通用日志使用小結(jié)

    python通用日志使用小結(jié)

    日志則是程序中非常重要的一部分,它可以記錄程序運(yùn)行中的異常、警告等信息,方便開發(fā)人員調(diào)試程序,本文就來介紹一下python通用日志使用小結(jié),感興趣的可以了解一下
    2023-11-11
  • Python 保存矩陣為Excel的實(shí)現(xiàn)方法

    Python 保存矩陣為Excel的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇Python 保存矩陣為Excel的實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python django實(shí)現(xiàn)簡單的郵件系統(tǒng)發(fā)送郵件功能

    Python django實(shí)現(xiàn)簡單的郵件系統(tǒng)發(fā)送郵件功能

    這篇文章主要介紹了Python django實(shí)現(xiàn)簡單的郵件系統(tǒng)發(fā)送郵件功能,結(jié)合實(shí)例形式分析了django發(fā)送郵件的實(shí)現(xiàn)技巧與相關(guān)注意事項,需要的朋友可以參考下
    2017-07-07
  • Python機(jī)器學(xué)習(xí)庫sklearn(scikit-learn)的基礎(chǔ)知識和高級用法

    Python機(jī)器學(xué)習(xí)庫sklearn(scikit-learn)的基礎(chǔ)知識和高級用法

    Scikit-Learn是 Python 最流行的機(jī)器學(xué)習(xí)庫之一,它提供了各種工具來實(shí)現(xiàn)、評估和探索各種學(xué)習(xí)算法,用于,各種機(jī)器學(xué)習(xí)任務(wù),在本教程中,我們將介紹 Scikit-Learn 的基礎(chǔ)知識和一些高級用法,并提供一些實(shí)例代碼來幫助我們更好地理解
    2023-07-07
  • 一步真實(shí)解決AttributeError:‘Upsample‘?object?has?no?attribute‘recompute_scale_factor‘的問題

    一步真實(shí)解決AttributeError:‘Upsample‘?object?has?no?attribute‘

    這篇文章主要介紹了解決解決AttributeError:?‘Upsample‘?object?has?no?attribute?‘recompute_scale_factor‘的問題,本文給大家介紹的非常想詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • python使用Pillow創(chuàng)建可自定義的圖標(biāo)生成器

    python使用Pillow創(chuàng)建可自定義的圖標(biāo)生成器

    在本篇博客中,我們將探討如何使用?wxPython?和?Pillow?庫創(chuàng)建一個簡單的圖標(biāo)生成器,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11

最新評論