訓練模型並驗證(CIFAR10數據集)

2022-01-12 滑稽研究所
CIFAR10這個數據集我們之前已經使用過了。是一個擁有十個分類的模型。本期我們進行一次完整的模型並測試。
import torchimport torchvisionfrom torch.utils.tensorboard import SummaryWriter
from torch import nnfrom torch.utils.data import DataLoader
device = torch.device("cuda")
train_data = torchvision.datasets.CIFAR10(root="./dataset_CIFAR10", train=True, transform=torchvision.transforms.ToTensor(), download=True)test_data = torchvision.datasets.CIFAR10(root="./dataset_CIFAR10", train=False, transform=torchvision.transforms.ToTensor(), download=True)
train_data_size = len(train_data)test_data_size = len(test_data)print("訓練數據集的長度為:{}".format(train_data_size))print("測試數據集的長度為:{}".format(test_data_size))

train_dataloader = DataLoader(train_data, batch_size=64)test_dataloader = DataLoader(test_data, batch_size=64)
class Huaji(nn.Module): def __init__(self): super(Huaji, self).__init__() self.model = nn.Sequential( nn.Conv2d(3, 32, 5, 1, 2), nn.MaxPool2d(2), nn.Conv2d(32, 32, 5, 1, 2), nn.MaxPool2d(2), nn.Conv2d(32, 64, 5, 1, 2), nn.MaxPool2d(2), nn.Flatten(), nn.Linear(64*4*4, 64), nn.Linear(64, 10) )
def forward(self, x): x = self.model(x) return xhuaji = Huaji()huaji = huaji.to(device)
loss_fn = nn.CrossEntropyLoss()loss_fn = loss_fn.to(device)learning_rate = 1e-2optimizer = torch.optim.SGD(huaji.parameters(), lr=learning_rate)
total_train_step = 0total_test_step = 0epoch = 30
writer = SummaryWriter("../logs_train")
for i in range(epoch): print("--第 {} 輪訓練開始--".format(i+1))
huaji.train() for data in train_dataloader: imgs, targets = data imgs = imgs.to(device) targets = targets.to(device) outputs = huaji(imgs) loss = loss_fn(outputs, targets)
optimizer.zero_grad() loss.backward() optimizer.step()
total_train_step = total_train_step + 1 if total_train_step % 100 == 0: print("訓練次數:{}, Loss: {}".format(total_train_step, loss.item())) writer.add_scalar("train_loss", loss.item(), total_train_step)
huaji.eval() total_test_loss = 0 total_accuracy = 0 with torch.no_grad(): for data in test_dataloader: imgs, targets = data imgs = imgs.to(device) targets = targets.to(device) outputs = huaji(imgs) loss = loss_fn(outputs, targets) total_test_loss = total_test_loss + loss.item() accuracy = (outputs.argmax(1) == targets).sum() total_accuracy = total_accuracy + accuracy
print("整體測試集上的Loss: {}".format(total_test_loss)) print("整體測試集上的正確率: {}".format(total_accuracy/test_data_size)) writer.add_scalar("test_loss", total_test_loss, total_test_step) writer.add_scalar("test_accuracy", total_accuracy/test_data_size, total_test_step) total_test_step = total_test_step + 1
torch.save(huaji, "huaji_{}.pth".format(i)) print("模型已保存")
writer.close()

使用GPU會大大提升模型的訓練速度,我們這裡就是用GPU進行訓練,如果你的PC上無法使用GPU,可以將代碼第10行的參數改為CPU。93行以上的代碼都是我們往期一一敲過的,我們把它組合起來。第97行代碼的作用是去掉數據的梯度,因為這裡我們是使用測試集給我們的模型打分,即給出當前的準確率。梯度在這裡不僅沒有作用,還會佔用我們的電腦資源。
我們把跑出的模型在測試機裡過一遍,得出數據,然後再與正確的結果進行對比,計算出判斷正確的個數之後,就得到了正確率。104行的item(),的佔用是把tensor類型轉化為int類型。在我們的驗證代碼裡還會用到它。
import torchimport torchvisionfrom PIL import Imagefrom torch import nn

c1 = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']image_path = r"E:\pycharm\code\learn_torch\imgs\04.png"image = Image.open(image_path)print(image)image = image.convert('RGB')transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32, 32)), torchvision.transforms.ToTensor()])
image = transform(image)print(image.shape)
class Huaji(nn.Module): def __init__(self): super(Huaji, self).__init__() self.model = nn.Sequential( nn.Conv2d(3, 32, 5, 1, 2), nn.MaxPool2d(2), nn.Conv2d(32, 32, 5, 1, 2), nn.MaxPool2d(2), nn.Conv2d(32, 64, 5, 1, 2), nn.MaxPool2d(2), nn.Flatten(), nn.Linear(64*4*4, 64), nn.Linear(64, 10) )
def forward(self, x): x = self.model(x) return x
model = torch.load("huaji_29.pth", map_location=torch.device('cpu'))print(model)image = torch.reshape(image, (1, 3, 32, 32))model.eval()with torch.no_grad(): output = model(image)print(output)
print(c1[output.argmax(1).item()])

注意我們需要把輸入圖片轉換成要求的格式,因此我們需要將圖片轉換成3通道且32*32大小的圖片,我們的模型要求輸入是4維的,我們通過reshape使其為1 batch_size。這樣就完成了對維度的要求,代碼第12行的作用是將圖片轉換成3通道,在學習opencv時,我們就了解到,有些圖片的格式是4通道,除了RGB外還有另一個Alpha Channel即透明度通道,我們需要去掉它。這裡的模型我們跑了30個循環,我們來看一下運行結果。

可以看到在測試集上的正確率是65%多一些,我們是十分類,這樣的正確率並不算差。我最開始只進行了10次循環,正確率在55%左右,可以看到增加訓練的次數,可以提高我們模型判斷的正確率。但要記住並不是增加足夠多的次數,正確率就能達到100%,它會有一個瓶頸,當它卡住時,只增加訓練次數並不會為我們的模型帶來更多的優化,這時我們就需要考慮其他方面,如增加訓練樣本,對模型自身進行優化,或是調整學習率等等。
接下來我們隨機在網上找一些圖片,這裡我找了6張如下。

分別是汽車、輪船、貓、飛機、飛機、貓。接著我們把上面的圖片交給我們訓練好的模型,依次得出以下結果。為了方便,我把tensor進行了相應的轉換。實際上返回的是tensor數據裡最大的值對應的位置。是訓練代碼第105行,前半部分代碼的作用

我們的模型判斷它們為汽車、輪船、鹿、鳥、飛機、貓。我們發現4,5張圖片判斷錯誤,分別把貓判斷成了鹿,把飛機判斷成了鳥。我們的正確率是65%多一些,你可以試著增加訓練次數,或是增加訓練樣本,看一下模型的正確率是否會提高。

到此為止,我們完成了一次完整的模型訓練,並進行了實際的測試。

相關焦點

  • TensorFlow (2) CIFAR-10 簡單圖像識別
    本文主要學習獲取 CIFAR-10 數據集,通過簡單的模型對數據集進行訓練和識別。
  • 機器學習模型數據集劃分問題(交叉驗證)
    本次的話題是有關在機器學習模型構建中數據集劃分問題。在機器學習建模中,通常需要將數據集劃分為兩部分,訓練集、測試集。
  • ​NVIDIA針對數據不充分數據集進行生成改進,大幅提高CIFAR-10數據生成
    ,這點在各大主流優秀的生成對抗網絡模型下得到驗證。文章中做了在不同量級下數據集對生成質量的影響,結果如圖 1 所示。圖 1a 顯示了 FFHQ 不同子集的基線結果,在每種情況下,訓練都以相同的方式開始,但是隨著訓練的進行,FID 開始上升。訓練數據越少,越早發生。圖 1b,c 顯示了訓練過程中真實圖像和生成圖像的判別器輸出分布。
  • 機器學習|模型選擇之劃分數據集及Sklearn實現
    也就是說測試誤差是用來評估模型對於新樣本的學習能力,因此我們更關注的是測試誤差,我們希望模型可以從現有的數據中學習到普遍規律而用於新樣本。 因此我們需要將現有數據集(data set)劃分為訓練集(training set)和測試集(test set),其中訓練集用來訓練模型,而測試集用來驗證模型對新樣本的判別能力。
  • 業界 | MXNet開放支持Keras,高效實現CNN與RNN的分布式訓練
    >現在我們在 CIFAR-10 數據集上訓練 ResNet 模型,來識別 10 個類別:飛機、汽車、鳥、貓、鹿、狗、青蛙、馬、船和卡車。接下來,如果你有四個 GPU,那麼你需要原樣運行該腳本;否則,你需要運行以下命令來打開腳本進行編輯:$ vi cifar10_resnet_multi_gpu.py該腳本具備以下行,該行定義 GPU 的數量。如有必要,更新該行。model = multi_gpu_model(model, gpus=4)現在,開始訓練。
  • 數據科學32 |機器學習-訓練模型
    數據分割在構建預測模型的開始可以使用數據分割構建訓練集和測試集,也可以在訓練集中用於執行交叉驗證或自舉(bootstrapping),以評估模型。, p = 0.75, list = FALSE) #75%的數據作為訓練集training <- spam[inTrain, ]testing <- spam[-inTrain, ]dim(training)[1] 3451 58k重交叉驗證:
  • 機器學習:模型訓練和評估——模型訓練技巧
    在模型訓練技巧中,針對模型效果的驗證尋找合適的參數主要有3種方式,分別是K折交叉驗證、參數網格搜索,以及訓練集、驗證集和測試集的引入。3種方法都為訓練出更好的模型、判斷模型效果提供幫助。下面,我們將藉助鳶尾花數據集結合相關模型,探討3種方法的應用。
  • 單GPU用CIFAR10訓練達到94%只要26秒的秘密
    考慮到訓練時間很快就會下降至一分鐘以內,我們可以通過 10 到 100 次實驗以確保改進的真實性。也只有這樣,我們才能持續取得進展。明確的實驗結果對於推進項目非常重要,但如果基準調整不佳或者運行次數太少,那麼我們的驗證結果也將失去價值。本次發布的一大主要目標,就是提供一套經過良好調整的基準用於測試新技術。其能夠幫助用戶在幾分鐘之內在 GPU 上完成擁有顯著統計學意義的訓練。
  • 第三十六講 R-回歸預測模型的交叉驗證
    )中的擬合情況,也就是說,我們通過訓練數據集建立了預測模型,然後在訓練數據集中檢測模型的擬合性能情況。那麼,這個建立的預測模型在獨立的另一個數據集,即測試集中的表現如何呢?在實際科研中,我們並不總是能獲得一個或多個完全獨立的樣本作為「訓練集」對模型進行驗證。於是,我們有了交叉驗證和自舉重採樣(bootstrap-resampling)驗證方法來解決這個問題。 交叉驗證是指一組檢測建立的給定預測模型用在新數據(測試數據集)中效果好壞的方法。
  • PyTorch實戰 | 使用卷積神經網絡對CIFAR10圖片進行分類(附源碼)
    圖片數據集進行分類。它是一個包含「飛機」,「汽車」,「鳥」,「貓」,「鹿」,「狗」,「青蛙」,「馬」,「船」,「卡車」10中類別的圖片庫。在CIFAR-10裡面的圖片數據大小是3x32x32,即:三通道彩色圖像,圖像大小是32x32像素。準備數據pytorch的torchvision提供了CIFAR10庫,通過torchvision.datasets.CIFAR10加載該數據集。
  • Pytorch基礎深度學習教程之「CIFAR分類」
    本期就先寫一個CIFAR數據集的分類代碼吧,大佬可以忽略o(╥﹏╥)o。數據集1.1. CIFAR-10CIFAR-10數據集由10個類的60000個32x32彩色圖像組成,每個類有6000個圖像。有50000個訓練圖像和10000個測試圖像。  數據集分為五個訓練批次和一個測試批次,每個批次有10000個圖像。
  • 自製人臉數據,利用keras庫訓練人臉識別模型
    到目前為止,數據加載的工作已經完成,我們只需調用這個接口即可。關於訓練集的使用,我們需要拿出一部分用於訓練網絡,建立識別模型;另一部分用於驗證模型。關於預處理,我們做了幾項工作:1)按照交叉驗證的原則將數據集劃分成三部分:訓練集、驗證集、測試集;2)按照keras庫運行的後端系統要求改變圖像數據的維度順序;3)將數據標籤進行one-hot編碼,使其向量化4)歸一化圖像數據     關於第一項工作,先簡單說說什麼是交叉驗證
  • 實戰 | 基於深度學習模型VGG的圖像識別(附代碼)
    圖:16層的VGG模型數據準備通用圖像分類公開的標準數據集常用的有CIFAR、ImageNet、COCO等,常用的細粒度圖像分類數據集包括CUB-200-2011、Stanford Dog、Oxford-flowers等。其中ImageNet數據集規模相對較大,如模型概覽一章所講,大量研究成果基於ImageNet。
  • 基於UAI-Train平臺的分布式訓練
    指定一個UFS網盤作為output數據源,UAI--Train平臺在訓練執行過程中會將對應的UFS數據映射到訓練執行的每一個PS容器和Worker容器的 /data/output 目錄下,並以共享的方式訪問同一份數據。同時,在訓練過程可以通過其雲主機實時訪問訓練保存的模型checkpoint。
  • 臨床預測模型:模型的驗證
    但在刪失較多的情況下,Harrell’sC統計量會高估模型表現[7],Uno等人提出了一種新的C統計量計算方法,即Uno’sC統計量,可在刪失數據較多的情況下得到可靠的估計[8]。除了這兩種全局C統計量,對於生存數據,許多研究者還提出了基於不同刪失數據處理方法的時間依賴C統計量,用於評價特定時間點的模型區分度[9, 10]。
  • 人工智慧實戰項目二:用Keras訓練,預測數據集人均年收入
    我們將創建模型,訓練它,繪製性能,然後計算特徵重要性。為了創建模型,我們再次使用Sequential模型類型。這是我們的網絡架構。現在我們已經有了數據生成器,我們可以按照以下方式訓練我們的模型。history = model.fit_generator( adult_feed(X_cleaned, y, 10), steps_per_epoch=len(X_cleaned) // 10, epochs=50)這應該是比較快的,因為這是一個小的數據集;然而,如果你發現這需要太長的時間,你總是可以減少數據集的大小或訓練的數量
  • R與生物專題 | 第四十二講 R-回歸預測模型的交叉驗證
    以從淺入深,層層遞進的形式在投必得學術公眾號更新。在第四十一講中,我們講到了判斷回歸模型性能的指標(第四十一講 R-判斷回歸模型性能的指標),但是,我們的例子都是展現在訓練數據集(建立模型的數據集)中的擬合情況,也就是說,我們通過訓練數據集建立了預測模型,然後在訓練數據集中檢測模型的擬合性能情況。
  • 訓練可視化工具哪款是你的菜?MMCV一行代碼隨你挑
    在深度學習中可視化模型的訓練過程有助於我們分析模型的狀態。可視化訓練過程的庫很多,我們將一些常用的庫集成到 MMCV 中方便用戶使用。在 MMCV 中使用這些庫只需簡單配置。在本文中將介紹這些庫以及它們在 MMCV 中的使用方法。
  • TF-2.0 卷積CBAPD特徵提取器+六步法【卷積+BN+激活+丟棄+池化】實現Baseline基準神經網絡cifar10分類
    numpy as npfrom matplotlib import pyplot as pltfrom tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Densefrom tensorflow.keras import Modelcifar10
  • 圖像/視頻超分之數據集
    在深度學習領域,數據就是「糧草」。在進行模型訓練之前,我們必須要了解需要用到哪些訓練數據,哪些驗證數據。在文本中,我們將匯總一下圖像超分、視頻超分中的那些數據集。圖像超分數據 DIV2K數據主頁連結:https://data.vision.ee.ethz.ch/cvl/DIV2K。