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