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.

🕑 8 daqiqa o‘qish 📄 566 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. state_dict nima
  2. Saqlash va yuklash
  3. Ikki yondashuv
  4. Nazorat nuqtasi (checkpoint)
  5. Saqlash oqimi
  6. Tuzilish mos kelmasa
  7. Xulosa

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:

Python
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)}")
Natija
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 #

Python
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)))
Natija
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.

Yuklashdan keyin model.eval() ni unutmang

load_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 #

YondashuvYozuvBaho
Faqat parametrlartorch.save(model.state_dict(), ...)Tavsiya etiladi - ishonchli va ko'chma
Butun modeltorch.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:

Python
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"])
Natija
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 haqida

Yangi 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 #

Saqlash va qaytadan yuklash SAQLASH o'qitilgan model model.state_dict() torch.save model.pt diskdagi fayl boshqa kun, boshqa mashina YUKLASH 1. bir xil tuzilishli model yangi = Sequential(...) 2. parametrlarni joylash load_state_dict(...) 3. bashorat rejimiga o'tish model.eval() Model tuzilishi kodda qoladi faylda faqat sonlar bor
Fayl faqat parametrlarni saqlaydi - model tuzilishi kodda bo'lishi shart

Tuzilish mos kelmasa #

Python
boshqa = nn.Sequential(nn.Linear(4, 16), nn.ReLU(), nn.Linear(16, 2))
boshqa.load_state_dict(torch.load("model.pt"))
Natija
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.

Shuning uchun tuzilishni ham saqlang

Nazorat faylingizga model o'lchamlarini qo'shib qo'ying:

Python
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.

Amaliy topshiriq
  1. Model yaratib, state_dict() kalitlarini chop eting.
  2. ReLU nega kalitlar orasida yo'qligini tushuntiring.
  3. Modelni model.pt ga saqlang va fayl hajmini ko'ring.
  4. Yangi model yaratib, yuklashdan oldin va keyin javoblarni solishtiring.
  5. torch.allclose bilan ikki model bir xilligini tekshiring.
  6. Yashirin qatlam o'lchamini o'zgartirib, yuklashga urinib, xatoni o'qing.
  7. Model, optimizator va davr raqamini bitta nazorat lug'atida saqlang.
  8. Nazorat faylini yuklab, davr raqamini qayta tiklang.
  9. Nazorat fayli nega model faylidan kattaroq ekanini tushuntiring.
  10. model.eval() siz bashorat qilib, keyin eval() bilan solishtiring.

Xulosa #

  • PyTorch da butun model emas, state_dict saqlanadi.
  • state_dict - qatlam nomi va parametr tenzorlaridan iborat oddiy lug'at.
  • ReLU kabi parametrsiz qatlamlar unda ko'rinmaydi.
  • Saqlash: torch.save(model.state_dict(), "model.pt").
  • Yuklash uchun avval bir xil tuzilishli model yaratiladi, keyin load_state_dict chaqiriladi.
  • 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 .pt faylni ehtiyotsiz yuklamang.

Keyingi bo'limda modelning eng keng tarqalgan kasalligi - ortiqcha moslashish bilan tanishamiz.

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.