7-bo‘lim
Dataset va DataLoader
TensorDataset, o'z Dataset sinfingiz, DataLoader bilan paketlash, aralashtirish, drop_last va ma'lumotni bo'lish.
Ushbu bo‘lim mundarijasi
Hozirgacha biz butun ma'lumotni bir vaqtda modelga berdik. Real loyihada bu mumkin emas: 100 000 ta rasm xotiraga sig'maydi. PyTorch buni ikkita sinf bilan hal qiladi:
Dataset- «menda nechta namuna bor vai-namuna nimadan iborat» degan savolga javob beradi.DataLoader- o'sha namunalarni paketlarga bo'lib, aralashtirib beradi.
Tayyor TensorDataset #
Ma'lumot allaqachon tenzorda bo'lsa, eng qisqa yo'l:
import torch
from torch.utils.data import Dataset, DataLoader, TensorDataset, random_split
torch.manual_seed(42)
X = torch.randn(100, 3)
y = (X.sum(dim=1) > 0).long()
tds = TensorDataset(X, y)
print("namunalar soni:", len(tds))
xb, yb = tds[0]
print("bitta namuna:", xb.shape, "nishon =", yb.item())
namunalar soni: 100
bitta namuna: torch.Size([3]) nishon = 1
tds[0] bitta namunani qaytardi - paketni emas. Bu muhim farq.
O'z Dataset sinfingiz #
Ma'lumot fayllarda, papkalarda yoki ma'lumotlar bazasida bo'lsa, o'z sinfingizni yozasiz. Faqat uchta metod kerak:
class HaroratDataset(Dataset):
def __init__(self, selsiy):
self.x = torch.tensor(selsiy, dtype=torch.float32).unsqueeze(1)
self.y = self.x * 1.8 + 32
def __len__(self):
return len(self.x)
def __getitem__(self, i):
return self.x[i], self.y[i]
hd = HaroratDataset([0.0, 10.0, 25.0, 37.0, 100.0])
print("uzunlik:", len(hd))
for i in range(3):
a, b = hd[i]
print(f" {a.item():6.1f}C -> {b.item():6.1f}F")
uzunlik: 5
0.0C -> 32.0F
10.0C -> 50.0F
25.0C -> 77.0F
| Metod | Vazifasi |
|---|---|
__init__ | Ma'lumot manzilini tayyorlaydi - yo'llar ro'yxati, jadval, tenzor |
__len__ | Namunalar sonini qaytaradi |
__getitem__(i) | Bitta namunani (kirish, nishon) ko'rinishida qaytaradi |
__getitem__ ga qoldiringRasmlar bilan ishlaganda __init__ da faqat fayl yo'llarini saqlang,
rasmning o'zini esa __getitem__ da o'qing. Aks holda butun to'plam
xotiraga yuklanadi va katta ma'lumotda dastur ishga ham tushmaydi.
DataLoader - paketlash #
dl = DataLoader(tds, batch_size=16, shuffle=True)
print("paketlar soni:", len(dl))
for i, (xb, yb) in enumerate(dl):
print(f" {i+1}-paket: {tuple(xb.shape)} nishonlar {tuple(yb.shape)}")
if i == 2:
break
paketlar soni: 7
1-paket: (16, 3) nishonlar (16,)
2-paket: (16, 3) nishonlar (16,)
3-paket: (16, 3) nishonlar (16,)
100 ta namuna, 16 talik paket - 100 / 16 = 6.25, demak 7 ta paket.
Oxirgisi to'liq bo'lmaydi:
oxirgi = None
for xb, yb in dl:
oxirgi = xb
print("oxirgi paket shakli:", tuple(oxirgi.shape))
dl2 = DataLoader(tds, batch_size=16, shuffle=True, drop_last=True)
print("drop_last=True bilan paketlar:", len(dl2))
oxirgi paket shakli: (4, 3)
drop_last=True bilan paketlar: 6
Oxirgi paketda 16 emas, 4 ta namuna bor. drop_last=True uni butunlay
tashlab yuboradi.
Aralashtirish nima uchun kerak #
d = DataLoader(tds, batch_size=4, shuffle=False)
xb, yb = next(iter(d))
print("shuffle=False birinchi nishonlar:", yb.tolist())
d = DataLoader(tds, batch_size=4, shuffle=True, generator=torch.Generator().manual_seed(0))
xb, yb = next(iter(d))
print("shuffle=True birinchi nishonlar:", yb.tolist())
shuffle=False birinchi nishonlar: [1, 0, 0, 0]
shuffle=True birinchi nishonlar: [1, 0, 1, 1]
shuffle=False - jiddiy xatoMa'lumot sinf bo'yicha tartiblangan bo'lsa (avval barcha mushuklar, keyin
barcha itlar), shuffle=False bilan model bir necha davr davomida faqat
mushuk ko'radi, keyin faqat it.
Natijada u har paketda «hammasi bitta sinf» deb o'rganadi va yo'qotish
sakrab turadi. O'quv to'plamida doim shuffle=True, validatsiya va
testda esa kerak emas.
Ma'lumotni bo'lish #
Model qanchalik o'rganganini bilish uchun u ko'rmagan ma'lumot kerak:
oq, val = random_split(tds, [80, 20], generator=torch.Generator().manual_seed(42))
print("o'quv:", len(oq), "| validatsiya:", len(val))
o'quv: 80 | validatsiya: 20
| To'plam | Ulushi | Vazifasi |
|---|---|---|
| O'quv (train) | ~70-80% | Model parametrlarni shundan o'rganadi |
| Validatsiya | ~10-15% | Sozlamalarni tanlash va o'qishni kuzatish |
| Test | ~10-15% | Faqat bir marta, oxirida - haqiqiy baho |
generator nima uchun berildirandom_split tasodifiy bo'ladi. generator=torch.Generator().manual_seed(42)
berilsa, bo'linish har safar bir xil chiqadi - natijalaringiz
takrorlanadigan bo'ladi.
Foydali sozlamalar #
| Sozlama | Ma'nosi |
|---|---|
batch_size | Bir paketdagi namunalar soni - 32 yoki 64 dan boshlang |
shuffle=True | Har davrda tartibni aralashtiradi - o'quv to'plamida shart |
drop_last=True | To'liq bo'lmagan oxirgi paketni tashlaydi |
num_workers=4 | Ma'lumotni parallel o'qiydi - rasm to'plamlarida tezlik beradi |
pin_memory=True | GPU ga ko'chirishni tezlashtiradi (9-bo'limda) |
num_workers ni Windows da ehtiyot bilan ishlatingLinux va macOS da num_workers=4 odatda muammosiz. Windows da esa kodni
if __name__ == "__main__": ichiga olmasangiz, dastur o'zini cheksiz
qayta ishga tushirishi mumkin. Ishlamasa, num_workers=0 qilib qo'ying.
TensorDatasetyarating valen()hamdads[0]natijasini chop eting.- Santimetrni dyuymga aylantiradigan
Datasetsinfini yozing. - Uning
__len__va__getitem__metodlarini sinab ko'ring. DataLoadernibatch_size=8bilan yaratib, paketlar sonini hisoblang.- Qo'lda hisoblangan paketlar sonini dastur natijasi bilan solishtiring.
- Oxirgi paket shaklini chop etib, u nega kichikroq ekanini tushuntiring.
drop_last=Trueqo'shib, paketlar soni qanday o'zganini ko'ring.shuffle=Falsevashuffle=Trueda birinchi paket nishonlarini solishtiring.random_splitbilan ma'lumotni 80/20 ga bo'ling.generatorni olib tashlab, bo'linish har safar o'zgarishini tekshiring.
Xulosa #
Datasetbitta namunani beradi,DataLoaderulardan paket yasaydi.- Tenzor tayyor bo'lsa,
TensorDataseteng qisqa yo'l. - O'z sinfingizda uchta metod kerak:
__init__,__len__,__getitem__. __getitem__bitta namunani qaytaradi - paketni emas.- Og'ir o'qishni
__getitem__ga qoldiring,__init__da faqat yo'llarni saqlang. - Paketlar soni - namunalar sonining paket hajmiga bo'linganidan yuqoriga yaxlitlangani.
- Oxirgi paket to'liq bo'lmasligi mumkin;
drop_last=Trueuni tashlaydi. - O'quv to'plamida
shuffle=Truemajburiy - tartiblangan ma'lumotda usiz model buziladi. - Validatsiya va testda aralashtirish kerak emas.
random_splitma'lumotni bo'ladi;generatorbilan bo'linish takrorlanadigan bo'ladi.
Keyingi bo'limda shu qismlarning hammasini bitta to'liq o'quv sikliga birlashtiramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.