LeNet试验(一) 搭建pytorch版模型及运行
生活随笔
收集整理的這篇文章主要介紹了
LeNet试验(一) 搭建pytorch版模型及运行
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??LeNet非常簡單,在MNIST數據集運行速度很快,所以開辟LeNet試驗系列文章,以試驗各種語句、技巧的效果,分析神經網絡的一些特性。
1,Pytorch版本LeNet代碼
??數據路徑為’minst/’,文件夾內放置minst集中的四個gz文件,代碼文件放在文件夾外面。
import gzip, struct import numpy as npimport torch from torch import nn from torch.nn import functional as F from torch.utils.data import Dataset, DataLoader#讀取數據的函數 def _read(image, label):minist_dir = 'mnist/'with gzip.open(minist_dir + label) as flbl:magic, num = struct.unpack(">II", flbl.read(8))label = np.fromstring(flbl.read(), dtype=np.int8)with gzip.open(minist_dir + image, 'rb') as fimg:magic, num, rows, cols = struct.unpack(">IIII", fimg.read(16))image = np.fromstring(fimg.read(), dtype=np.uint8).reshape(len(label), rows, cols)return image, label #讀取數據 def get_data():train_img, train_label = _read('train-images-idx3-ubyte.gz','train-labels-idx1-ubyte.gz')test_img, test_label = _read('t10k-images-idx3-ubyte.gz','t10k-labels-idx1-ubyte.gz')return [train_img, train_label, test_img, test_label]#定義lenet5 class LeNet5(nn.Module):def __init__(self):'''構造函數,定義網絡的結構'''super().__init__()#定義卷積層self.conv1 = nn.Conv2d(1, 6, 5, padding=2)#第二個卷積層,6個輸入,16個輸出,5*5的卷積filter 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)def forward(self, x):'''前向傳播函數'''#先卷積,然后調用relu激活函數,再最大值池化操作x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))#第二次卷積+池化操作x = F.max_pool2d(F.relu(self.conv2(x)), (2, 2))#重新塑形,將多維數據重新塑造為二維數據,256*400x = x.view(-1, self.num_flat_features(x))#print('size', x.size())#第一個全連接x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return xdef num_flat_features(self, x):#x.size()返回值為(256, 16, 5, 5),size的值為(16, 5, 5),256是batch_sizesize = x.size()[1:] num_features = 1for s in size:num_features *= sreturn num_features #訓練函數 def train(epoch):#調用前向傳播model.train() train_loss = 0for batch_idx, (data, target) in enumerate(train_loader):if use_gpu:data, target = data.cuda(), target.cuda()optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()train_loss += loss.item()train_loss /= len(train_loader.dataset)print('Train Epoch: {} \tTrain Loss: {:.6f}'.format(epoch, train_loss))#定義測試函數 def test():model.eval() #測試模式,主要是保證dropout和BN和訓練過程一致。test_loss = 0correct = 0for data, target in test_loader:if use_gpu:data, target = data.cuda(), target.cuda()output = model(data)#計算總的損失test_loss += criterion(output, target).item()pred = output.data.max(1, keepdim=True)[1] #獲得得分最高的類別correct += pred.eq(target.data.view_as(pred)).cpu().sum()test_loss /= len(test_loader.dataset)print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.2f}%)\n'.format(test_loss, correct, len(test_loader.dataset),100. * correct / len(test_loader.dataset)))class DealDataset(Dataset):"""數據封裝成dataset類型"""def __init__(self,mode='train'):X, y, Xt, yt = get_data()if mode=='train':self.x_data = Xself.y_data = yelif mode=='test':self.x_data = Xtself.y_data = ytself.x_data = torch.from_numpy(self.x_data.reshape(-1, 1, 28, 28)).float()self.y_data = torch.from_numpy(self.y_data).long()self.len = self.x_data.shape[0]def __getitem__(self, index):data = self.x_data[index]target = self.y_data[index]return data, targetdef __len__(self):return self.len#封裝數據集 train_dataset = DealDataset(mode='train') test_dataset = DealDataset(mode='test') #定義數據加載器 kwargs = {"num_workers": 0, "pin_memory": True} train_loader = DataLoader(dataset=train_dataset, shuffle=True, batch_size=256, **kwargs) test_loader = DataLoader(dataset=test_dataset, shuffle=True, batch_size=256, **kwargs)#實例化網絡 model = LeNet5() #是否使用GPU use_gpu = torch.cuda.is_available() if use_gpu:model = model.cuda()print('USE GPU') else:print('USE CPU') #使用交叉熵損失函數 criterion = nn.CrossEntropyLoss(size_average=False) #優化器 optimizer = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.99))#執行訓練和測試 for epoch in range(1, 101):train(epoch)test()2,運行
運行結果:
下面幾個畫圖的代碼上面沒有。
train_loss:
test_loss:
accuarcy:
總結
以上是生活随笔為你收集整理的LeNet试验(一) 搭建pytorch版模型及运行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeNet试验(二)权重参数随训练的变化
- 下一篇: MobileNet、GhostNet理解