日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch 训练过程acc_pytorch入门练手:一个简单的CNN模型

發布時間:2025/7/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch 训练过程acc_pytorch入门练手:一个简单的CNN模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于新型冠狀肺炎疫情一直沒能開學,在家自己學習了一下pytorch,本來說按著官網的60分鐘教程過一遍的,但是CIFAR-10數據庫的下載速度太慢了……

這臺電腦里也沒有現成的數據庫,想起之前畫了一些粒子的動量分量分布圖,干脆拿來用了,也沒期待它能表現得多好,主要圖一個練手。(事實證明它表現相當差,不過這也在意料之中)

那么開始。

import torch import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as np from PIL import Image import torch.nn as nn import torch.nn.functional as F import torch.optim as optim

接下來定義讀取和處理圖片的函數,圖片尺寸是432x288,把它切成中間的288x288,再縮小成32x32。這樣的處理單純是為了讓模型訓練得快一點,畢竟這次練手本身的目的不是訓練一個高精度的模型,而是訓練一個模型。(而且話說回來這電腦也莫得英偉達高性能圖形處理器,(笑))

這里其實兩個函數寫成一個就行,但是我懶得改了。

PATH = '/Users/huangyige/Downloads/fig/'def load_img(imgname):#here, only consider pion at 7.7 and 14.5 GeV, px.img = Image.open(imgname).convert('RGB')return imgdef process_img(img):img = img.crop((72,0,360,288))img = img.resize((32,32))return img

然后隨意拉張圖進來看看。

img = load_img(PATH+'Pion-7.7GeV-7-P1.png') img = process_img(img) plt.imshow(img)

只能隱約能看出來有兩個峰2333333,這樣的數據集能訓練出來個鬼咯~

然后生成兩個數據集的文件名列表(附帶標簽)的文檔。

def generate_file(name,num_range):with open('./'+name+'.txt','w') as f:for energy in ['7.7','14.5']:for _ in num_range:imgname = PATH + 'Pion-' + energy + 'GeV-' + str(_+1) + '-P1.png'f.write(imgname+' '+energy+'n')return generate_file('train',range(0,70)) generate_file('test',range(70,90))

就別問我為什么訓練集就70張圖,測試集就20張圖了,只有這么點數據……可以打開文檔看看效果。

差不多就這樣,沒什么問題。接下來定義自定義Dataset類。

class sets(torch.utils.data.Dataset):def __init__(self,datatxt,transform=None):super(sets,self).__init__()imgs = []with open(datatxt,'r') as f:for line in f:line = line.rstrip('n')words = line.split(' ')imgs.append((words[0],words[1]))self.imgs = imgsself.transform = transformreturndef __getitem__(self,index):imgname,label_o = self.imgs[index]img = load_img(imgname)img = process_img(img)if label_o == '7.7':label = 0else:label = 1if self.transform is not None:img = self.transform(img)return img,labeldef __len__(self):return len(self.imgs)

以及DataLoader。

train_set = sets('./train.txt',transforms.ToTensor()) test_set = sets('./test.txt',transforms.ToTensor())train_loader = torch.utils.data.DataLoader(dataset=train_set,batch_size=1,shuffle=True) test_loader = torch.utils.data.DataLoader(dataset=test_set,batch_size=1)

batch_size選1是不是很扯,哈哈哈我也這么覺得。如果需要做數據增強,在初始化sets時,transform參數用transforms.Compose[transforms.ToTensor(),...]這樣多填幾個就行了。

然后是模型的結構。

class Net(nn.Module):def __init__(self):super(Net,self).__init__()self.conv1 = nn.Conv2d(3,6,5)self.pool = nn.MaxPool2d(2,2)self.conv2 = nn.Conv2d(6,16,5)self.fc1 = nn.Linear(16*5*5,120)self.fc2 = nn.Linear(120,84)#self.fc3 = nn.Linear(84,10)self.fc3 = nn.Linear(84,2)returndef forward(self,x):x = self.pool(F.relu(self.conv1(x)))x = self.pool(F.relu(self.conv2(x)))x = x.view(-1,16*5*5)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xnet = Net()

直接把pytorch官網的tutorial里CIFAR-10的模型拉出來用了,正好我已經把數據變成了32x32,參數都不用改。(修改:最后一個全鏈接層的神經元數應該是2而不是10,還是得改一下的)

選損失函數和優化器。

criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(),lr=0.001,momentum=0.9)

pytorch沒有現成的算accuracy的函數所以自己寫一個。

def accuracy(net,test_loder):correct = 0total = 0with torch.no_grad():for data in test_loader:inputs,labels = dataoutputs = net(inputs)_,pred = torch.max(outputs.data,1)total += labels.size(0)correct += (pred==labels).sum().item()acc = 100.0*correct/totalreturn acc

然后就可以開始訓練了,本來也只是個玩具模型,所以2代就夠了。不得不插一嘴,keras用起來確實要方便一點。

for epoch in range(2):running_loss = 0.0for i,data in enumerate(train_loader,0):inputs,labels = dataoptimizer.zero_grad()outputs = net(inputs)loss = criterion(outputs,labels)loss.backward()optimizer.step()running_loss += loss.item()acc = accuracy(net,test_loader)print('r[epoch %d >%3.d<] loss:%.3f,acc:%.1f%%'%(epoch+1,i+1,loss,acc),end='')print('') print('Done!')

看看效果:

精度精準地鎖定在50%,也就是說這模型在純猜~whatever,這次練手主要是熟悉pytorch怎么用,模型本身的質量不重要。

最后保存一下模型:

torch.save(net.state_dict(),'./model.pth')

想開學啊啊啊啊啊……

總結

以上是生活随笔為你收集整理的pytorch 训练过程acc_pytorch入门练手:一个简单的CNN模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。