lenet pytorch 官方demo学习笔记
生活随笔
收集整理的這篇文章主要介紹了
lenet pytorch 官方demo学习笔记
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- model
- predict
- train
教程連接
數(shù)據(jù)集 cifa10
batch 一批數(shù)據(jù)集的個數(shù)
channel 深度,灰度圖為1,rgb為3
height,width 寬高,32
在pytorch官網(wǎng)查文檔
model
#///導包時用的是torch import torch.nn as nn import torch.nn.functional as F#///流程:建一個類,這個類要繼承nn.Model這個父類,這個類中要實現(xiàn)兩個方法,一個是初始化函數(shù)(實現(xiàn)在網(wǎng)絡中要使用的網(wǎng)絡層結構),另一個是forward函數(shù)中定義正向傳播的過程,當我們實例化這個類之后,將參數(shù)傳遞到這個實例中,就會按照forward的順序進行正向傳播過程 class LeNet(nn.Module):def __init__(self)://初始化函數(shù)super(LeNet, self).__init__()//繼承,解決多繼承,調用基類的構造函數(shù)self.conv1 = nn.Conv2d(3, 16, 5)#//第一個卷積層(按住alt+鼠標左鍵查看函數(shù)定義:“采用2D卷積對輸入進行處理Applies a 2D //convolution over an input signal composed of several input planes.”)參數(shù):# self,# in_channels: int, 輸入特征矩陣的輸入(RGB為3)# out_channels: int,(卷積核的個數(shù)=輸出為深度維的特征矩陣)# kernel_size: _size_2_t,(卷積核的大小)# stride: _size_2_t = 1,(步距)# padding: _size_2_t = 0,(補齊)# dilation: _size_2_t = 1,(暫時用不到)# groups: int = 1,(暫時用不到)# bias: bool = True,(偏置)# padding_mode: str = 'zeros' # TODO: refine this type# ):self.pool1 = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(16, 32, 5)self.pool2 = nn.MaxPool2d(2, 2)self.fc1 = nn.Linear(32*5*5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)#//10是因為10分類任務,主觀修改的def forward(self, x):#x代表輸入的輸入,形式是[batch,channel,height,width]x = F.relu(self.conv1(x)) # input(3, 32, 32) output(16, 28, 28)x = self.pool1(x) # output(16, 14, 14)x = F.relu(self.conv2(x)) # output(32, 10, 10)x = self.pool2(x) # output(32, 5, 5)#與全連接層進行拼接,需要展開成為一維向量x = x.view(-1, 32*5*5) # output(32*5*5)#-1代表第一個維度是自動推理的,(batch)x = F.relu(self.fc1(x)) # output(120)x = F.relu(self.fc2(x)) # output(84)x = self.fc3(x) # output(10)return x#測試 # import torch #input1=torch.rand([32,3,32,32]) #model=LeNet() #實例化模型 #print(model) #output=莫得了(input1) #輸入predict
#調用模型權重進行預測
import torch import torchvision.transforms as transforms from PIL import Image from model import LeNettransform = transforms.Compose([transforms.Resize((32, 32)),#縮放transforms.ToTensor(),#轉化成tensortransforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])#標準化classes = ('plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck')net = LeNet() net.load_state_dict(torch.load('Lenet.pth'))#載入權重文件im = Image.open('1.jpg')#用Image模塊載入圖像 im = transform(im) # [C, H, W]#圖像的shape一般都是【】,就要轉化成pytorch tensor的格式 im = torch.unsqueeze(im, dim=0) # [N, C, H, W]#最前面增加一個batch的新維度with torch.no_grad():outputs = net(im)predict = torch.max(outputs, dim=1)[1].data.numpy() print(classes[int(predict)])train
import torch import torchvision import torch.nn as nn from model import LeNet import torch.optim as optim import torchvision.transforms as transforms # 導包transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])#Compose將一些預處理的方法打包到一起1.toTensor,把PIL或numoy改成tensor2.Normalize是標準化,使用均值與標準差來標準化tensor# 50000張訓練圖片 train_set = torchvision.datasets.CIFAR10(root='./data', train=True,download=False, transform=transform)#DOWNLOAD改成ture就下載,root表示數(shù)據(jù)集下載到什么地方,train維ture就會導入訓練集的樣本,transform就是預處理的函數(shù),在上面train_loader = torch.utils.data.DataLoader(train_set, batch_size=36,shuffle=False, num_workers=0)#把數(shù)據(jù)集導入進來并分成一批一批的,shuffle代表是否隨機挑出來,num——workers代表線程數(shù),windows下只能為0# 10000張驗證圖片,與上面相同方法 val_set = torchvision.datasets.CIFAR10(root='./data', train=False,download=False, transform=transform) val_loader = torch.utils.data.DataLoader(val_set, batch_size=5000,shuffle=False, num_workers=0) val_data_iter = iter(val_loader) #將val_loader轉化為迭代器,之后通過next的方法就能獲取一批數(shù)據(jù),就包括測試的圖像與圖像對應的標簽值 val_image, val_label = val_data_iter.next()# classes = ('plane', 'car', 'bird', 'cat', # 'deer', 'dog', 'frog', 'horse', 'ship', 'truck') #將10個標簽導入,是元組類型,值不能改index0就對應表簽飛機 #用官方的imshow可以看圖片(numpy與matplotlib包)29:23 net = LeNet()#實例化模型 loss_function = nn.CrossEntropyLoss()#定義損失函數(shù)(有softmax) optimizer = optim.Adam(net.parameters(), lr=0.001)#優(yōu)化器用的adam,傳入的是要訓練的參數(shù),lr是學習率for epoch in range(5): # loop over the dataset multiple times #要將訓練集訓練多少輪running_loss = 0.0#用來累加訓練中的損失for step, data in enumerate(train_loader, start=0):#遍歷訓練集樣本,enumrate不僅返回每一批的數(shù)據(jù)data,還返回這一批data對應的步數(shù),start=0從0開始# get the inputs; data is a list of [inputs, labels]inputs, labels = data#分成圖像與標簽# zero the parameter gradientsoptimizer.zero_grad()#將歷史損失梯度清零,不清零可能對計算的歷史梯度進行累加(多次進行小batch的訓練)# forward + backward + optimizeoutputs = net(inputs)#輸入網(wǎng)絡得到輸出loss = loss_function(outputs, labels)#根據(jù)之前定義的損失函數(shù)、輸出、真實標簽求得損失loss.backward()#反向穿播optimizer.step()#參數(shù)更新# print statisticsrunning_loss += loss.item()#將loss累加if step % 500 == 499: # print every 500 mini-batcheswith torch.no_grad():#在接下來的計算過程中不要去計算每個節(jié)點的誤差損失梯度,不用的話,測試過程中也會計算1.會占用更多算力2.占用更多內存資源outputs = net(val_image) # [batch, 10]predict_y = torch.max(outputs, dim=1)[1]#尋找輸出的最大index在什么位置:網(wǎng)絡預測最可能是哪一類,dim是第幾個維度,【1】是只需要知道是哪一類就行了accuracy = (predict_y == val_label).sum().item() / val_label.size(0)#//與類別進行比較(是個tensor(數(shù)值),sum求和是個數(shù)值),正確率print('[%d, %5d] train_loss: %.3f test_accuracy: %.3f' %(epoch + 1, step + 1, running_loss / 500, accuracy))#epoch代表迭代到多少輪,step,某一輪到多少步,平均訓練誤差,準確率running_loss = 0.0#清零并進行下一輪print('Finished Training')save_path = './Lenet.pth'#模型進行保存 torch.save(net.state_dict(), save_path)#保存的是參數(shù) 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的lenet pytorch 官方demo学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC将Base64 保存为图片
- 下一篇: JSSDK制作思路