pyTorch深度學(xué)習(xí)softmax實(shí)現(xiàn)解析
用PyTorch實(shí)現(xiàn)linear模型
模擬數(shù)據(jù)集
num_inputs = 2 #feature number num_examples = 1000 #訓(xùn)練樣本個(gè)數(shù) true_w = torch.tensor([[2],[-3.4]]) #真實(shí)的權(quán)重值 true_b = torch.tensor(4.2) #真實(shí)的bias samples = torch.normal(0,1,(num_examples,num_inputs)) noise = torch.normal(0,0.01,(num_examples,1)) labels = samples.matmul(true_w) + true_b + noise
定義模型
class LinearNet(nn.Module): def __init__(self,in_features): super().__init__() self.fc = nn.Linear(in_features=2,out_features=1) def forward(self,t): t = self.fc(t) return t
加載數(shù)據(jù)集
import torch.utils.data as Data dataset = Data.TensorDataset(samples,labels)#類(lèi)似于zip,把兩個(gè)張量打包 data_loader = Data.DataLoader(dataset,batch_size=100,shuffle=True)
optimizer
network = LinearNet(2) optimizer = optim.SGD(network.paramters(),lr=0.05)
模型訓(xùn)練
for epoch in range(10):
total_loss = 0
for data,label in data_loader:
predict = network(data)
loss = F.mse_loss(predict,label)
total_loss += loss.item()
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(
'epoch',epoch,
'loss',total_loss,
'weight',network.weight,
'bias',network.bias
)
softmax回歸模型
sotfmax主要用于分類(lèi)任務(wù)。regression最終得到的是一個(gè)scalar,根據(jù)input中的feature線性相加得到一個(gè)output。分類(lèi)任務(wù)的結(jié)果是一個(gè)類(lèi)別,是離散的。
假設(shè)現(xiàn)在有一批圖片是2 * 2大小的灰度圖片,這樣圖片中的每隔二像素用一個(gè)標(biāo)量表示就行了。這批圖片一種是三類(lèi)小動(dòng)物,第一類(lèi)是小狗,第二類(lèi)是小貓,第三類(lèi)是小兔子。
每張圖片總共4個(gè)像素點(diǎn),我們可以看作是4個(gè)feature,假設(shè)這三類(lèi)小動(dòng)物的圖片線性可分,每一類(lèi)對(duì)應(yīng)一組weight和一個(gè)bias。

可以根據(jù)輸出值較大的來(lái)決定哪一類(lèi),可這樣有個(gè)問(wèn)題,首先輸出值沒(méi)有明確的意義,且可能是實(shí)數(shù)范圍。其次,不好衡量輸出值與真實(shí)值之間的差距。所以采用softmax操作,將三個(gè)輸出值轉(zhuǎn)化成概率值,這樣輸出結(jié)果滿(mǎn)足概率分布。label采用one-hot編碼,相當(dāng)于對(duì)應(yīng)類(lèi)別的概率是1,這樣就可以用cross_entropy來(lái)計(jì)算loss。
Fashion-MNIST
本次學(xué)習(xí)softmax模型采用torchvision.datasets中的Fashion-MNIST。
import torchvision import torchvision.transforms as transforms train_set = torchvision.datasets.FashionMNIST( root='./data', train=True, download=True, transform=transforms.ToTensor() )
transforms.ToTensor()將尺寸為(H x W x C)且數(shù)據(jù)位于(0,255)的PIL圖片或者數(shù)據(jù)類(lèi)型為np.uint8的NumPy數(shù)組轉(zhuǎn)換為尺寸為C x H x W且數(shù)據(jù)類(lèi)型為torch.float32且位于(0.0,1.0)的Tensor
len(train_set),len(test_set) > (60000,10000)
展示一下數(shù)據(jù)集中的圖片
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
for i,(image,lable) in enumerate(train_set,start=1):
plt.subplot(1,10,i)
plt.imshow(image.squeeze())
plt.title(train_set.classes[lable])
plt.axis('off')
if i == 10:
break
plt.show()

train_loader = torch.utils.data.DataLoader(train_set,batch_size=100,shuffle=True,num_workers=4) test_loader = torch.utils.data.DataLoader(test_set,batch_size=100,shuffle=False,num_workers=1)
cross_entropy
def net(samples,w,b): samples = samples.flatten(start_dim=1) #將c,h,w三個(gè)軸展成一個(gè)feature軸,長(zhǎng)度為28 * 28 samples = torch.exp(samples)#全體元素取以e為底的指數(shù) partial_sum = samples.sum(dim=1,keepdim=True) samples = samples / partial_sum #歸一化,得概率,這里還應(yīng)用了廣播機(jī)制 return samples.matmul(w) + b

i表示label對(duì)應(yīng)的種類(lèi),pi為真實(shí)種類(lèi)的預(yù)測(cè)概率,log是以e為底的對(duì)數(shù)
這里gather函數(shù)的作用,就是在predict上取到對(duì)應(yīng)label的概率值,注意負(fù)號(hào)不能丟,pytorch中的cross_entropy對(duì)輸入先進(jìn)行一次softmax操作,以保證輸入都是正的。
模型的實(shí)現(xiàn)
def net(samples,w,b): samples = samples.flatten(start_dim=1) #將c,h,w三個(gè)軸展成一個(gè)feature軸,長(zhǎng)度為28 * 28 samples = torch.exp(samples)#全體元素取以e為底的指數(shù) partial_sum = samples.sum(dim=1,keepdim=True) samples = samples / partial_sum #歸一化,得概率,這里還應(yīng)用了廣播機(jī)制 return samples.matmul(w) + b
利用PyTorch簡(jiǎn)易實(shí)現(xiàn)softmax
import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F
import torch.utils.data as Data
import torchvision.transforms as transforms
import torch.optim as optim
import torch.nn.init as init
class SoftmaxNet(nn.Module):
def __init__(self,in_features,out_features):
super().__init__()
self.fc = nn.Linear(in_features=in_features,out_features=out_features)
def forward(self,t):
t = t.flatten(start_dim=1)
t = self.fc(t)
return t
train_set = torchvision.datasets.FashionMNIST(
root='E:\project\python\jupyterbook\data',
train=True,
download=True,
transform=transforms.ToTensor()
)
test_set = torchvision.datasets.FashionMNIST(
root='E:\project\python\jupyterbook\data',
train=False,
download=True,
transform=transforms.ToTensor()
)
train_loader = Data.DataLoader(
train_set,
batch_size=100,
shuffle=True,
#num_workers=2
)
test_loader = Data.DataLoader(
test_set,
batch_size=100,
shuffle=False,
#num_workers=2
)
@torch.no_grad()
def get_correct_nums(predict,labels):
return predict.argmax(dim=1).eq(labels).sum().item()
@torch.no_grad()
def evaluate(test_loader,net,total_num):
correct = 0
for image,label in test_loader:
predict = net(image)
correct += get_correct_nums(predict,label)
pass
return correct / total_num
network = SoftmaxNet()
optimizer = optim.SGD(network.parameters(),lr=0.05)
for epoch in range(10):
total_loss = 0
total_correct = 0
for image,label in train_loader:
predict = network(image)
loss = F.cross_entropy(predict,label)
total_loss += loss.item()
total_correct += get_correct_nums(predict,label)
optimizer.zero_grad()
loss.backward()
optimizer.step()
pass
print(
'epoch',epoch,
'loss',total_loss,
'train_acc',total_correct / len(train_set),
'test_acc',evaluate(test_loader,network,len(test_set))
)
以上就是pytorch深度學(xué)習(xí)softmax實(shí)現(xiàn)解析的詳細(xì)內(nèi)容,更多關(guān)于pytorch深度學(xué)習(xí)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python在線編譯器的簡(jiǎn)單原理及簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章主要介紹了python在線編譯器的簡(jiǎn)單原理及簡(jiǎn)單實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Python筆記之Scipy.stats.norm函數(shù)使用解析
這篇文章主要介紹了Python筆記之Scipy.stats.norm函數(shù)使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
python+matplotlib繪制旋轉(zhuǎn)橢圓實(shí)例代碼
這篇文章主要介紹了python+matplotlib繪制旋轉(zhuǎn)橢圓實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
用Python進(jìn)行行為驅(qū)動(dòng)開(kāi)發(fā)的入門(mén)教程
這篇文章主要介紹了用Python進(jìn)行行為驅(qū)動(dòng)開(kāi)發(fā)的入門(mén)教程,本文也對(duì)BDD的概念做了詳細(xì)的解釋,需要的朋友可以參考下2015-04-04
Python?網(wǎng)易易盾滑塊驗(yàn)證功能的實(shí)現(xiàn)
這篇文章主要介紹了Python?網(wǎng)易易盾滑塊驗(yàn)證,主要是借助之前寫(xiě)阿里云盾滑塊和極驗(yàn)滑塊的經(jīng)驗(yàn)寫(xiě)的本文,通過(guò)使用selenium請(qǐng)求url,并觸發(fā)滑塊驗(yàn)證,需要的朋友可以參考下2022-05-05
Python使用sqlalchemy實(shí)現(xiàn)連接數(shù)據(jù)庫(kù)的幫助類(lèi)
這篇文章主要為大家詳細(xì)介紹了Python如何使用sqlalchemy實(shí)現(xiàn)連接數(shù)據(jù)庫(kù)的幫助類(lèi),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考下2024-02-02
Python測(cè)試線程應(yīng)用程序過(guò)程解析
這篇文章主要介紹了Python測(cè)試線程應(yīng)用程序過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

