10-bo‘lim
Modelni saqlash va yuklash
state_dict, torch.save va torch.load, nazorat nuqtasi (checkpoint), eval() ni unutmaslik va tez-tez uchraydigan xatolar.
Ushbu bo‘lim mundarijasi
Model soatlab o'qidi - endi uni saqlash kerak. Aks holda dastur yopilganda hamma mehnat yo'qoladi.
state_dict nima #
PyTorch butun modelni emas, uning parametrlarini saqlashni tavsiya
qiladi. Ular state_dict da oddiy lug'at ko'rinishida turadi:
import torch
import torch.nn as nn
torch.manual_seed(42)
model = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 2))
sd = model.state_dict()
print("state_dict kalitlari:")
for k, v in sd.items():
print(f" {k:16s} {tuple(v.shape)}")
state_dict kalitlari:
0.weight (8, 4)
0.bias (8,)
2.weight (2, 8)
2.bias (2,)
0 va 2 - Sequential ichidagi qatlam raqamlari. 1 yo'q, chunki u
ReLU - unda parametr yo'q.
Saqlash va yuklash #
import os
torch.save(model.state_dict(), "model.pt")
print("fayl hajmi:", os.path.getsize("model.pt"), "bayt")
yangi = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 2))
x = torch.randn(1, 4)
print("yuklashdan oldin bir xilmi:", torch.allclose(model(x), yangi(x)))
yangi.load_state_dict(torch.load("model.pt"))
yangi.eval()
print("yuklashdan keyin bir xilmi:", torch.allclose(model(x), yangi(x)))
fayl hajmi: 2505 bayt
yuklashdan oldin bir xilmi: False
yuklashdan keyin bir xilmi: True
Yangi model boshida tasodifiy parametrlar bilan yaratilgani uchun javobi boshqacha edi. Yuklashdan keyin esa aynan bir xil javob berdi.
model.eval() ni unutmangload_state_dict modelni o'qish rejimida qoldiradi. Agar modelda
Dropout yoki BatchNorm bo'lsa, bashoratlar tasodifiy bo'lib
chiqadi.
Xato xabari chiqmaydi - siz shunchaki «nega natija har safar boshqacha»
deb hayron bo'lasiz. Bashoratdan oldin doim model.eval() yozing.
Ikki yondashuv #
| Yondashuv | Yozuv | Baho |
|---|---|---|
| Faqat parametrlar | torch.save(model.state_dict(), ...) | Tavsiya etiladi - ishonchli va ko'chma |
| Butun model | torch.save(model, ...) | Sinf ta'rifiga bog'lanib qoladi, sinf ko'chsa buziladi |
Ikkinchi yo'l qisqaroq ko'rinadi, lekin fayl ichiga sinfingiz qayerda joylashgani ham yoziladi. Fayl nomini yoki papkani o'zgartirsangiz, yuklash ishlamaydi.
.pt, .pth yoki boshqami?Kengaytmaning texnik ahamiyati yo'q - hammasi bir xil formatda saqlanadi.
Jamoada .pt ko'proq ishlatiladi. Muhimi - butun loyihada bitta
kengaytmaga amal qilish.
Nazorat nuqtasi (checkpoint) #
Uzoq o'qitishda faqat parametrlar yetarli emas. Optimizator ham o'z holatini saqlaydi (Adam da har parametr uchun ikkita qo'shimcha son). O'qitishni to'xtatib, keyin davom ettirmoqchi bo'lsangiz, ularni ham saqlash kerak:
opt = torch.optim.Adam(model.parameters(), lr=0.01)
# ... bir necha davr o'qitildi ...
nazorat = {
"davr": 5,
"model": model.state_dict(),
"optimizator": opt.state_dict(),
"eng_yaxshi_yoqotish": 0.2431,
}
torch.save(nazorat, "nazorat.pt")
print("nazorat fayli:", os.path.getsize("nazorat.pt"), "bayt")
yuk = torch.load("nazorat.pt", weights_only=False)
print("kalitlar:", list(yuk.keys()))
print("davr:", yuk["davr"], "| yo'qotish:", yuk["eng_yaxshi_yoqotish"])
nazorat fayli: 6067 bayt
kalitlar: ['davr', 'model', 'optimizator', 'eng_yaxshi_yoqotish']
davr: 5 | yo'qotish: 0.2431
Nazorat fayli 6067 bayt - model faylidan (2505) ikki baravardan ko'proq. Farq Adam ning ichki holatidan.
weight_only haqidaYangi PyTorch versiyalarida torch.load xavfsizlik uchun sukut bo'yicha
faqat tenzorlarni yuklaydi. Lug'at ichida son va matn ham bo'lsa,
weights_only=False yozish kerak.
Shu sababli begona manbadan olingan .pt faylni ishonchsiz holda
yuklamang - u ichida kod bo'lishi mumkin. Faqat o'zingiz yaratgan yoki
rasmiy manbadagi fayllarni yuklang.
Saqlash oqimi #
Tuzilish mos kelmasa #
boshqa = nn.Sequential(nn.Linear(4, 16), nn.ReLU(), nn.Linear(16, 2))
boshqa.load_state_dict(torch.load("model.pt"))
RuntimeError: Error(s) in loading state_dict for Sequential:
size mismatch for 0.weight: copying a param with shape torch.Size([8, 4]) from checkpoint,
the shape in current model is torch.Size([16, 4]).
Yashirin qatlam 8 emas, 16 bo'lgani uchun parametrlar sig'madi. Xato xabari aniq: qaysi qatlam, qaysi shakl kutilgan va qaysisi kelgan.
Nazorat faylingizga model o'lchamlarini qo'shib qo'ying:
nazorat["tuzilish"] = {"kirish": 4, "yashirin": 8, "chiqish": 2}
Bir necha oy o'tib, yashirin qatlam 8 mi yoki 64 mi ekanini eslashga urinmaysiz - fayl o'zi aytib beradi.
- Model yaratib,
state_dict()kalitlarini chop eting. ReLUnega kalitlar orasida yo'qligini tushuntiring.- Modelni
model.ptga saqlang va fayl hajmini ko'ring. - Yangi model yaratib, yuklashdan oldin va keyin javoblarni solishtiring.
torch.allclosebilan ikki model bir xilligini tekshiring.- Yashirin qatlam o'lchamini o'zgartirib, yuklashga urinib, xatoni o'qing.
- Model, optimizator va davr raqamini bitta nazorat lug'atida saqlang.
- Nazorat faylini yuklab, davr raqamini qayta tiklang.
- Nazorat fayli nega model faylidan kattaroq ekanini tushuntiring.
model.eval()siz bashorat qilib, keyineval()bilan solishtiring.
Xulosa #
- PyTorch da butun model emas,
state_dictsaqlanadi. state_dict- qatlam nomi va parametr tenzorlaridan iborat oddiy lug'at.ReLUkabi parametrsiz qatlamlar unda ko'rinmaydi.- Saqlash:
torch.save(model.state_dict(), "model.pt"). - Yuklash uchun avval bir xil tuzilishli model yaratiladi, keyin
load_state_dictchaqiriladi. - Yuklashdan keyin
model.eval()shart - aks holda bashoratlar tasodifiy bo'ladi. torch.save(model, ...)qisqaroq, lekin sinf joylashuviga bog'lanib qoladi.- Nazorat nuqtasiga model, optimizator holati va davr raqamini birga saqlang.
- Optimizator holati fayl hajmini ikki baravarga oshirishi mumkin - bu normal.
- Begona manbadan olingan
.ptfaylni ehtiyotsiz yuklamang.
Keyingi bo'limda modelning eng keng tarqalgan kasalligi - ortiqcha moslashish bilan tanishamiz.
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.