pytorch訓練自己的數據集,pytorch dataloader_基于pytorch的DeepLearning入門流程

 2023-10-01 阅读 28 评论 0

摘要:基于pytorch的DeepLearning學習筆記最近開始學深度學習框架pytorch,從最簡單的卷積神經網絡開始了解pytorch的框架。以下涉及到的代碼完整版請查看https://github.com/XieHanS/CPSC_ECGHbClassify_demo.git基于pytorch的DL主要分為三個模塊,數據塊,模型塊

基于pytorch的DeepLearning學習筆記

最近開始學深度學習框架pytorch,從最簡單的卷積神經網絡開始了解pytorch的框架。以下涉及到的代碼完整版請查看https://github.com/XieHanS/CPSC_ECGHbClassify_demo.git

基于pytorch的DL主要分為三個模塊,數據塊,模型塊,和訓練塊。具體如下:

1、 數據集

pytorch提供有專門的數據下載,數據處理包,使用這些包可以極大地提高開發效率

torch.utils.data工具包

該包中有兩個常用的類,分別為Dataset和DataLoader

pytorch訓練自己的數據集,Dataset 一個抽象類,抽象類只能作為基類派生新類使用,不能創建抽象類對象。其他數據集需要繼承這個類,并覆寫其中的兩個方法:

__getitem__ 和 __len__

from torch.utils.data import Dataset, DataLoaderclass MyDataset(Dataset):def __init__(self, data, label):self.data = dataself.label = labeldef __getitem__(self, index):return (torch.tensor(self.data[index], dtype=torch.float), torch.tensor(self.label[index], dtype=torch.long))def __len__(self):return len(self.data)

調用__getitem__只返回一個樣本,因此需要一個批量讀取的工具,pytorch為我們提供了另外一個類DataLoader。DataLoader 定義一個新的迭代器,實現批量讀取,打亂數據并提供并行加速等功能

loader = torch.utils.data.DataLoader(dataset = datasets, #加載的數據集batch_size = BATCH_SIZE, #批大小shuffle = True, #是否將數據打亂,默認為falsenum_workers=2,#使用多進程加載的進程數,0代表不使用多進程

使用的時候只需要調用這兩個類即可

#繼承Dataset類,自定義數據集以及對應的標簽dataset = MyDataset(X_train, Y_train)dataset_test = MyDataset(X_test, Y_test)#裝載數據,實現批量讀取dataloader = DataLoader(dataset, batch_size=batch_size)dataloader_test = DataLoader(dataset_test, batch_size=batch_size, drop_last=False)
#訓練模型時候的數據循環for epoch in range(n_epoch):model.train()for batch_idx, batch in enumerate(dataloader):input_x, input_y = tuple(batch)pred = model(input_x)[0]

2、 定義模型

pytorch中自定義的模型往往繼承自nn.Model,包括兩個函數,初始化函數__init__()和forward()。__init__()定義了卷積層和其他層的參數,forward()規定了網絡執行的順序。例如下面的網絡:

__init__()定義了兩個卷積層conv1和conv2,和一個全連接層out層,兩個卷積層里面分別包含了一維卷積,DropOut,ReLU激活和最大池化層。

deeplearning4j缺點,forward()定義了執行順序。首先conv1,接著conv2,最后out層。由于上下層連接的問題,往往init里面會按照順序撰寫,而真正的執行順序是forward里面的順序。

class CNN(nn.Module):    def __init__(self):        super(CNN, self).__init__()        self.conv1 = nn.Sequential(  # input shape (1, 1, 2000)            nn.Conv1d(                in_channels=1,          # input height                out_channels=16,        # n_filters                kernel_size=5,          # filter size                stride=1,               # filter movement/step                padding=2,            ),          # output shape (16, 1, 2000)            nn.Dropout(0.2),#扔到0.2            nn.ReLU(),            nn.MaxPool1d(kernel_size=5),    # choose max value in 1x5 area, output shape (16, 1, 400)2000/5        )        self.conv2 = nn.Sequential( # input shape (16, 1, 400)            nn.Conv1d(16, 32, 5, 1, 2),# output shape (32, 1, 400)            nn.Dropout(0.2),#扔掉0.2            nn.ReLU(),            nn.MaxPool1d(kernel_size=5),# output shape (32, 1, 400/5=80)        )        self.out = nn.Linear(32 *  80, 3)   # fully connected layer, output 3 classes    def forward(self, x):        x = self.conv1(x)        x = self.conv2(x)        x = x.view(x.size(0), -1)                 output = self.out(x)        return output, x 
1637267714023d7b8f72762ac9cf4ee6.png

我們打印出模型如下:

aea56561b2323b0ed621a64548957e69.png

3、訓練模型

1) 讀數據,裝載數據,隨機批量分配

2) 初始化自定義的模型類

3) 定義優化器【SGD,自適應優化算法(RMSProp,Adam,Adadelta)】和損失函數【MSE(回歸),crossEntropy(分類)】

4) 定義epoch數量,for循環訓練模型

    # 初始化自定義的模型類    model = CNN()       model.verbose = False#運行的時候不顯示詳細信息   # 定義優化器和損失函數    LR = 0.001    optimizer = torch.optim.Adam(model.parameters(), lr=LR)        loss_func = torch.nn.CrossEntropyLoss()                    
for epoch in range(n_epoch):        model.train()        for batch_idx, batch in enumerate(dataloader):                input_x, input_y = tuple(batch)            pred = model(input_x)[0]            loss = loss_func(pred, input_y)            optimizer.zero_grad()#梯度置零            loss.backward()        #optimizer.step()是大多數optimizer所支持的簡化版本。一旦梯度被如backward()之類的函數計算好后,就可以調用這個函數更新所有的參數。            optimizer.step()            step += 1        # test        model.eval()#為了固定BN和dropout層,使得偏置參數不隨著發生變化

pytorch distributed,訓練需要注意的幾點:

1) 反向傳播之前,優化器的梯度需要置零

2) optimizer.step()是大多數optimizer所支持的簡化版本。一旦梯度被如backward()之類的函數計算好后,就可以調用這個函數更新所有的參數

3) model.eval()#訓練完train_datasets之后,model要用來測試樣本,model.eval()為了固定BN和dropout層,使得偏置參數不隨著發生變化

完整的代碼https://github.com/XieHanS/CPSC_ECGHbClassify_demo.git

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/107199.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息