免費贈書 活動規(guī)則:在 本文下方評論留言,分享您對此書籍的需求或看法/心得(不少于20字),我們將挑選最有價值10位朋友留言,贈送圖書1本。
本次免費贈書活動結束,感謝大家的參與~!
本次贈書名單:
1、eefocus_3985463
2、eefocus_3891719
3、eefocus_3985474
4、eefocus_3985492
5、eefocus_3985526
6、eefocus_3972093
7、eefocus_3939242
8、eefocus_3939857
9、liu123can
10、chief0411
書籍介紹
本書按照知識由淺入深、循序漸進的規(guī)律編寫而成。內容分為三大部分,第一部分是Python和PyTorch編程基礎,介紹常用的函數(shù)及其用法;第二部分是初級深度學習算法與技術,含基礎卷積神經網絡的實現(xiàn),目標識別、人臉表情識別等實戰(zhàn);第三部分是高級深度學習算法和技術,含孿生神經網絡、度量學習、蒸餾學習、目標檢測、圖像分割、圖像生成等技術及實戰(zhàn)。本書的附錄還提供了常用PyTorch函數(shù)速查手冊。本書根據深度學習技術的特點,將內容劃分為數(shù)據準備、神經網絡模型實現(xiàn)、損失函數(shù)實現(xiàn)、整體訓練流程和效果展示五部分。這種章節(jié)內容安排方式邏輯清楚,可操作性強、更易理解。
在深度學習處理復雜任務時,數(shù)據預處理是至關重要的一環(huán)。PyTorch作為一款熱門的深度學習框架,提供了豐富的數(shù)據處理工具。通過PyTorch,開發(fā)者可以輕松地完成數(shù)據的加載、清洗、增強、轉換等操作,以確保數(shù)據的質量并適應模型的需求。這些操作對于提高模型的訓練效率和泛化能力具有重要意義。
01、PyTorch自帶的數(shù)據集使用
在深度學習中,常用的數(shù)據集有手寫數(shù)字數(shù)據集MNIST,小圖像分類數(shù)據集CIFAR10和CIFAR100,人臉表情數(shù)據集JAFFE,及Pascal VOC數(shù)據集等,而COCO和ImageNet數(shù)據集是兩個超大規(guī)模的數(shù)據集。以MNIST數(shù)據集為例,該數(shù)據集由手寫數(shù)字圖像構成。訓練集有60000幅圖像,測試集有10000幅圖像。每幅MNIST圖像是28×28像素的灰度圖像,包含一個手寫數(shù)字,圖像的標簽為0~9之間的某個數(shù)字。在torchvision包的datasets模塊,有多個Pytorch自帶的數(shù)據集可供使用。以手寫數(shù)字數(shù)據集MNIST為例,使用方法如下:
# 使用torchvision.datasets包下的MNIST數(shù)據集類
from torchvision.datasets import MNIST
from torchvision import transforms
from torch.utils.data import DataLoader
# 定義圖像預處理操作
transform = transforms.Compose([
transforms.Resize(32),
transforms.RandomHorizontalFlip(0.5),
transforms.ToTensor()
])
train_dataset = MNIST(
root='./data',# 數(shù)據集的存放或下載地址
????transform=transform,#數(shù)據預處理
????train=True,# 是否為訓練集
????download=True# 是否下載,如果上述地址已存在該數(shù)據集則不下載
)
test_dataset = MNIST(
root='./data',
transform=transform,
train=True,
download=True
)
# 將預處理好的數(shù)據集變?yōu)榭傻鷮ο?,每次使用一個batch數(shù)量的數(shù)據
train_loader = DataLoader(
dataset=train_dataset,# 數(shù)據集
????batch_size=16,# batch大小
????shuffle=True# 是否打亂順序后取出
)
test_loader = DataLoader(
dataset=test_dataset,
batch_size=16,
shuffle=False
)
訓練網絡模型時,使用train_loader或test_loader,每次可取出一個batch大小的數(shù)據。
# 查看預處理后的一個MNIST數(shù)據及其標簽
print(train_dataset[0])
# 查看預處理后的一個MNIST數(shù)據的形狀
print(train_dataset[0][0].shape)
輸出:
(tensor([[[0., 0., 0., ?..., 0., 0., 0.],
[0., 0., 0., ?..., 0., 0., 0.],
[0., 0., 0., ?..., 0., 0., 0.],
...,
[0., 0., 0., ?..., 0., 0., 0.],
[0., 0., 0., ?..., 0., 0., 0.],
[0., 0., 0., ?..., 0., 0., 0.]]]), 5)
torch.Size([1, 32, 32])
# 得到一個batch數(shù)量的MNIST數(shù)據及其對應的標簽
batch_data, batch_label = next(iter(train_loader))
# 查看一個batch數(shù)據的形狀
print(batch_data.shape)
# 查看一個batch數(shù)據對應的標簽的形狀
print(batch_label.shape)
輸出:
torch.Size([16, 1, 32, 32])
torch.Size([16])
一個batch的shape為[N, C, H, W],其中“N”為batch size,“C”為通道數(shù),“H”和“W”和為高度和寬度。假定訓練集的batch_size設置為16,所以 “N”等于16;因MNIST數(shù)據集中的圖像均為單通道灰度圖,所以“C”等于1;在圖像預處理時,將圖像的尺寸Resize為32×32大小,所以這里的“W”和“H”等于32。使用以下代碼可以將train_loader中一個batch的數(shù)據進行可視化,結果如圖2.4所示。
import matplotlib.pyplot as plt
# 得到一個batch數(shù)量的MNIST數(shù)據及其對應的標簽
batch_data, batch_label = next(iter(train_loader))
fig = plt.figure()
for i in range(6):
plt.subplot(2, 3, i+1)
plt.imshow(batch_data[i][0], cmap='gray')
plt.title("Label: {}".format(batch_label[i]))
plt.show()
可以注意到,圖1右下角標簽值為7的圖像數(shù)據經過了水平翻轉處理。除MNIST數(shù)據集之外,其他經典數(shù)據集如CIFAR10和CIFAR100等也可以在torchvision.datasets模塊中找到,其使用方法和MNIST數(shù)據集相同。
圖1?MNIST預處理后的數(shù)據示例
02、自定義數(shù)據集的使用
除了這些經典數(shù)據集外,有時還需要根據實際任務使用指定的數(shù)據集。自定義的數(shù)據集MyDataset類需要繼承torch.utils.Dataset抽象類,并實現(xiàn)三個方法,分別是:__init__()方法,實現(xiàn)數(shù)據集的初始化;__len__()方法,記錄數(shù)據集的大??;__getitem__()方法,通過索引獲取數(shù)據和標簽。例如:
import torch
from torch.utils.data import Dataset
class MyDataset(Dataset):
# 初始化方法
????def __init__(self):
# 由3個4維向量組成的模擬數(shù)據集
????????self.data_list = torch.tensor([[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 0, 1]])
# 對應的標簽
????????self.label_list = torch.tensor([0, 1, 2])
def __len__(self):
return self.data_list.shape[0]
# 根據索引每次取一個數(shù)據
????def __getitem__(self, index):
data = self.data_list[index]
label = self.label_list[index]
return data, label
獲取自定義數(shù)據集中的數(shù)據:
# 獲取自定義數(shù)據集的數(shù)據
dataset = MyDataset()
# 取出第一個數(shù)據及其標簽
print(dataset[0])
輸出:
(tensor([0, 1, 2, 3]), tensor(0))
在torchvision.datasets模塊中,還有一個通用的數(shù)據集加載器ImageFolder。當數(shù)據文件依據標簽劃分在不同的文件夾中時,例如:
—————data
|—————train
| ???|——————class1
| ???| ??????|————class1_data1
| ???| ??????|————class1_data2
| ???| ??????|————class1_···
| ???|——————class2
| ???| ??????|————class2_data1
| ???| ??????|————class2_data2
| ???| ??????|————class2_···
| ???···
|—————test
此時,可以使用torchvision.datasets.ImageFolder來直接構造數(shù)據集,代碼如下:
from torchvision.datasets import ImageFolder
train_dataset = ImageFolder(
root="./data/train/",
transform=transform
)
test_dataset = ImageFolder(
root="./data/test/",
transform=transform
)
03、PyTorch中的數(shù)據預處理模塊transforms
torchvision包中的transforms模塊,提供了對PIL Image對象和Tensor對象的常用處理操作,可以方便地對圖像數(shù)據進行預處理。導入該模塊:
# 導入transforms模塊
from torchvision import transforms
常用的操作如下列所示:
# 將PIL圖像調整為給定大小
transforms.Resize(size)
# 依據給定的size從PIL圖像中心裁剪
transforms.CenterCrop(size)
# 在PIL圖像上隨機裁剪出給定大小
transforms.RandomCrop(size)
# 將PIL圖像裁剪為隨機大小和寬高比,然后resize到給定大小
transforms.RandomResizedCrop(size)
# PIL圖像依概率p水平翻轉,p默認值為0.5
transforms.RandomHorizontalFlip(p)
# 在PIL圖像四周使用fill值進行邊界填充,填充像素個數(shù)為padding
transforms.Pad(padding, fill)
# 對PIL圖像進行高斯模糊
transforms.GaussianBlur(kernel_size, sigma)
# 調整PIL圖像的亮度、對比度、飽和度、色調
transforms.ColorJitter(brightness, contrast, saturation, hue)
# PIL圖像依概率p隨即變?yōu)榛叶葓D,p默認值為0.5
transforms.RandomGrayscale(p)
# 將PIL圖像或者ndarray轉換為Tensor,并且歸一化至[0-1]
transforms.ToTensor()
# 用平均值和標準偏差歸一化張量
transforms.Normalize(mean, std)
# 將Tensor或者ndarray數(shù)據轉換為PIL圖像
transforms.ToPILImage()
如果想要對數(shù)據集進行多個預處理操作,可以使用transforms.Compose()函數(shù)將這些操作串接起來。例如:
'''
對數(shù)據集中的每個圖像執(zhí)行:
1)大小調整至32×32大小,
2)依0.5的概率進行水平翻轉,
3)最后將PIL圖像變?yōu)門ensor數(shù)據
'''
transforms.Compose([
transforms.Resize(32),
transforms.RandomHorizontalFlip(0.5),
transforms.ToTensor()
])
更多內容,敬請關注頂部圖書!
撰稿人:楊健亭,責任編輯: 李馨馨,審核人:曹新宇
免費贈書 活動規(guī)則
在本文下方評論留言,分享您對此書籍的需求或看法/心得(不少于20字),我們將挑選最有價值10位朋友留言,贈送圖書1本。
贈送數(shù)量:10本
截止時間:2024年6月26日16點
郵寄時間:2024年7月05日前