五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動(dòng)態(tài)

pyTorch深度學(xué)習(xí)softmax實(shí)現(xiàn)解析

發(fā)布日期:2021-12-29 07:25 | 文章來(lái)源:gibhub

用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)#類似于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主要用于分類任務(wù)。regression最終得到的是一個(gè)scalar,根據(jù)input中的feature線性相加得到一個(gè)output。分類任務(wù)的結(jié)果是一個(gè)類別,是離散的。
假設(shè)現(xiàn)在有一批圖片是2 * 2大小的灰度圖片,這樣圖片中的每隔二像素用一個(gè)標(biāo)量表示就行了。這批圖片一種是三類小動(dòng)物,第一類是小狗,第二類是小貓,第三類是小兔子。
每張圖片總共4個(gè)像素點(diǎn),我們可以看作是4個(gè)feature,假設(shè)這三類小動(dòng)物的圖片線性可分,每一類對(duì)應(yīng)一組weight和一個(gè)bias。

可以根據(jù)輸出值較大的來(lái)決定哪一類,可這樣有個(gè)問(wèn)題,首先輸出值沒(méi)有明確的意義,且可能是實(shí)數(shù)范圍。其次,不好衡量輸出值與真實(shí)值之間的差距。所以采用softmax操作,將三個(gè)輸出值轉(zhuǎn)化成概率值,這樣輸出結(jié)果滿足概率分布。label采用one-hot編碼,相當(dāng)于對(duì)應(yīng)類別的概率是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ù)類型為np.uint8的NumPy數(shù)組轉(zhuǎn)換為尺寸為C x H x W且數(shù)據(jù)類型為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)的種類,pi為真實(shí)種類的預(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)文章!

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部