<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
環境:
要求:
環境:python3.6,1080ti,pytorch1.10(實驗室伺服器的環境)
import torch import torch.nn as nn import matplotlib.pyplot as plt import torchvision device = torch.device("cuda" if torch.cuda.is_available() else "cpu") device
train_ds = torchvision.datasets.MNIST('data', train=True, transform=torchvision.transforms.ToTensor(), # 將資料型別轉化為Tensor download=True) test_ds = torchvision.datasets.MNIST('data', train=False, transform=torchvision.transforms.ToTensor(), # 將資料型別轉化為Tensor download=True)
設定資料尺寸
batch_size = 32
設定dataset
train_dl = torch.utils.data.DataLoader(train_ds, batch_size=batch_size, shuffle=True) test_dl = torch.utils.data.DataLoader(test_ds, batch_size=batch_size)
列印部分圖片:
import numpy as np # 指定圖片大小,影象大小為20寬、5高的繪圖(單位為英寸inch) plt.figure(figsize=(20, 5)) for i, imgs in enumerate(imgs[:20]): # 維度縮減 npimg = imgs.numpy().transpose((1, 2, 0)) # 將整個figure分成2行10列,繪製第i+1個子圖。 plt.subplot(2, 10, i+1) plt.imshow(npimg, cmap=plt.cm.binary) plt.axis('off')
輸出資料的尺寸:
# 取一個批次檢視資料格式 # 資料的shape為:[batch_size, channel, height, weight] # 其中batch_size為自己設定,channel,height和weight分別是圖片的通道數,高度和寬度。 imgs, labels = next(iter(train_dl)) imgs.shape
import torch from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential,ReLU num_classes = 10 class Model(nn.Module): def __init__(self): super(Model,self).__init__() # 折積層 self.layers = Sequential( # 第一層 Conv2d(3, 64, kernel_size=3), MaxPool2d(2), ReLU(), # 第二層 Conv2d(64, 64, kernel_size=3), MaxPool2d(2), ReLU(), Conv2d(64, 128, kernel_size=3), MaxPool2d(2), ReLU(), Flatten(), Linear(512, 256,bias=True), ReLU(), Linear(256, 64,bias=True), ReLU(), Linear(64, num_classes,bias=True) ) def forward(self, x): x = self.layers(x) return x
列印網路結構:
vgg16網路搭建:未修改尺寸
from torch import nn vgg16=torchvision.models.vgg16(pretrained=True)#經過訓練的 class Model(nn.Module): def __init__(self): super(Model,self).__init__() # 折積層 self.layers = Sequential( vgg16 ) def forward(self, x): x = self.layers(x) return x
vgg16網路搭建:修改尺寸
loss_fn = nn.CrossEntropyLoss() # 建立損失函數 learn_rate = 1e-2 # 學習率 opt = torch.optim.SGD(model.parameters(),lr=learn_rate)
訓練函數:
# 訓練迴圈 def train(dataloader, model, loss_fn, optimizer): size = len(dataloader.dataset) # 訓練集的大小,一共60000張圖片 num_batches = len(dataloader) # 批次數目,1875(60000/32) train_loss, train_acc = 0, 0 # 初始化訓練損失和正確率 for X, y in dataloader: # 獲取圖片及其標籤 X, y = X.to(device), y.to(device) # 計算預測誤差 pred = model(X) # 網路輸出 loss = loss_fn(pred, y) # 計算網路輸出和真實值之間的差距,targets為真實值,計算二者差值即為損失 # 反向傳播 optimizer.zero_grad() # grad屬性歸零 loss.backward() # 反向傳播 optimizer.step() # 每一步自動更新 # 記錄acc與loss train_acc += (pred.argmax(1) == y).type(torch.float).sum().item() train_loss += loss.item() train_acc /= size train_loss /= num_batches return train_acc, train_loss
測試函數 :
def test (dataloader, model, loss_fn): size = len(dataloader.dataset) # 測試集的大小,一共10000張圖片 num_batches = len(dataloader) # 批次數目,313(10000/32=312.5,向上取整) test_loss, test_acc = 0, 0 # 當不進行訓練時,停止梯度更新,節省計算記憶體消耗 with torch.no_grad(): for imgs, target in dataloader: imgs, target = imgs.to(device), target.to(device) # 計算loss target_pred = model(imgs) loss = loss_fn(target_pred, target) test_loss += loss.item() test_acc += (target_pred.argmax(1) == target).type(torch.float).sum().item() test_acc /= size test_loss /= num_batches return test_acc, test_loss
具體訓練程式碼 :
epochs = 20 train_loss = [] train_acc = [] test_loss = [] test_acc = [] for epoch in range(epochs): model.train() epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, opt) model.eval() epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn) train_acc.append(epoch_train_acc) train_loss.append(epoch_train_loss) test_acc.append(epoch_test_acc) test_loss.append(epoch_test_loss) template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%,Test_loss:{:.3f}') print(template.format(epoch+1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss)) print('Done')
折積層:32->30因為((32-3)/1)+1=30
池化池:30->15因為30÷2=15
具體計算可以參考我題目開頭的文章,這裡不在贅述
我們可以看到本次訓練效果不好,那我們可以利用經典網路vgg16進行修改,準確率提高到了百分之88了。
其程式碼如上:
到此這篇關於pytorch-實現mnist手寫彩色數位識別的文章就介紹到這了,更多相關pytorch mnist內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45