pytorch學習(b站小土堆學習)

1 環境配置

參考鏈接

2. dir 和 help函數

dir():用于查看某一模塊函數的方法
help(): 用于查看某方法的使用方法
在這里插入圖片描述

3. dataset類實戰

利用Image對象打開圖片,利用os模塊的地址拼接組成圖片路徑
當我們用方括號訪問元素對象時,實際上是調用了這個對象的__getitem__方法

from torch.utils.data import Dataset
from PIL import Image
import osclass MyData(Dataset):# 初始化,根目錄的相對地址和標簽labeldef __init__(self,root_dir,label_dir):self.root_dir = root_dirself.label_dir = label_dirself.path = os.path.join(self.root_dir,self.label_dir) # 拼接獲得路徑self.img_path = os.listdir(self.path) # 將對應路徑下的元素名轉換為列表# 當我們用方括號訪問元素對象時,實際上是調用了這個對象的__getitem__方法def __getitem__(self, index): # 傳入下標,獲取對應圖片img_name = self.img_path[index] # 從元素名的列表獲取需要的元素名# 拼接所需圖片的路徑img_item_path = os.path.join(self.root_dir,self.label_dir,img_name)img = Image.open(img_item_path) # 根據路徑獲得圖片對象label = self.label_dirreturn img,labeldef __len__(self): # 獲取類中元素的數量return len(self.img_path)root_dir = "E:\\pythonProject\\dataset\\hymenoptera_data\\train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir,ants_label_dir)
bees_dataset = MyData(root_dir,bees_label_dir)# 整體數據集可以使用兩個數據集相加
train_dataset = ants_dataset + bees_dataset

然后可以數據集圖片對象進行操作
在這里插入圖片描述

4.TensorBoard的使用(一)

創建SummaryWriter實例,并生成一個圖像,保存與當前路徑下的 ”logs”文件夾中
SummaryWriter是PyTorch中的一個工具,用于將模型訓練過程中的日志保存到TensorBoard中。可以通過使用SummaryWriter的add_scalar()方法來保存損失函數、準確率等標量信息,使用add_histogram()方法來保存權重、梯度等張量信息,使用add_image()方法來保存圖像信息等。

from torch.utils.tensorboard import SummaryWriter# 傳入某一文件夾的路徑,默認為當前路徑下的文件夾
writer = SummaryWriter("logs")
for i in range(10000):# 參數1:tag(圖表的名稱/label) , 參數2:y軸的數值,參數3:x軸的數值writer.add_scalar("y = x", i ,i)
writer.close()

在對應虛擬環境的終端啟動TensorBoard: logdir = 保存對應圖像的文件夾名;port為打開的端口號
在這里插入圖片描述
結果:
在這里插入圖片描述

5. Tensorboard的使用(二)

使用numpy格式,添加文件圖片。
numpy格式有兩種:opencv打開文件和使用numpy直接格式轉換

from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import  Image# 傳入某一文件夾的路徑,默認為當前路徑下的文件夾
writer = SummaryWriter("logs")
img_path = "dataset/hymenoptera_data/train/bees/16838648_415acd9e3f.jpg"
img = Image.open(img_path)  # img 為PIL的jpeg類型
img_array = np.array(img)  # 將img轉換為numpy類型
# numpy的類型的方法二 是用opencv打開# global—step 為步驟順序,dataformats 為 數據格式
writer.add_image("test",img_array,1,dataformats='HWC')for i in range(100):# 參數1:tag(圖表的名稱/label) , 參數2:y軸的數值,參數3:x軸的數值writer.add_scalar("y = x", i ,i)
writer.close()

在這里插入圖片描述

6. Transfroms的使用(一)

![(https://i-blog.csdnimg.cn/direct/17e2ec49e97347349eba5e1d2b429e3c.png)

from torchvision import transforms
from PIL import Image# transforms如何使用(python)
img_path = "dataset/hymenoptera_data/train/ants/0013035.jpg"
img = Image.open(img_path) # 打開文件,得到一個圖片類的實例# 獲取一個ToTensor實例
tensor_trans = transforms.ToTensor()
# 由于存在__call__方法,調用該實例,調用該方法
# 由圖片實例轉換為 tensor類型
tensor_img = tensor_trans(img)print(tensor_img)

結果:
在這里插入圖片描述

注: call 是 Python 中一個魔術方法(magic method),它用于定義對象的函數調用行為。換句話說,當你嘗試調用一個具有 call 方法的對象時,Python 會自動調用該方法。

ToTensor類的__call__方法:
在這里插入圖片描述

7. Transforms的使用(二)

將圖片轉換為tensor對象,再將該對象利用tensorboard的SummaryWriter打開。

from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image# transforms如何使用(python)
img_path = "dataset/hymenoptera_data/train/ants/0013035.jpg"
img = Image.open(img_path) # 打開文件,得到一個圖片類的實例# 獲取一個ToTensor實例
tensor_trans = transforms.ToTensor()
# 由于存在__call__方法,調用該實例,調用該方法
# 由圖片實例轉換為 tensor類型
tensor_img = tensor_trans(img)writer = SummaryWriter("logs")
# 參數 :  self, tag, img_tensor, global_step=None, walltime=None, dataformats="CHW"
writer.add_image("Tensor_img",tensor_img) # 保存圖像信息writer.close()

啟動tensorboard:
在這里插入圖片描述
結果:
在這里插入圖片描述

8.常見的Transform(一)

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter("logs")
img = Image.open("images/123.jpg")# ToTensor,轉換后張量的范圍均為0-1
trans_totensor = transforms.ToTensor()  # 創建ToTensor實例
img_tensor = trans_totensor(img) #調用內置__call__方法
writer.add_image("ToTensor",img_tensor)# normalize 歸一化
# 創建Normalize實例 ,輸入分別為 均值 和 標準差
trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
img_norm = trans_norm(img_tensor)  # 其父類具有__call__方法,img_norm為tensor類型
writer.add_image("normalize", img_norm)
writer.close()

歸一化會改變tensor的數據的范圍,img_tensor中的值為[0,1] ,而使用標準差與均值均為0.5的歸一化后,其值的范圍變為[-1,1]。若標準差與均值改變,則范圍也會改變

在這里插入圖片描述
運行結果:在這里插入圖片描述

9. 常見的Transform(二)

(1)Resize

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformswriter = SummaryWriter("logs")
img = Image.open("images/321.jpg")# ToTensor,轉換后張量的范圍均為0-1
trans_totensor = transforms.ToTensor()  # 創建ToTensor實例
img_tensor = trans_totensor(img) #調用內置__call__方法
writer.add_image("ToTensor",img_tensor)# normalize 歸一化
# 創建Normalize實例 ,輸入分別為 均值 和 標準差
trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
img_norm = trans_norm(img_tensor)  # 其父類具有__call__方法,img_norm為tensor類型
writer.add_image("normalize", img_norm)
writer.close()# Resize
trans_resize = transforms.Resize([256,256]) # 傳入要縮放的長和寬的列表
img_resize = trans_resize(img) # 傳入一個PIL數據類型,返回值也為PIL類型
img_resize_tensor = trans_totensor(img_resize)  # 轉換為tensor類型
writer.add_image("Resize",img_resize_tensor,0)# Resize 寫法2,使用compose,傳入transform的列表,表示要進行的transform的操作
trans_resize2 = transforms.Resize(256)  # 等比縮放
trans_compose = transforms.Compose([trans_resize2,trans_totensor]) # 先改變大小,再轉換為tensor
img_resize_tensor2 = trans_compose(img)
writer.add_image("Resize",img_resize_tensor2,1)

運行結果:
在這里插入圖片描述
在這里插入圖片描述
(2) RandomCrop:隨即裁剪

# RandomCrop 隨機裁剪,如果輸入一個值n,則會減為x*x;若輸入兩個值,則裁剪為x*y
trans_randowcrop = transforms.RandomCrop(256)
trans_compose2 = transforms.Compose([trans_randowcrop,trans_totensor])
for i in range(10): # 隨機裁剪十次img_randomcrop = trans_compose2(img)writer.add_image("RandomCrop",img_randomcrop,i)writer.close()

運行結果:
在這里插入圖片描述

10. torchvision中的數據集使用

數據集常用的參數:
在這里插入圖片描述

import torchvision
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter# 自定義使用的transform
dataset_transforms = transforms.Compose([transforms.ToTensor() # 轉化為tensor
])# 數據集的路徑,是否為訓練數據集,使用的transform ,是否需要下載
train_set = torchvision.datasets.CIFAR10("./dataset1",train=True,transform=dataset_transforms,download=True)
test_set = torchvision.datasets.CIFAR10("./dataset1",train=False,transform=dataset_transforms,download=True)writer = SummaryWriter("logs")
for i in range(10):img, target = test_set[i] # img為圖片的tensor類型writer.add_image("test_set",img, i)
writer.close()

運行結果:
在這里插入圖片描述

11. DataLoader的使用

在這里插入圖片描述

import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformstest_set = torchvision.datasets.CIFAR10("./dataset1",train=False,transform=transforms.ToTensor(),download=True)# batch_size: 批大小, shuffle表示是否打亂(一個epoch打亂一次),num_workers表示多進程數(0表示主進程進行)
# drop_last表示當數據總數與批大小不成比例,剩余不夠一批的數據是否舍棄
test_loader = DataLoader(test_set,batch_size=64,shuffle=True,num_workers=0,drop_last=False)writer = SummaryWriter("dataload")for epoch in range(2):  # epoch的數量設置為2step = 0for data in test_loader:imgs, targets = data  # imgs 是batch(一批)的圖片張量# 注意是add_images 不是 add_imagewriter.add_images(f"Epoch:{epoch}",imgs, step)step += 1writer.close()

運行結果:
在這里插入圖片描述


12. nn.Module的基本使用

import torch
from torch import nn
class Test(nn.Module):def __init__(self):super().__init__()# 正向傳播def forward(self, x):out = x + 1return outtest = Test()
x = torch.tensor(2.0)
# 使用實例傳參會調用__call__函數,在nn.Module下會自動調用forward方法
print(test(x)) # 輸出3

13. 神經網路-卷積層

卷積層stride默認為1.而后面池化層的stride默認為窗口長/寬。而卷積層的濾波器的初始值是隨機值(在一定初始化方法下的隨機,例如:Kaiming初始化和Xavier初始化

卷積層作用: 從輸入數據中提取特征,形成特征圖
池化層作用: 對特征圖進行降維處理
在這里插入圖片描述
在這里插入圖片描述

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterclass MyConv(nn.Module):def __init__(self):super().__init__()self.conv2 = nn.Conv2d(3,6,3)def forward(self, x):# 使用一個2d卷積,輸入通道數為3,輸出通道數為6,濾波器為3*3x = self.conv2(x)return xtest_data = torchvision.datasets.CIFAR10("./dataset1",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataLoader1 = DataLoader(test_data,batch_size=64)
writer = SummaryWriter("logs")myconv = MyConv()step = 0
for data in dataLoader1:imgs, targets = data  # img.shape = 64,3,32,32writer.add_images("imgs",imgs,step)out = myconv(imgs)  # out.shape = 64,6,30,30,不能直接被識別為圖像# 因此化為兩個三通道圖片out = torch.reshape(out,(-1,3,30,30))writer.add_images("out",out,step)step += 1writer.close()

結果:
在這里插入圖片描述

14. 最大池化層的使用

在這里插入圖片描述

import torchvision.datasets
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterclass MyMaxpool(nn.Module):def __init__(self):super().__init__()# ceil_mode表示是否保存 當池化窗口不滿時,窗口中的最大值self.maxpool = nn.MaxPool2d(3,ceil_mode=True)def forward(self, x):x = self.maxpool(x)return xtest_data = torchvision.datasets.CIFAR10("./dataset1",train=False,transform=torchvision.transforms.ToTensor(), download=True)
dataloader = DataLoader(test_data, batch_size=64)
writer = SummaryWriter("logs_maxpool")mymaxpool = MyMaxpool()step = 0
for data in dataloader:imgs, targets = datawriter.add_images("imgs",imgs, step)out = mymaxpool(imgs)writer.add_images("out",out,step)step += 1writer.close()

執行結果:
在這里插入圖片描述


15. 非線性激活

非線性變換的目的: 為網絡引入非線性特征

激活函數作用: 將神經網絡的線性模型變為非線性的

ReLU中,inplace的用法
在這里插入圖片描述


ReLU與Sigmold的簡單使用

import torchvision.datasets
from torch import nn
from torch.nn import ReLU, Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterclass MyRelu(nn.Module):def __init__(self):super().__init__()# inplace 表示是否用輸入的變量接收輸出;若為false,則input不變,存在返回值outputself.relu = ReLU(inplace=False)self.sigmoid = Sigmoid()def forward(self, x):x = self.sigmoid(x)return x;writer = SummaryWriter("logs_relu")
test_data = torchvision.datasets.CIFAR10("./dataset1",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataLoader1 = DataLoader(test_data,batch_size=64)myrelu = MyRelu()step = 0
for data in dataLoader1:imgs, targets = datawriter.add_images("imgs",imgs,step)out = myrelu(imgs)writer.add_images("out",out,step)writer.close()

運行結果:
在這里插入圖片描述

16. 線性層及其他層的介紹

線性層,也就等同于全連接層,將一個多維數據拉伸映射為一維

在這里插入圖片描述

17. 搭建小實戰Sequential的使用

在這里插入圖片描述
需要分別計算每個卷積核的padding和stride(卷積后H,W不變,一般padding=(5卷積核寬度-1)的一半),利用公式計算,dilation默認為1。
在這里插入圖片描述

import torch
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linearclass MySeq(nn.Module):def __init__(self):super().__init__()self.module = Sequential(# 卷積過后尺寸不變, padding = (kernel_size - 1) / 2Conv2d(3,32,5,padding=2),MaxPool2d(2),Conv2d(32,32,5,padding=2),MaxPool2d(2),Conv2d(32,64,5,padding=2),MaxPool2d(2),  # 目前為64*4*4,需flatten成線性的Flatten(), # => 1024Linear(1024,64), # 1024=>64Linear(64,10),# 64=> 10)def forward(self, x):x = self.module(x)return xmyseq = MySeq()
x = torch.ones((64,3,32,32)) # 訓練后 batch_size 不變
print(myseq(x).shape)

在這里插入圖片描述

18. 損失函數和反向傳播

交叉熵:
在這里插入圖片描述

在這里插入圖片描述

import torch
import torchvision.datasets
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoaderdataset = torchvision.datasets.CIFAR10("dataset1",False,torchvision.transforms.ToTensor(),download=True)class MySeq(nn.Module):def __init__(self):super().__init__()self.module = Sequential(# 卷積過后尺寸不變, padding = (kernel_size - 1) / 2Conv2d(3,32,5,padding=2),MaxPool2d(2),Conv2d(32,32,5,padding=2),MaxPool2d(2),Conv2d(32,64,5,padding=2),MaxPool2d(2),  # 目前為64*4*4,需flatten成線性的Flatten(), # => 1024Linear(1024,64), # 1024=>64Linear(64,10),# 64=> 10)def forward(self, x):x = self.module(x)return xdataloader = DataLoader(dataset,batch_size=1)loss = nn.CrossEntropyLoss()  # 交叉熵損失函數
myseq = MySeq()for data in dataloader:imgs, targets = dataoutputs = myseq(imgs)result_loss = loss(outputs,targets)result_loss.backward() # 反向傳播# loss樣例
x = torch.tensor([0.1,0.2,0.3])
x = torch.reshape(x,(1,3))
target = torch.tensor([1])
print(loss(x,target))

運行結果: 與預想一致
在這里插入圖片描述

19. 優化器

優化器的作用:
PyTorch的優化器在深度學習模型的訓練過程中起著至關重要的作用。它們的主要功能是根據計算得到的梯度信息來更新模型的參數,以最小化損失函數。以下是PyTorch優化器的主要作用:

  • 參數更新:優化器負責根據計算得到的梯度信息更新模型的參數(包括權值)。梯度表示了損失函數關于每個參數的變化率,通過將梯度與學習率相乘,優化器可以決定參數在每個訓練步驟中的更新幅度。
  • 學習率調整:優化器還可以控制學習率的調整。學習率決定了參數更新的步長,過大或過小的學習率都可能導致訓練不穩定或收斂速度緩慢。一些優化器提供了自適應調整學習率的功能,根據訓練進程或其他因素自動調整學習率的大小。
  • 參數優化算法:優化器實現了不同的參數優化算法,如隨機梯度下降(SGD)、Adam、Adagrad、RMSprop等。這些算法在計算參數更新時使用不同的策略和規則,以提高訓練效果和收斂速度。
  • 動量:一些優化器支持動量的概念,通過引入動量項來加速參數更新。動量可以幫助優化器在參數空間中更快地搜索,并有助于克服局部最小值的困境。

總而言之,PyTorch的優化器在深度學習模型的訓練中起著關鍵的作用,負責根據梯度信息更新模型參數、調整學習率,并利用不同的優化算法和技術來提高訓練效果和收斂速度。選擇合適的優化器要根據具體的問題和模型特性進行調整和實驗

在這里插入圖片描述
在這里插入圖片描述

import torch
import torchvision.datasets
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.optim import SGD
from torch.utils.data import DataLoaderdataset = torchvision.datasets.CIFAR10("dataset1",False,torchvision.transforms.ToTensor(),download=True)class MySeq(nn.Module):def __init__(self):super().__init__()self.module = Sequential(# 卷積過后尺寸不變, padding = (kernel_size - 1) / 2Conv2d(3,32,5,padding=2),MaxPool2d(2),Conv2d(32,32,5,padding=2),MaxPool2d(2),Conv2d(32,64,5,padding=2),MaxPool2d(2),  # 目前為64*4*4,需flatten成線性的Flatten(), # => 1024Linear(1024,64), # 1024=>64Linear(64,10),# 64=> 10)def forward(self, x):x = self.module(x)return xdataloader = DataLoader(dataset,batch_size=1)loss = nn.CrossEntropyLoss()  # 交叉熵損失函數
myseq = MySeq()optim = SGD(myseq.parameters(), lr=0.01)for epoch in range(20):epoch_loss = 0.0for data in dataloader:imgs, targets = dataoutputs = myseq(imgs)result_loss = loss(outputs,targets)optim.zero_grad() # 將梯度清零result_loss.backward() # 反向傳播,獲取梯度optim.step() # 利用優化器優化參數epoch_loss = epoch_loss + result_lossprint(epoch_loss) # 輸出一個epoch總的損失率

在這里插入圖片描述

20. 現用模型的使用及修改

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

from torch import nn
from torchvision.models import vgg16vgg16_false = vgg16()
# 遷移學習
# 1. 在最后添加一個線性層,將1024=》10
# vgg16_false.classifier.add_module('add_linear',nn.Linear(1000,10))
print(vgg16_false)
# 2. 修改最后一個線性層
vgg16_false.classifier[6] = nn.Linear(4096,10)
print(vgg16_false)

21. 模型保存和模型加載

模型保存

import torch
import torchvision.modelsvgg16 = torchvision.models.vgg16()# 保存方式1:保存整個模型(不推薦)
torch.save(vgg16,"vgg16_method1.pth")# 保存方式2:僅保存參數(官方推薦)
torch.save(vgg16.state_dict(), "vgg16_method2.pth")

模型加載

import torch
import torchvision# 加載保存方式1,整個模型
model = torch.load("vgg16_method1.pth")
# print(model)# 加載保存方式2,導入參數
# torch.load("vgg16_method2.pth") 導入模型的參數
vgg16_2 = torchvision.models.vgg16()
vgg16_2.load_state_dict(torch.load("vgg16_method2.pth"))
print(vgg16_2)

運行結果:
在這里插入圖片描述

22. 完整的模型訓練套路(一)

訓練的代碼:

import torchvision.datasets
from torch.nn import CrossEntropyLoss
from torch.optim import SGD
from torch.utils.data import DataLoader
from torchvision import transformsfrom model import MyModeldataset_train = torchvision.datasets.CIFAR10("dataset1",True,transforms.ToTensor(),download=True)
dataset_test = torchvision.datasets.CIFAR10("dataset1",False,transforms.ToTensor(),download=True)
train_dataloader = DataLoader(dataset_train,batch_size=64)
test_dataloader = DataLoader(dataset_test,batch_size=64)# length長度
train_length = len(dataset_train)
test_length = len(dataset_test)
print(f"訓練集的長度:{train_length}")
print(f"測試集的長度:{test_length}")# 創建網絡模型
myModel = MyModel()# 損失函數
loss_func = CrossEntropyLoss()# 優化器
learning_rate = 1e-2
optimizer = SGD(myModel.parameters(), lr=learning_rate)# 設置訓練網絡的一些參數
# 記錄訓練的總次數(訓練一個batch算一次)
total_train_num = 0
# 記錄測試的總次數
total_test_num = 0
# 訓練的輪次
epoch = 10for i in range(10):print(f"-----第{i+1}輪訓練開始-----")for data in train_dataloader:imgs, targets = dataoutputs = myModel(imgs)loss = loss_func(outputs, targets)  # 輸入預測結果和真實結果,得到損失率# 優化器優化模型optimizer.zero_grad() # 將梯度清零loss.backward()  # 反向傳播計算梯度optimizer.step() # 利用優化器優化參數total_train_num = total_train_num + 1print(f"訓練次數:{total_train_num}, ;loss:{loss.item()}")

model.py

from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linearclass MyModel(nn.Module):def __init__(self):super().__init__()self.module = Sequential(# 卷積過后尺寸不變, padding = (kernel_size - 1) / 2Conv2d(3,32,5,padding=2),MaxPool2d(2),Conv2d(32,32,5,padding=2),MaxPool2d(2),Conv2d(32,64,5,padding=2),MaxPool2d(2),  # 目前為64*4*4,需flatten成線性的Flatten(), # => 1024Linear(1024,64), # 1024=>64Linear(64,10),# 64=> 10)def forward(self, x):x = self.module(x)return x

運行結果:
在這里插入圖片描述

23.完整的模型訓練套路(二)

with: 上下文管理器,with語句可以自動管理上下文資源,不論是什么原因跳出with塊都能確保文件可以正確的關閉 ,以此來達到釋放資源的目的。

with torch.no_grad() : 是一個用于臨時禁用梯度計算的上下文管理器。

add_scalar: add_scalar() 用于展示標量,數

train()和eval() : 只針對某些層有用,例如drop_out層
在這里插入圖片描述

代碼:

import torch
import torchvision.datasets
from torch.nn import CrossEntropyLoss
from torch.optim import SGD
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from torchvision import transformsfrom model import MyModeldataset_train = torchvision.datasets.CIFAR10("dataset1",True,transforms.ToTensor(),download=True)
dataset_test = torchvision.datasets.CIFAR10("dataset1",False,transforms.ToTensor(),download=True)
train_dataloader = DataLoader(dataset_train,batch_size=64)
test_dataloader = DataLoader(dataset_test,batch_size=64)# length長度
train_length = len(dataset_train)
test_length = len(dataset_test)
print(f"訓練集的長度:{train_length}")
print(f"測試集的長度:{test_length}")# 創建網絡模型
myModel = MyModel()# 損失函數
loss_func = CrossEntropyLoss()# 優化器
learning_rate = 1e-2
optimizer = SGD(myModel.parameters(), lr=learning_rate)# 設置tensorboard可視化
writer = SummaryWriter("logs")# 設置訓練網絡的一些參數
# 記錄訓練的總次數(訓練一個batch算一次)
total_train_num = 0
# 記錄測試的總次數
total_test_num = 0
# 訓練的輪次
epoch = 10for i in range(10):print(f"-----第{i+1}輪訓練開始-----")# 訓練步驟開始myModel.train()for data in train_dataloader:imgs, targets = dataoutputs = myModel(imgs)loss = loss_func(outputs, targets)  # 輸入預測結果和真實結果,得到損失率# 優化器優化模型optimizer.zero_grad() # 將梯度清零loss.backward()  # 反向傳播計算梯度optimizer.step() # 利用優化器優化參數total_train_num = total_train_num + 1if total_train_num % 100 == 0:print(f"訓練次數:{total_train_num}, ;loss:{loss.item()}")# 測試步驟開始myModel.eval()total_test_loss = 0total_accuracy = 0with torch.no_grad():for data in test_dataloader:imgs, targets = dataoutputs = myModel(imgs)loss = loss_func(outputs, targets)total_test_loss = total_test_loss + loss.item() # 計算一epoch中的總損失# argmax中 0 表示列比較  1 表示行比較  => 最后得到一行accuracy = (outputs.argmax(1) == targets).sum() # 準確個數 為 輸出與目標相等數量的總和total_accuracy = total_accuracy + accuracy # 計算本輪總命中數print(f"整體測試集上的loss:{total_test_loss}")print(f"整體測試集上的準確率:{total_accuracy/test_length}")writer.add_scalar("test_loss",total_test_loss,i+1)writer.add_scalar("test_accuracy", total_accuracy/test_length, i+1)# 保存模型torch.save(myModel,f"MyModel_{i+1}.pth")print("模型已保存")writer.close()

運行結果:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

24. 利用GPU訓練(一)

使用方法1:
在這里插入圖片描述

# 創建網絡模型
myModel = MyModel()
if torch.cuda.is_available():myModel = myModel.cuda()# 損失函數
loss_func = CrossEntropyLoss()
if torch.cuda.is_available():loss_func = loss_func.cuda()
imgs, targets = data
if torch.cuda.is_available():imgs = imgs.cuda()targets = targets.cuda()

不使用GUP的時間:
在這里插入圖片描述
使用GPU的時間:
在這里插入圖片描述

使用GPU的方法二:
在這里插入圖片描述

# 單顯卡中cuda:0 == cuda
# device = torch.device("cuda")  寫法1
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 常用寫法
# 創建網絡模型
myModel = MyModel()
myModel = myModel.to(device)# 損失函數
loss_func = CrossEntropyLoss()
loss_func.to(device)
imgs, targets = data
imgs = imgs.to(device)
targets = targets.to(device)

運行結果:
在這里插入圖片描述

25. 完整的模型驗證套路

測試的圖片:
在這里插入圖片描述

import torch
import torchvision.transforms
from PIL import Image
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linearclass MyModel(nn.Module):def __init__(self):super().__init__()self.module = Sequential(# 卷積過后尺寸不變, padding = (kernel_size - 1) / 2Conv2d(3,32,5,padding=2),MaxPool2d(2),Conv2d(32,32,5,padding=2),MaxPool2d(2),Conv2d(32,64,5,padding=2),MaxPool2d(2),  # 目前為64*4*4,需flatten成線性的Flatten(), # => 1024Linear(1024,64), # 1024=>64Linear(64,10),# 64=> 10)def forward(self, x):x = self.module(x)return ximage = Image.open("images/img_1.png")
print(image)
image = image.convert('RGB')  # 將圖片轉為三通道
# 裁剪為32*32,再轉換為Tensor類型
transform = torchvision.transforms.Compose([torchvision.transforms.Resize((32,32)),torchvision.transforms.ToTensor()])
image = transform(image)
print(image.shape) # 3,32,32# 加載訓練好的模型
# 當在cpu上運行gpu上訓練的模型時,需添加map_location參數
model = torch.load("MyModel_30_gpu.pth",map_location="cpu")
print(model)# 輸入應為 B C H W 四維
image = torch.reshape(image,(1,3,32,32))
model.eval()
with torch.no_grad():output = model(image)
print(output)
print(output.argmax(1))

運行結果:
在這里插入圖片描述

索引與分類的對應關系:
在這里插入圖片描述
可知識別正確

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75251.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75251.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75251.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity TextMeshPro 實現文本逐字淡出效果

Unity TextMeshPro 實現文本逐字淡出效果 前言項目思路場景布置代碼編寫 前言 在處理角色對話時經常會用到一些文本動畫,正好記錄一下。使用 TextMeshPro,我們可以直接操作文本的頂點數據,實現諸如漸變、動畫等效果,為游戲界面和…

Mathtype無法插入到Word中

在word工具欄上有沒有出現Mtahtype,會出現以下兩種情況: 1. 沒有出現Mtahtype 2. 出現Mtahtype,但是點擊會出現彈窗 “ Couldnt find the MathPage.wll ” 解決方案 首先查看word版本是32位還是64位,這個位數是office安裝位數…

責任鏈模式_行為型_GOF23

責任鏈模式 責任鏈模式(Chain of Responsibility Pattern)是一種行為型設計模式,核心思想是將多個處理請求的對象連成一條鏈,請求沿鏈傳遞直到被處理。它像現實中的“多級審批流程”——請假或報銷時,申請會逐級提交給…

Qt圖形化界面為何總被“冷落“?

在Qt開發者的IDE中,Qt Designer總像一個被遺忘的角落——即便它有著直觀的拖拽式界面設計功能。通過分析GitHub上超過5000個Qt項目發現,僅有17%的項目使用.ui文件構建界面。這個數據背后,隱藏著開發者群體對GUI構建方式的集體選擇。我們不禁要…

SQL Server從安裝到入門一文掌握應用能力。

本篇文章主要講解,SQL Server的安裝教程及入門使用的基礎知識,通過本篇文章你可以快速掌握SQL Server的建庫、建表、增加、查詢、刪除、修改等基本數據庫操作能力。 作者:任聰聰 日期:2025年3月31日 一、SQL Server 介紹: SQL Server 是微軟旗下的一款主流且優質的數據庫…

簡單視圖函數

視圖函數 文章目錄 視圖函數[toc]一、什么是視圖函數二、簡單視圖函數三、返回錯誤視圖 一、什么是視圖函數 所謂視圖函數(簡稱視圖),本質上就是一個Python函數,用于接收Web請求并且返回Web響應。Web響應可以包含很多類型&#x…

QT文件操作(QT實操學習3)

1.項目架構 1.UI界面 1.新建文本文檔 2.打開文件 3.另存為文件 2.mainwindow.h? #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QFileDialog> #include <QMessageBox> #include <QDebug> QT_BEGIN_NAMESPACE namespa…

HX324雙運算放大器:賦能萬物互聯時代的信號處理基石

一、運算放大器行業的技術演進與市場需求 在全球半導體市場規模突破6000億美元的背景下&#xff0c;模擬芯片作為電子系統的"感官神經"&#xff0c;正迎來智能化升級浪潮。據IC Insights數據顯示&#xff0c;2023年全球運算放大器市場規模達32.7億美元&#xff0c;其…

C++ 結構體與函數

一.結構體 1.概念&#xff1a; 結構體&#xff08;struct&#xff09;是一種用戶自定義復合數據類型&#xff0c;其中可以包含不同類型的不同成員 2.結構體的應用場景&#xff1a; 我們在使用多個變量描述一個對象時&#xff0c;雖然也可以做到&#xff0c;但是難免顯得雜亂…

Python數據可視化-第1章-數據可視化與matplotlib

環境 開發工具 VSCode庫的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本書為《Python數據可視化》一書的配套內容&#xff0c;本章為第1章 數據可視化與matplotlib 本文主要介紹了什么是數據集可視化&#xff0c;數據可視化的目的&#xff0c;常見的數據可視化方式…

ESLint報錯:Could not find config file.

如果你的ESLint的版本大于 8&#xff0c;同時使用 .eslinrc.js 和 .eslintignore 作為配置文件&#xff0c;且目前用的是 VSCODE &#xff0c;就有可能遇到報錯&#xff1a; Could not find config file. 這個是因為 VSCode 中 ESLint 插件的配置 eslint.useFlatConfig 的問題…

基于SpringBoot的“醫療設備管理系統”的設計與實現(源碼+數據庫+文檔+PPT)

基于SpringBoot的“醫療設備管理系統”的設計與實現&#xff08;源碼數據庫文檔PPT) 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系統展示 系統總體功能模塊圖 系統E-R圖 系統登錄界面 …

WordPress漢主題

WordPress漢主題wphan.com(以下簡稱WP漢主題)是一個專注于WordPress中文主題與插件開發的專業團隊。該團隊致力于為中文用戶提供高質量的WordPress主題和插件資源&#xff0c;幫助用戶輕松創建專業且吸引人的網站。 WP漢主題提供多種功能豐富的WordPress主題&#xff0c;涵蓋博…

arthas之jvm相關命令

文章目錄 1. dashboard2. thread線程相關3. jvmTHREAD相關文件描述符相關 4. sysprop5. 小結6. sysenv7. vmoption8. getstatic9. ognl10. 小結 1. dashboard 作用&#xff1a;顯示當前系統的實時數據面板&#xff0c;按q或ctrlc退出 數據說明 ID: Java級別的線程ID&#xff…

小米平板 4 Plus 玩機日志

在一次偶然中&#xff0c;我從一個角落中找到了這臺小米平板 4 Plus&#xff08;是的&#xff0c;現在正在用這個平板寫這篇文章&#xff09;。在找到她的時候&#xff0c;她已經奄奄一息了&#xff0c;即使按動那脆弱的電源鍵也沒有任何響應。 在給她補充能源后&#xff0c;她…

MSYS2學習筆記

前言 本文內容是MSys2 Documentation的學習筆記可以使用MSYS2編譯QGis 學習筆記 什么是MSYS2&#xff1f; MSYS2&#xff08;Minimal System 2&#xff09;是一個為Windows平臺打造的軟件開發環境和包管理系統&#xff0c;它結合了Cygwin的POSIX兼容層、Arch Linux的pacman…

gnvm切換node版本號

1. gnvm下載官網 GNVM - Node.js version manager on Windows by Go 2. 安裝 2.1 不存在 Node.js 環境 下載并解壓縮 gnvm.exe 保存到任意文件夾&#xff0c;并將此文件夾加入到環境變量 Path。 2.2 存在 Node.js 環境 下載并解壓縮 gnvm.exe 保存到 Node.js 所在的文件夾。 2.…

目標檢測 AP 計算 實例 python

以下是使用 Python 實現目標檢測中 ?Average Precision (AP)? 計算的完整實例&#xff0c;包含代碼和注釋。這里以 ?Pascal VOC 標準? 為例&#xff08;IoU閾值0.5&#xff09;。 步驟1&#xff1a;準備數據 假設&#xff1a; gt_boxes: 真實標注框列表&#xff0c;格式為 …

AWS用Glue讀取S3文件上傳數據到Redshift,再導出到Quicksight完整版,含VPC配置

1. 項目背景 AWS的官方文檔&#xff0c;關于Glue和Vpc配置部分已經比較舊了&#xff0c;按照官方文檔配置的流程始終跑不通&#xff0c;花了一番時間和波折后&#xff0c;才終于完整的跑通了。 在數據分析和商業智能&#xff08;BI&#xff09;領域&#xff0c;我們常需要將存…

SpringBoot詳細教程(持續更新中...)

SpringBoot 一、概述 Springboot有哪些特點呢&#xff1f;或者說它跟Spring比有哪些優點呢&#xff1f; 1、起步依賴 通俗的說&#xff0c;就是一個依賴包含了很多個依賴&#xff1b;好處是引入所需的依賴更加簡便&#xff0c;而且有效避免了依賴之間的版本沖突問題&#xf…