pytorch DataLoader模組的使用

2022-03-13 22:48:17 字數 2409 閱讀 4771

當訓練集特別大的時候(數萬條起步),每一輪訓練僅僅希望從中隨機取出一部分資料(比如batch_size=64)計算模型損失值、執行梯度下降,這就是sgd隨機梯度下降。

下面是乙個demo,其實訓練集一共只有四條資料。

#encoding=utf-8

import torch

import torch.nn as nn

import torch.utils.data as data

datax = torch.longtensor([

[1, 2, 3, 4, 0],

[9, 0, 1, 2, 3],

[0, 4, 2, 3, 6],

[7, 8, 9, 7, 0]])

datay = torch.arange(8).view(4,2)

class database(data.dataset):

def __init__(self, feature, label):

super(database, self).__init__()

self.feature = feature # [n, src_len] int64

self.label = label # [n, tgt_len] int64

self.dataset_train = data.tensordataset(self.feature, self.label)

# 下面兩段**是data.dataloader的關鍵,不可刪除

def __len__(self):

return self.feature.shape[0]

def __getitem__(self, index):

return self.dataset_train[index]

db = database(datax, datay)

loader = data.dataloader(db, batch_size = 2, shuffle = false)

for epoch in range(4):

print("----> epoch [%d]

for x,y in loader:

print("x:\n", x)

print("y:\n", y)

**主程式模擬了訓練多輪的過程,每輪都會把loader中的資料全跑遍以後退出。

值得說明的是,源資料datax、datay的行數(dim = 0)必須一致,表示多少條資料,其次列數不一定相等。

執行效果

可以發現此時每一輪次生成的訓練資料是打亂順序的,但是feature和label的對應序號是一致的。

也就是說兩者是同步變序的。

上述程式中雖然設定了batch_size,但是每個完整的epoch都會跑完訓練集的所有資料(loader資料走一遍),資料集合很大的時候每輪的訓練時間就很長,期望每個epoch僅僅訓練batch_size個資料,這樣epoch執行速度看起來更快。

總樣本數目設為n = 10000,batch_size = 200,這樣執行 total_epoches = n/batch_size = 50輪次就能把資料集合完整執行一遍。

可在實際中,我們希望把這個訓練集遍歷多次(執行很多個50次)以得到更小的損失值、更好的擬合效果。可是從**1看到,此種形式的**結構在跑完loader後就結束了,到末尾了。

loader = data.dataloader(db, batch_size = 2, shuffle = false)

for epoch in range(4):

print("----> epoch [%d]

for x,y in loader:

break

print("x:\n", x)

print("y:\n", y)

執行效果:

可以看到效果糟透了,每次都只取得資料及前batch_size=2個資料,無法實現遍歷訓練集,修改shuffle 設為 true效果:

現在效果好多了,採用亂序會隨機打亂資料集合的樣本順序只返回亂序後前面batch_size個資料。

Python webbrowser模組的使用

webbrowser模組提供了乙個高階介面來顯示基於web的文件,大部分情況下只需要簡單的呼叫open 方法。webbrowser定義了如下的異常 exception webbrowser.error,當瀏覽器控制項發生錯誤是會丟擲這個異常 webbrowser有以下方法 webbrowser.op...

python模組使用 python的模組使用

模組是python組織 的基本方式。乙個python指令碼可以單獨執行,也可以匯入到另乙個指令碼中執行,當指令碼被匯入執行時,我們將其稱為模組 module 所有的.py檔案都可以作為乙個模組匯入 模組名與指令碼的檔名相同 例如我們編寫了乙個名為hello.py的指令碼,則可以在另乙個指令碼中用im...

python easydict模組的簡單使用

1 問題的提出 d print d foo 如何想要訪問字典的元素需要這麼寫 print d bar y 如果想要繼續訪問字典中字典的元素需要使用二維陣列 注 print d.foo 這樣寫會出錯 輸出 3 22 解決方法 使用easydict模組 以訪問屬性的方式進行訪問 from easydic...