版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
機(jī)器學(xué)習(xí):無(wú)監(jiān)督學(xué)習(xí):生成對(duì)抗網(wǎng)絡(luò)GANs教程1機(jī)器學(xué)習(xí):無(wú)監(jiān)督學(xué)習(xí):生成對(duì)抗網(wǎng)絡(luò)GANs1.1簡(jiǎn)介和背景1.1.1GANs的概念生成對(duì)抗網(wǎng)絡(luò)(GenerativeAdversarialNetworks,簡(jiǎn)稱(chēng)GANs)是由IanGoodfellow等人在2014年提出的一種深度學(xué)習(xí)模型。GANs的設(shè)計(jì)靈感來(lái)源于博弈論中的零和游戲,它由兩個(gè)神經(jīng)網(wǎng)絡(luò)組成:生成器(Generator)和判別器(Discriminator)。生成器的目標(biāo)是生成與真實(shí)數(shù)據(jù)分布相似的樣本,而判別器的目標(biāo)是區(qū)分生成器生成的樣本和真實(shí)樣本。通過(guò)這兩個(gè)網(wǎng)絡(luò)的對(duì)抗訓(xùn)練,GANs能夠?qū)W習(xí)到真實(shí)數(shù)據(jù)的分布,并生成高質(zhì)量的樣本。1.1.2無(wú)監(jiān)督學(xué)習(xí)的重要性無(wú)監(jiān)督學(xué)習(xí)是機(jī)器學(xué)習(xí)的一個(gè)重要分支,它處理的是沒(méi)有標(biāo)簽的數(shù)據(jù)集。在現(xiàn)實(shí)世界中,大量的數(shù)據(jù)是無(wú)標(biāo)簽的,例如圖像、文本、音頻等。無(wú)監(jiān)督學(xué)習(xí)能夠從這些數(shù)據(jù)中自動(dòng)學(xué)習(xí)到數(shù)據(jù)的結(jié)構(gòu)和模式,這對(duì)于數(shù)據(jù)探索、特征學(xué)習(xí)、數(shù)據(jù)生成等任務(wù)至關(guān)重要。GANs作為無(wú)監(jiān)督學(xué)習(xí)的一種強(qiáng)大工具,能夠從無(wú)標(biāo)簽數(shù)據(jù)中學(xué)習(xí)到復(fù)雜的分布,并生成新的數(shù)據(jù)樣本,這在圖像生成、風(fēng)格轉(zhuǎn)換、數(shù)據(jù)增強(qiáng)等領(lǐng)域有廣泛的應(yīng)用。1.1.3GANs在機(jī)器學(xué)習(xí)中的角色GANs在機(jī)器學(xué)習(xí)中扮演著生成模型的角色,它能夠生成與訓(xùn)練數(shù)據(jù)相似的新樣本。這種能力使得GANs在多個(gè)領(lǐng)域中成為研究的熱點(diǎn),包括但不限于圖像生成、視頻生成、文本生成、音樂(lè)生成等。GANs不僅能夠生成高質(zhì)量的樣本,還能夠用于特征學(xué)習(xí)、數(shù)據(jù)增強(qiáng)、異常檢測(cè)等任務(wù),為機(jī)器學(xué)習(xí)提供了新的視角和方法。1.2示例:使用PyTorch實(shí)現(xiàn)一個(gè)簡(jiǎn)單的GAN#導(dǎo)入必要的庫(kù)
importtorch
importtorch.nnasnn
importtorch.optimasoptim
fromtorchvisionimportdatasets,transforms
fromtorch.autogradimportVariable
#定義生成器
classGenerator(nn.Module):
def__init__(self):
super(Generator,self).__init__()
self.main=nn.Sequential(
nn.Linear(100,256),
nn.ReLU(True),
nn.Linear(256,512),
nn.ReLU(True),
nn.Linear(512,784),
nn.Tanh()
)
defforward(self,input):
returnself.main(input)
#定義判別器
classDiscriminator(nn.Module):
def__init__(self):
super(Discriminator,self).__init__()
self.main=nn.Sequential(
nn.Linear(784,512),
nn.ReLU(True),
nn.Linear(512,256),
nn.ReLU(True),
nn.Linear(256,1),
nn.Sigmoid()
)
defforward(self,input):
returnself.main(input)
#初始化生成器和判別器
G=Generator()
D=Discriminator()
#定義損失函數(shù)和優(yōu)化器
criterion=nn.BCELoss()
d_optimizer=optim.Adam(D.parameters(),lr=0.0002)
g_optimizer=optim.Adam(G.parameters(),lr=0.0002)
#加載MNIST數(shù)據(jù)集
transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,))])
data=datasets.MNIST(root='./data',train=True,download=True,transform=transform)
#訓(xùn)練GAN
forepochinrange(num_epochs):
fori,(images,_)inenumerate(data_loader):
#準(zhǔn)備真實(shí)數(shù)據(jù)和噪聲數(shù)據(jù)
real_images=Variable(images.view(images.size(0),-1))
real_labels=Variable(torch.ones(images.size(0)))
fake_labels=Variable(torch.zeros(images.size(0)))
noise=Variable(torch.randn(images.size(0),100))
#訓(xùn)練判別器
outputs=D(real_images)
d_loss_real=criterion(outputs,real_labels)
real_score=outputs
fake_images=G(noise)
outputs=D(fake_images)
d_loss_fake=criterion(outputs,fake_labels)
fake_score=outputs
d_loss=d_loss_real+d_loss_fake
d_optimizer.zero_grad()
d_loss.backward()
d_optimizer.step()
#訓(xùn)練生成器
fake_images=G(noise)
outputs=D(fake_images)
g_loss=criterion(outputs,real_labels)
g_optimizer.zero_grad()
g_loss.backward()
g_optimizer.step()
#打印損失和得分
print('Epoch[{}/{}],d_loss:{:.6f},g_loss:{:.6f},D(x):{:.6f},D(G(z)):{:.6f}'.format(
epoch,num_epochs,d_loss.data.item(),g_loss.data.item(),
real_score.data.mean(),fake_score.data.mean()))1.2.1代碼解釋上述代碼展示了如何使用PyTorch庫(kù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的GAN。首先,我們定義了生成器和判別器的結(jié)構(gòu),生成器通過(guò)一系列的線(xiàn)性層和激活函數(shù)將隨機(jī)噪聲轉(zhuǎn)換為圖像,而判別器則通過(guò)類(lèi)似的結(jié)構(gòu)判斷輸入的圖像是否為真實(shí)圖像。然后,我們加載了MNIST數(shù)據(jù)集,這是一個(gè)包含手寫(xiě)數(shù)字的圖像數(shù)據(jù)集,用于訓(xùn)練GAN。在訓(xùn)練過(guò)程中,我們首先訓(xùn)練判別器,使其能夠區(qū)分真實(shí)圖像和生成的圖像,然后訓(xùn)練生成器,使其生成的圖像能夠欺騙判別器。通過(guò)這種對(duì)抗訓(xùn)練,GANs能夠?qū)W習(xí)到真實(shí)數(shù)據(jù)的分布,并生成高質(zhì)量的樣本。1.3結(jié)論GANs作為一種創(chuàng)新的無(wú)監(jiān)督學(xué)習(xí)方法,已經(jīng)在多個(gè)領(lǐng)域展示了其強(qiáng)大的生成能力。通過(guò)生成器和判別器的對(duì)抗訓(xùn)練,GANs能夠從無(wú)標(biāo)簽數(shù)據(jù)中學(xué)習(xí)到復(fù)雜的分布,并生成與訓(xùn)練數(shù)據(jù)相似的新樣本。隨著研究的深入,GANs的應(yīng)用領(lǐng)域和方法也在不斷擴(kuò)展,為機(jī)器學(xué)習(xí)和人工智能的發(fā)展提供了新的動(dòng)力。2GANs的基本原理2.1生成器與判別器的博弈生成對(duì)抗網(wǎng)絡(luò)(GANs)是一種無(wú)監(jiān)督學(xué)習(xí)方法,其核心在于兩個(gè)神經(jīng)網(wǎng)絡(luò)模型之間的博弈:生成器(Generator)和判別器(Discriminator)。生成器的目標(biāo)是生成與真實(shí)數(shù)據(jù)分布相似的樣本,而判別器則試圖區(qū)分生成器生成的樣本與真實(shí)樣本。這種博弈過(guò)程促使生成器不斷改進(jìn)其生成的樣本,直到判別器無(wú)法區(qū)分真假,從而達(dá)到生成高質(zhì)量樣本的目的。2.1.1生成器生成器是一個(gè)從隨機(jī)噪聲中生成數(shù)據(jù)的模型。它接收一個(gè)隨機(jī)噪聲向量作為輸入,輸出一個(gè)與訓(xùn)練數(shù)據(jù)分布相似的樣本。生成器的訓(xùn)練目標(biāo)是最大化判別器對(duì)生成樣本的錯(cuò)誤分類(lèi)概率。2.1.2判別器判別器是一個(gè)二分類(lèi)模型,其任務(wù)是判斷輸入數(shù)據(jù)是真實(shí)數(shù)據(jù)還是生成器生成的假數(shù)據(jù)。判別器的訓(xùn)練目標(biāo)是最大化對(duì)真實(shí)數(shù)據(jù)和生成數(shù)據(jù)的正確分類(lèi)概率。2.1.3博弈過(guò)程在訓(xùn)練過(guò)程中,生成器和判別器是同時(shí)進(jìn)行訓(xùn)練的。生成器試圖欺騙判別器,使其將生成的假數(shù)據(jù)誤認(rèn)為是真實(shí)數(shù)據(jù);而判別器則試圖識(shí)別出這些假數(shù)據(jù)。這種對(duì)抗訓(xùn)練過(guò)程可以看作是一個(gè)零和博弈,其中生成器和判別器的目標(biāo)是相互對(duì)立的。2.2損失函數(shù)與優(yōu)化GANs的損失函數(shù)設(shè)計(jì)是其成功的關(guān)鍵。通常,生成器和判別器的損失函數(shù)是相反的,這意味著當(dāng)一個(gè)模型的損失減少時(shí),另一個(gè)模型的損失會(huì)增加。這種設(shè)計(jì)確保了生成器和判別器之間的對(duì)抗性訓(xùn)練。2.2.1判別器的損失函數(shù)判別器的損失函數(shù)通常設(shè)計(jì)為交叉熵?fù)p失,它衡量判別器對(duì)真實(shí)數(shù)據(jù)和生成數(shù)據(jù)分類(lèi)的準(zhǔn)確性。對(duì)于真實(shí)數(shù)據(jù),判別器應(yīng)該輸出接近1的概率;對(duì)于生成數(shù)據(jù),應(yīng)該輸出接近0的概率。importtorch
importtorch.nnasnn
#定義判別器的損失函數(shù)
criterion=nn.BCELoss()
#真實(shí)數(shù)據(jù)的標(biāo)簽
real_labels=torch.ones(batch_size)
#生成數(shù)據(jù)的標(biāo)簽
fake_labels=torch.zeros(batch_size)
#計(jì)算判別器對(duì)真實(shí)數(shù)據(jù)的損失
real_output=discriminator(real_data)
d_loss_real=criterion(real_output,real_labels)
#計(jì)算判別器對(duì)生成數(shù)據(jù)的損失
fake_data=generator(noise)
fake_output=discriminator(fake_data)
d_loss_fake=criterion(fake_output,fake_labels)
#判別器的總損失
d_loss=d_loss_real+d_loss_fake2.2.2生成器的損失函數(shù)生成器的損失函數(shù)同樣基于交叉熵?fù)p失,但目標(biāo)是使判別器將生成數(shù)據(jù)誤認(rèn)為真實(shí)數(shù)據(jù)。生成器的損失函數(shù)通常與判別器的損失函數(shù)相反,即生成器的目標(biāo)是最大化判別器對(duì)生成數(shù)據(jù)的輸出概率。#生成器的損失函數(shù)
g_loss=criterion(fake_output,real_labels)2.2.3優(yōu)化過(guò)程在訓(xùn)練過(guò)程中,生成器和判別器的參數(shù)是交替更新的。首先,固定生成器的參數(shù),更新判別器的參數(shù)以最小化其損失;然后,固定判別器的參數(shù),更新生成器的參數(shù)以最大化其損失。#更新判別器
d_optimizer.zero_grad()
d_loss.backward()
d_optimizer.step()
#更新生成器
g_optimizer.zero_grad()
g_loss.backward()
g_optimizer.step()2.3訓(xùn)練過(guò)程詳解GANs的訓(xùn)練過(guò)程可以分為以下步驟:初始化模型:初始化生成器和判別器的參數(shù)。數(shù)據(jù)準(zhǔn)備:準(zhǔn)備真實(shí)數(shù)據(jù)和隨機(jī)噪聲數(shù)據(jù)。前向傳播:使用真實(shí)數(shù)據(jù)和隨機(jī)噪聲數(shù)據(jù)分別進(jìn)行前向傳播,得到判別器和生成器的輸出。計(jì)算損失:根據(jù)判別器和生成器的輸出計(jì)算損失函數(shù)。反向傳播與優(yōu)化:對(duì)判別器和生成器的損失進(jìn)行反向傳播,并更新模型參數(shù)。重復(fù)訓(xùn)練:重復(fù)上述過(guò)程,直到模型收斂。2.3.1訓(xùn)練示例以下是一個(gè)使用PyTorch實(shí)現(xiàn)的GANs訓(xùn)練過(guò)程的示例:importtorch
importtorch.nnasnn
importtorchvision.datasetsasdset
importtorchvision.transformsastransforms
importtorch.optimasoptim
#定義生成器和判別器
classGenerator(nn.Module):
def__init__(self):
super(Generator,self).__init__()
self.main=nn.Sequential(
nn.Linear(100,256),
nn.ReLU(True),
nn.Linear(256,512),
nn.ReLU(True),
nn.Linear(512,1024),
nn.ReLU(True),
nn.Linear(1024,784),
nn.Tanh()
)
defforward(self,input):
returnself.main(input)
classDiscriminator(nn.Module):
def__init__(self):
super(Discriminator,self).__init__()
self.main=nn.Sequential(
nn.Linear(784,1024),
nn.ReLU(True),
nn.Dropout(0.3),
nn.Linear(1024,512),
nn.ReLU(True),
nn.Dropout(0.3),
nn.Linear(512,256),
nn.ReLU(True),
nn.Dropout(0.3),
nn.Linear(256,1),
nn.Sigmoid()
)
defforward(self,input):
returnself.main(input)
#初始化模型
generator=Generator()
discriminator=Discriminator()
#定義損失函數(shù)和優(yōu)化器
criterion=nn.BCELoss()
d_optimizer=optim.Adam(discriminator.parameters(),lr=0.0002)
g_optimizer=optim.Adam(generator.parameters(),lr=0.0002)
#準(zhǔn)備數(shù)據(jù)
dataset=dset.MNIST(root='./data',train=True,download=True,transform=transforms.ToTensor())
data_loader=torch.utils.data.DataLoader(dataset,batch_size=64,shuffle=True)
#訓(xùn)練過(guò)程
forepochinrange(num_epochs):
fori,(real_data,_)inenumerate(data_loader):
#準(zhǔn)備真實(shí)數(shù)據(jù)和隨機(jī)噪聲
real_data=real_data.view(real_data.size(0),-1)
noise=torch.randn(real_data.size(0),100)
#更新判別器
d_optimizer.zero_grad()
real_output=discriminator(real_data)
d_loss_real=criterion(real_output,torch.ones(real_data.size(0)))
fake_data=generator(noise)
fake_output=discriminator(fake_data)
d_loss_fake=criterion(fake_output,torch.zeros(real_data.size(0)))
d_loss=d_loss_real+d_loss_fake
d_loss.backward()
d_optimizer.step()
#更新生成器
g_optimizer.zero_grad()
fake_data=generator(noise)
fake_output=discriminator(fake_data)
g_loss=criterion(fake_output,torch.ones(real_data.size(0)))
g_loss.backward()
g_optimizer.step()在這個(gè)示例中,我們使用了MNIST數(shù)據(jù)集來(lái)訓(xùn)練GANs。生成器和判別器都是多層感知器(MLP),使用了ReLU激活函數(shù)和Tanh/Sigmoid輸出函數(shù)。優(yōu)化器使用了Adam算法,損失函數(shù)使用了二元交叉熵?fù)p失。通過(guò)交替訓(xùn)練生成器和判別器,最終可以生成與MNIST數(shù)據(jù)集相似的手寫(xiě)數(shù)字圖像。3GANs的變種3.1條件GANs3.1.1原理?xiàng)l件生成對(duì)抗網(wǎng)絡(luò)(ConditionalGANs,CGANs)是GANs的一種擴(kuò)展,它允許模型在生成數(shù)據(jù)時(shí)考慮額外的輸入信息,如類(lèi)別標(biāo)簽、圖像或文本描述。在CGANs中,生成器和判別器都接收額外的條件信息作為輸入,這使得生成器能夠根據(jù)特定條件生成更精確、更可控的數(shù)據(jù)。3.1.2內(nèi)容條件GANs通過(guò)在生成器和判別器中引入條件向量,增強(qiáng)了模型的生成能力。條件向量可以是任何類(lèi)型的數(shù)據(jù),如類(lèi)別標(biāo)簽、圖像或文本。在訓(xùn)練過(guò)程中,生成器嘗試根據(jù)條件向量生成逼真的數(shù)據(jù),而判別器則嘗試區(qū)分真實(shí)數(shù)據(jù)和生成數(shù)據(jù),同時(shí)考慮條件向量。示例代碼importtorch
importtorch.nnasnn
importtorch.optimasoptim
fromtorchvisionimportdatasets,transforms
fromtorch.autogradimportVariable
#定義生成器
classGenerator(nn.Module):
def__init__(self):
super(Generator,self).__init__()
self.main=nn.Sequential(
nn.Linear(100+10,256),
nn.ReLU(True),
nn.Linear(256,784),
nn.Tanh()
)
defforward(self,input,label):
input=torch.cat([input,label],1)
output=self.main(input)
output=output.view(-1,1,28,28)
returnoutput
#定義判別器
classDiscriminator(nn.Module):
def__init__(self):
super(Discriminator,self).__init__()
self.main=nn.Sequential(
nn.Linear(784+10,256),
nn.ReLU(True),
nn.Linear(256,1),
nn.Sigmoid()
)
defforward(self,input,label):
input=input.view(-1,784)
input=torch.cat([input,label],1)
output=self.main(input)
returnoutput
#加載MNIST數(shù)據(jù)集
data_transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,),(0.5,))
])
dataset=datasets.MNIST(root='./data',train=True,download=True,transform=data_transform)
data_loader=torch.utils.data.DataLoader(dataset,batch_size=64,shuffle=True)
#初始化生成器和判別器
G=Generator()
D=Discriminator()
#定義損失函數(shù)和優(yōu)化器
criterion=nn.BCELoss()
optimizer_G=optim.Adam(G.parameters(),lr=0.0002)
optimizer_D=optim.Adam(D.parameters(),lr=0.0002)
#訓(xùn)練循環(huán)
forepochinrange(100):
fori,(images,labels)inenumerate(data_loader):
#準(zhǔn)備真實(shí)數(shù)據(jù)和條件標(biāo)簽
real_images=Variable(images.view(-1,784))
real_labels=Variable(labels)
real_labels=real_labels.type(torch.LongTensor)
real_labels_onehot=torch.zeros(real_labels.size(0),10).scatter_(1,real_labels.view(-1,1),1)
real_labels_onehot=Variable(real_labels_onehot)
#準(zhǔn)備噪聲數(shù)據(jù)和條件標(biāo)簽
noise=Variable(torch.randn(real_images.size(0),100))
fake_labels=Variable(torch.LongTensor(real_labels.size(0)).random_(0,10))
fake_labels_onehot=torch.zeros(fake_labels.size(0),10).scatter_(1,fake_labels.view(-1,1),1)
fake_labels_onehot=Variable(fake_labels_onehot)
#生成假數(shù)據(jù)
fake_images=G(noise,fake_labels_onehot)
#訓(xùn)練判別器
optimizer_D.zero_grad()
real_output=D(real_images,real_labels_onehot)
fake_output=D(fake_images,fake_labels_onehot)
D_loss=criterion(real_output,Variable(torch.ones(real_output.size(0),1)))+criterion(fake_output,Variable(torch.zeros(fake_output.size(0),1)))
D_loss.backward()
optimizer_D.step()
#訓(xùn)練生成器
optimizer_G.zero_grad()
fake_images=G(noise,fake_labels_onehot)
fake_output=D(fake_images,fake_labels_onehot)
G_loss=criterion(fake_output,Variable(torch.ones(fake_output.size(0),1)))
G_loss.backward()
optimizer_G.step()3.1.3解釋在上述代碼中,我們定義了一個(gè)生成器和一個(gè)判別器,它們都接收噪聲向量和條件向量作為輸入。我們使用MNIST數(shù)據(jù)集進(jìn)行訓(xùn)練,條件向量是數(shù)字的類(lèi)別標(biāo)簽。在訓(xùn)練過(guò)程中,生成器嘗試根據(jù)給定的類(lèi)別標(biāo)簽生成數(shù)字圖像,而判別器則嘗試區(qū)分真實(shí)圖像和生成圖像,同時(shí)考慮類(lèi)別標(biāo)簽。3.2WassersteinGANs3.2.1原理WassersteinGANs(WGANs)通過(guò)使用Wasserstein距離來(lái)改進(jìn)GANs的訓(xùn)練穩(wěn)定性。WGANs中的判別器被重新定義為一個(gè)“評(píng)論家”,其目標(biāo)是估計(jì)真實(shí)數(shù)據(jù)和生成數(shù)據(jù)之間的Wasserstein距離。為了實(shí)現(xiàn)這一點(diǎn),WGANs使用了不同的損失函數(shù),并且對(duì)評(píng)論家的權(quán)重進(jìn)行了限制,以確保其輸出是Lipschitz連續(xù)的。3.2.2內(nèi)容WGANs通過(guò)使用Wasserstein距離而不是傳統(tǒng)的交叉熵?fù)p失,解決了GANs訓(xùn)練中的一些問(wèn)題,如模式崩潰和梯度消失。WGANs的訓(xùn)練過(guò)程包括兩個(gè)主要步驟:首先,訓(xùn)練評(píng)論家以估計(jì)真實(shí)數(shù)據(jù)和生成數(shù)據(jù)之間的距離;然后,訓(xùn)練生成器以最小化這個(gè)距離。示例代碼importtorch
importtorch.nnasnn
importtorch.optimasoptim
fromtorchvisionimportdatasets,transforms
fromtorch.autogradimportVariable
#定義生成器
classGenerator(nn.Module):
def__init__(self):
super(Generator,self).__init__()
self.main=nn.Sequential(
nn.Linear(100,256),
nn.ReLU(True),
nn.Linear(256,784),
nn.Tanh()
)
defforward(self,input):
output=self.main(input)
output=output.view(-1,1,28,28)
returnoutput
#定義評(píng)論家
classCritic(nn.Module):
def__init__(self):
super(Critic,self).__init__()
self.main=nn.Sequential(
nn.Linear(784,256),
nn.ReLU(True),
nn.Linear(256,1)
)
defforward(self,input):
input=input.view(-1,784)
output=self.main(input)
returnoutput
#加載MNIST數(shù)據(jù)集
data_transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,),(0.5,))
])
dataset=datasets.MNIST(root='./data',train=True,download=True,transform=data_transform)
data_loader=torch.utils.data.DataLoader(dataset,batch_size=64,shuffle=True)
#初始化生成器和評(píng)論家
G=Generator()
D=Critic()
#定義優(yōu)化器
optimizer_G=optim.Adam(G.parameters(),lr=0.0002)
optimizer_D=optim.Adam(D.parameters(),lr=0.0002)
#訓(xùn)練循環(huán)
forepochinrange(100):
fori,(images,_)inenumerate(data_loader):
#準(zhǔn)備真實(shí)數(shù)據(jù)
real_images=Variable(images.view(-1,784))
#準(zhǔn)備噪聲數(shù)據(jù)
noise=Variable(torch.randn(real_images.size(0),100))
#生成假數(shù)據(jù)
fake_images=G(noise)
#訓(xùn)練評(píng)論家
optimizer_D.zero_grad()
real_output=D(real_images)
fake_output=D(fake_images)
D_loss=torch.mean(fake_output)-torch.mean(real_output)
D_loss.backward()
optimizer_D.step()
#訓(xùn)練生成器
optimizer_G.zero_grad()
fake_images=G(noise)
fake_output=D(fake_images)
G_loss=-torch.mean(fake_output)
G_loss.backward()
optimizer_G.step()
#限制評(píng)論家的權(quán)重
forpinD.parameters():
p.data.clamp_(-0.01,0.01)3.2.3解釋在WGANs中,我們使用了一個(gè)評(píng)論家網(wǎng)絡(luò)來(lái)估計(jì)真實(shí)數(shù)據(jù)和生成數(shù)據(jù)之間的Wasserstein距離。為了確保評(píng)論家的輸出是Lipschitz連續(xù)的,我們限制了評(píng)論家網(wǎng)絡(luò)的權(quán)重。在訓(xùn)練過(guò)程中,生成器嘗試最小化評(píng)論家對(duì)生成數(shù)據(jù)的評(píng)分,而評(píng)論家則嘗試最大化真實(shí)數(shù)據(jù)和生成數(shù)據(jù)之間的評(píng)分差異。3.3SeqGANs3.3.1原理SeqGANs是針對(duì)序列生成任務(wù)的GANs變種,如文本生成。SeqGANs使用了強(qiáng)化學(xué)習(xí)的策略,通過(guò)生成器和判別器之間的交互來(lái)優(yōu)化生成器的策略,從而生成更高質(zhì)量的序列數(shù)據(jù)。3.3.2內(nèi)容SeqGANs通過(guò)將生成器視為一個(gè)策略網(wǎng)絡(luò),將判別器視為一個(gè)獎(jiǎng)勵(lì)函數(shù),使用強(qiáng)化學(xué)習(xí)的策略來(lái)優(yōu)化生成器。在訓(xùn)練過(guò)程中,生成器嘗試生成高質(zhì)量的序列數(shù)據(jù),以獲得判別器的高獎(jiǎng)勵(lì),而判別器則嘗試區(qū)分真實(shí)序列和生成序列。示例代碼importtorch
importtorch.nnasnn
importtorch.optimasoptim
fromtorch.autogradimportVariable
importnumpyasnp
#定義生成器
classGenerator(nn.Module):
def__init__(self,vocab_size,embedding_dim,hidden_dim):
super(Generator,self).__init__()
self.embedding=nn.Embedding(vocab_size,embedding_dim)
self.lstm=nn.LSTM(embedding_dim,hidden_dim)
self.linear=nn.Linear(hidden_dim,vocab_size)
defforward(self,input,hidden):
embed=self.embedding(input)
output,hidden=self.lstm(embed,hidden)
output=self.linear(output)
returnoutput,hidden
#定義判別器
classDiscriminator(nn.Module):
def__init__(self,vocab_size,embedding_dim,hidden_dim):
super(Discriminator,self).__init__()
self.embedding=nn.Embedding(vocab_size,embedding_dim)
self.lstm=nn.LSTM(embedding_dim,hidden_dim)
self.linear=nn.Linear(hidden_dim,1)
defforward(self,input,hidden):
embed=self.embedding(input)
output,hidden=self.lstm(embed,hidden)
output=self.linear(output[-1])
returntorch.sigmoid(output)
#加載數(shù)據(jù)集
#假設(shè)我們有一個(gè)文本數(shù)據(jù)集,每個(gè)樣本是一個(gè)長(zhǎng)度為10的序列
data=np.random.randint(0,100,(1000,10))
#初始化生成器和判別器
G=Generator(vocab_size=100,embedding_dim=128,hidden_dim=256)
D=Discriminator(vocab_size=100,embedding_dim=128,hidden_dim=256)
#定義優(yōu)化器
optimizer_G=optim.Adam(G.parameters(),lr=0.0002)
optimizer_D=optim.Adam(D.parameters(),lr=0.0002)
#訓(xùn)練循環(huán)
forepochinrange(100):
foriinrange(1000):
#準(zhǔn)備真實(shí)數(shù)據(jù)
real_data=Variable(torch.LongTensor(data[i]))
#準(zhǔn)備噪聲數(shù)據(jù)
noise=Variable(torch.LongTensor(10).random_(0,100))
#生成假數(shù)據(jù)
fake_data=[]
hidden=(Variable(torch.zeros(1,1,256)),Variable(torch.zeros(1,1,256)))
fortinrange(10):
output,hidden=G(noise[t].view(1,-1),hidden)
output=output.view(-1)
sample=torch.multinomial(torch.exp(output),1)
fake_data.append(sample)
noise=sample
#訓(xùn)練判別器
optimizer_D.zero_grad()
real_output=D(real_data,(Variable(torch.zeros(1,1,256)),Variable(torch.zeros(1,1,256))))
fake_output=D(torch.cat(fake_data,0),(Variable(torch.zeros(1,1,256)),Variable(torch.zeros(1,1,256))))
D_loss=-torch.mean(torch.log(real_output))-torch.mean(torch.log(1-fake_output))
D_loss.backward()
optimizer_D.step()
#訓(xùn)練生成器
optimizer_G.zero_grad()
fake_data=[]
hidden=(Variable(torch.zeros(1,1,256)),Variable(torch.zeros(1,1,256)))
fortinrange(10):
output,hidden=G(noise[t].view(1,-1),hidden)
output=output.view(-1)
sample=torch.multinomial(torch.exp(output),1)
fake_data.append(sample)
noise=sample
#計(jì)算獎(jiǎng)勵(lì)
rewards=[]
hidden=(Variable(torch.zeros(1,1,256)),Variable(torch.zeros(1,1,256)))
fortinrange(10):
output=D(fake_data[t],hidden)
rewards.append(output.data[0][0])
#計(jì)算生成器的損失
G_loss=0
hidden=(Variable(torch.zeros(1,1,256)),Variable(torch.zeros(1,1,256)))
fortinrange(10):
output,hidden=G(noise[t].view(1,-1),hidden)
output=output.view(-1)
sample=fake_data[t]
G_loss+=-torch.log(output[sample])*Variable(torch.Tensor([rewards[t]]))
G_loss.backward()
optimizer_G.step()3.3.3解釋在上述代碼中,我們定義了一個(gè)生成器和一個(gè)判別器,它們都是基于LSTM的網(wǎng)絡(luò)。生成器嘗試生成高質(zhì)量的文本序列,而判別器則嘗試區(qū)分真實(shí)序列和生成序列。在訓(xùn)練過(guò)程中,我們使用了強(qiáng)化學(xué)習(xí)的策略來(lái)優(yōu)化生成器,生成器的損失是根據(jù)判別器的獎(jiǎng)勵(lì)來(lái)計(jì)算的。4實(shí)戰(zhàn)應(yīng)用與案例分析4.1圖像生成生成對(duì)抗網(wǎng)絡(luò)(GANs)在圖像生成領(lǐng)域有著廣泛的應(yīng)用,能夠生成高度逼真的圖像。下面,我們將通過(guò)一個(gè)簡(jiǎn)單的GAN模型來(lái)生成手寫(xiě)數(shù)字圖像,使用的是經(jīng)典的MNIST數(shù)據(jù)集。4.1.1數(shù)據(jù)準(zhǔn)備MNIST數(shù)據(jù)集包含60000個(gè)訓(xùn)練樣本和10000個(gè)測(cè)試樣本,每個(gè)樣本是一個(gè)28x28像素的灰度圖像,代表一個(gè)手寫(xiě)數(shù)字。importtensorflowastf
fromtensorflow.kerasimportlayers
importnumpyasnp
importmatplotlib.pyplotasplt
#加載MNIST數(shù)據(jù)集
(x_train,_),(_,_)=tf.keras.datasets.mnist.load_data()
x_train=x_train.reshape(x_train.shape[0],28,28,1).astype('float32')
x_train=(x_train-127.5)/127.5#歸一化到[-1,1]4.1.2構(gòu)建模型GAN由生成器和判別器組成。生成器嘗試生成逼真的圖像,而判別器則嘗試區(qū)分真實(shí)圖像和生成的圖像。#生成器模型
defmake_generator_model():
model=tf.keras.Sequential()
model.add(layers.Dense(7*7*256,use_bias=False,input_shape=(100,)))
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Reshape((7,7,256)))
assertmodel.output_shape==(None,7,7,256)#注意:batchsize沒(méi)有被假定
model.add(layers.Conv2DTranspose(128,(5,5),strides=(1,1),padding='same',use_bias=False))
assertmodel.output_shape==(None,7,7,128)
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Conv2DTranspose(64,(5,5),strides=(2,2),padding='same',use_bias=False))
assertmodel.output_shape==(None,14,14,64)
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Conv2DTranspose(1,(5,5),strides=(2,2),padding='same',use_bias=False,activation='tanh'))
assertmodel.output_shape==(None,28,28,1)
returnmodel
#判別器模型
defmake_discriminator_model():
model=tf.keras.Sequential()
model.add(layers.Conv2D(64,(5,5),strides=(2,2),padding='same',input_shape=[28,28,1]))
model.add(layers.LeakyReLU())
model.add(layers.Dropout(0.3))
model.add(layers.Conv2D(128,(5,5),strides=(2,2),padding='same'))
model.add(layers.LeakyReLU())
model.add(layers.Dropout(0.3))
model.add(layers.Flatten())
model.add(layers.Dense(1))
returnmodel4.1.3訓(xùn)練模型訓(xùn)練GAN涉及交替訓(xùn)練生成器和判別器。#定義損失函數(shù)和優(yōu)化器
cross_entropy=tf.keras.losses.BinaryCrossentropy(from_logits=True)
defdiscriminator_loss(real_output,fake_output):
real_loss=cross_entropy(tf.ones_like(real_output),real_output)
fake_loss=cross_entropy(tf.zeros_like(fake_output),fake_output)
total_loss=real_loss+fake_loss
returntotal_loss
defgenerator_loss(fake_output):
returncross_entropy(tf.ones_like(fake_output),fake_output)
generator_optimizer=tf.keras.optimizers.Adam(1e-4)
discriminator_optimizer=tf.keras.optimizers.Adam(1e-4)
#定義訓(xùn)練步驟
@tf.function
deftrain_step(images):
noise=tf.random.normal([BATCH_SIZE,noise_dim])
withtf.GradientTape()asgen_tape,tf.GradientTape()asdisc_tape:
generated_images=generator(noise,training=True)
real_output=discriminator(images,training=True)
fake_output=discriminator(generated_images,training=True)
gen_loss=generator_loss(fake_output)
disc_loss=discriminator_loss(real_output,fake_output)
gradients_of_generator=gen_tape.gradient(gen_loss,generator.trainable_variables)
gradients_of_discriminator=disc_tape.gradient(disc_loss,discriminator.trainable_variables)
generator_optimizer.apply_gradients(zip(gradients_of_generator,generator.trainable_variables))
discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator,discriminator.trainable_variables))4.2文本到圖像轉(zhuǎn)換GANs也可以用于將文本描述轉(zhuǎn)換為圖像,這一過(guò)程稱(chēng)為文本到圖像合成。下面是一個(gè)使用GAN進(jìn)行文本到圖像轉(zhuǎn)換的簡(jiǎn)化示例,使用的是COCO數(shù)據(jù)集的子集。4.2.1數(shù)據(jù)準(zhǔn)備COCO數(shù)據(jù)集包含大量圖像和對(duì)應(yīng)的文本描述。為了簡(jiǎn)化,我們使用一個(gè)預(yù)處理過(guò)的數(shù)據(jù)集,其中包含圖像和描述的配對(duì)。#加載預(yù)處理過(guò)的COCO數(shù)據(jù)集
#這里假設(shè)我們有一個(gè)數(shù)據(jù)加載函數(shù)load_coco_data(),它返回圖像和描述的配對(duì)
images,descriptions=load_coco_data()4.2.2構(gòu)建模型文本到圖像的GAN模型通常包含一個(gè)條件生成器和一個(gè)條件判別器,它們都接受文本描述作為輸入的一部分。#條件生成器模型
defmake_conditional_generator_model():
#文本嵌入層
text_embedding=layers.Embedding(vocab_size,embedding_dim)
#圖像生成器
model=tf.keras.Sequential()
model.add(layers.Dense(7*7*256,use_bias=False,input_shape=(100+embedding_dim,)))
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
#其他層與圖像生成模型類(lèi)似
#...
returnmodel
#條件判別器模型
defmake_conditional_discriminator_model():
#文本嵌入層
text_embedding=layers.Embedding(vocab_size,embedding_dim)
#圖像判別器
model=tf.keras.Sequential()
model.add(layers.Conv2D(64,(5,5),strides=(2,2),padding='same',input_shape=[28,28,1]))
model.add(layers.LeakyReLU())
model.add(layers.Dropout(0.3))
#其他層與圖像判別模型類(lèi)似
#...
returnmodel4.2.3訓(xùn)練模型訓(xùn)練條件GAN與訓(xùn)練標(biāo)準(zhǔn)GAN類(lèi)似,但需要將文本描述作為額外的輸入。#定義訓(xùn)練步驟
@tf.function
deftrain_step(images,descriptions):
noise=tf.random.normal([BATCH_SIZE,noise_dim])
embedded_text=text_embedding(descriptions)
input_noise=tf.concat([noise,embedded_text],axis=1)
withtf.GradientTape()asgen_tape,tf.GradientTape()asdisc_tape:
generated_images=generator(input_noise,training=True)
real_output=discriminator([images,descriptions],training=True)
fake_output=discriminator([generated_images,descriptions],training=True)
gen_loss=generator_loss(fake_output)
disc_loss=discriminator_loss(real_output,fake_output)
gradients_of_generator=gen_tape.gradient(gen_loss,generator.trainable_variables)
gradients_of_discriminator=disc_tape.gradient(disc_loss,discriminator.trainable_variables)
generator_optimizer.apply_gradients(zip(gradients_of_generator,generator.trainable_variables))
discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator,discriminator.trainable_variables))4.3風(fēng)格遷移GANs在風(fēng)格遷移中也表現(xiàn)出色,能夠?qū)⒁粡垐D像的風(fēng)格應(yīng)用到另一張圖像上。下面是一個(gè)使用CycleGAN進(jìn)行風(fēng)格遷移的示例。4.3.1數(shù)據(jù)準(zhǔn)備我們需要兩組圖像,一組代表“內(nèi)容”圖像,另一組代表“風(fēng)格”圖像。#加載內(nèi)容和風(fēng)格圖像數(shù)據(jù)集
content_images=load_content_images()
style_images=load_style_images()4.3.2構(gòu)建模型CycleGAN包含兩個(gè)生成器和兩個(gè)判別器,分別用于兩個(gè)方向的轉(zhuǎn)換。#內(nèi)容到風(fēng)格的生成器
defmake_content_to_style_generator():
#構(gòu)建生成器模型
#...
returnmodel
#風(fēng)格到內(nèi)容的生成器
defmake_style_to_content_generator():
#構(gòu)建生成器模型
#...
returnmodel
#內(nèi)容圖像的判別器
defmake_content_discriminator():
#構(gòu)建判別器模型
#...
returnmodel
#風(fēng)格圖像的判別器
defmake_style_discriminator():
#構(gòu)建判別器模型
#...
returnmodel4.3.3訓(xùn)練模型訓(xùn)練CycleGAN涉及同時(shí)訓(xùn)練兩個(gè)方向的生成器和判別器,以及確保轉(zhuǎn)換后的圖像能夠被逆向轉(zhuǎn)換回原始圖像。#定義訓(xùn)練步驟
@tf.function
deftrain_step(content_image,style_image):
#生成內(nèi)容到風(fēng)格的圖像
fake_style=content_to_style(content_image,training=True)
#生成風(fēng)格到內(nèi)容的圖像
fake_content=style_to_content(style_image,training=True)
#再次轉(zhuǎn)換以確保循環(huán)一致性
recon_content=content_to_style(fake_content,training=True)
recon_style=style_to_content(fake_style,training=True)
#判別器損失
disc_content_loss=discriminator_loss(discriminator_content(fake_content),tf.zeros_like(fake_content))
disc_style_loss=discriminator_loss(discriminator_style(fake_style),tf.zeros_like(fake_style))
#生成器損失
gen_content_loss=generator_loss(discriminator_content(fake_style),tf.ones_like(fake_style))
gen_style_loss=generator_loss(discriminator_style(fake_content),tf.ones_like(fake_content))
#循環(huán)一致性損失
cycle_loss=tf.reduce_mean(tf.abs(content_image-recon_content))+tf.reduce_mean(tf.abs(style_image-recon_style))
#總損失
total_gen_loss=gen_content_loss+gen_style_loss+cycle_loss
total_disc_loss=disc_content_loss+disc_style_loss
#應(yīng)用梯度
#...通過(guò)這些示例,我們可以看到GANs在不同領(lǐng)域的應(yīng)用,包括圖像生成、文本到圖像轉(zhuǎn)換和風(fēng)格遷移。這些模型的訓(xùn)練過(guò)程雖然復(fù)雜,但遵循相似的模式:交替訓(xùn)練生成器和判別器,以達(dá)到生成逼真圖像的目標(biāo)。5高級(jí)主題與研究進(jìn)展5.1GANs的收斂性問(wèn)題在生成對(duì)抗網(wǎng)絡(luò)(GANs)的訓(xùn)練過(guò)程中,收斂性問(wèn)題是一個(gè)核心挑戰(zhàn)。GANs由兩個(gè)神經(jīng)網(wǎng)絡(luò)組成:生成器(Generator)和判別器(Discriminator)。生成器的目標(biāo)是生成與真實(shí)數(shù)據(jù)分布相似的樣本,而判別器則試圖區(qū)分真實(shí)數(shù)據(jù)和生成數(shù)據(jù)。這種對(duì)抗訓(xùn)練過(guò)程可能導(dǎo)致不穩(wěn)定和難以收斂的現(xiàn)象,主要由以下幾個(gè)因素引起:非凸優(yōu)化問(wèn)題:GANs的損失函數(shù)通常是非凸的,這意味著存在多個(gè)局部最優(yōu)解,訓(xùn)練過(guò)程可能陷入這些局部最優(yōu)解中,而不是全局最優(yōu)解。梯度消失:在訓(xùn)練初期,生成器可能生成質(zhì)量極低的樣本,導(dǎo)致判別器過(guò)于容易區(qū)分真假,從而在真實(shí)數(shù)據(jù)上獲得接近1的準(zhǔn)確率,這會(huì)導(dǎo)致生成器的梯度消失,無(wú)法有效更新。模式崩潰:生成器可能只學(xué)習(xí)生成數(shù)據(jù)集中的一小部分模式,而忽略其他模式,導(dǎo)致生成的樣本多樣性不足。為了解決這些問(wèn)題,研究者們提出了多種改進(jìn)方法,包括使用不同的損失函數(shù)、正則化技術(shù)、以及訓(xùn)練策略等。5.2模式崩潰與解決方案5.2.1模式崩潰模式崩潰是GANs訓(xùn)練中常見(jiàn)的問(wèn)題,表現(xiàn)為生成器只學(xué)習(xí)生成數(shù)據(jù)集中的一小部分模式,而無(wú)法覆蓋整個(gè)數(shù)據(jù)分布。這導(dǎo)致生成的樣本多樣性不足,且可能集中在數(shù)據(jù)集中的某些局部區(qū)域。5.2.2解決方案使用WassersteinGAN(WGAN):WGAN使用Wasserstein距離作為損失函數(shù),這有助于緩解模式崩潰問(wèn)題。WGAN要求判別器(在此稱(chēng)為批評(píng)家)是Lipschitz連續(xù)的,通常通過(guò)權(quán)重裁剪或梯度懲罰來(lái)實(shí)現(xiàn)。使用條件GAN(cGAN):通過(guò)給生成器和判別器提供額外的條件信息,cGAN可以指導(dǎo)生成器學(xué)習(xí)更復(fù)雜的模式,從而增加生成樣本的多樣性。使用混合損失函數(shù):例如,將交叉熵?fù)p失與Wasserstein損失結(jié)合,可以同時(shí)利用兩種損失函數(shù)的優(yōu)點(diǎn),提高模型的穩(wěn)定性和多樣性。正則化技術(shù):如spectralnormalization(譜歸一化)和featurematching(特征匹配),這些技術(shù)有助于穩(wěn)定訓(xùn)練過(guò)程,減少模式崩潰。5.2.3示例:WassersteinGAN下面是一個(gè)使用PyTorch實(shí)現(xiàn)的WassersteinGAN的簡(jiǎn)單示例。我們將使用MNIST數(shù)據(jù)集來(lái)訓(xùn)練模型。importtorch
importtorch.nnasnn
importtorch.optimasoptim
fromtorchvisionimportdatasets,transforms
fromtorch.autogradimportVariable
#定義生成器
classGenerator(nn.Module):
def__init__(self):
super(Generator,self).__init__()
self.main=nn.Sequential(
nn.Linear(100,256),
nn.ReLU(True),
nn.Linear(256,256),
nn.ReLU(Tru
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 專(zhuān)題01 熱愛(ài)生活 熱愛(ài)寫(xiě)作+作文選材技巧-【同步作文課】六年級(jí)語(yǔ)文上冊(cè)單元寫(xiě)作深度指導(dǎo)(統(tǒng)編版2024·五四學(xué)制)
- 幼兒園小班音樂(lè)《紅眼睛》課件
- 西京學(xué)院《影像設(shè)備創(chuàng)新設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 西京學(xué)院《數(shù)控技術(shù)與編程》2021-2022學(xué)年期末試卷
- 冰淇淋素描課件
- 核心制度課件
- 管理會(huì)計(jì)實(shí)務(wù) 課件情境3、4 謀而后定:企業(yè)戰(zhàn)略執(zhí)行的有效工具、做好企業(yè)的戰(zhàn)略參謀官
- 西華師范大學(xué)《體育科學(xué)研究方法》2023-2024學(xué)年第一學(xué)期期末試卷
- 西華師范大學(xué)《科學(xué)教育學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 移動(dòng)機(jī)器人原理與技術(shù) 課件 第7、8章 移動(dòng)機(jī)器人語(yǔ)音識(shí)別與控制、移動(dòng)機(jī)器人的通信系統(tǒng)
- 二十四節(jié)氣立春課件
- 感染性物質(zhì)的運(yùn)輸管理與操作規(guī)范課件
- 職工轉(zhuǎn)移申請(qǐng)表
- 《 東北三省》課件 (公開(kāi)課獲獎(jiǎng))2022年商務(wù)星球版地理
- 網(wǎng)絡(luò)安全檢查表模板
- 貴州省火力發(fā)電企業(yè)名錄2017年125家
- 胸腔穿刺術(shù)液體腳本
- 二年級(jí)上冊(cè)科學(xué)二單元《材料》教材解讀
- 10-源代碼編譯指南
- 新教材湘教湘科版四年級(jí)上冊(cè)科學(xué) 1.1 各種各樣的聲音 教案(教學(xué)設(shè)計(jì))
- 《招標(biāo)投標(biāo)法》學(xué)習(xí)培訓(xùn)
評(píng)論
0/150
提交評(píng)論