ดองดำเนินห้องสมุดหลามโปรโตคอลไบนารี serializing และ de-serializing วัตถุหลาม
เมื่อคุณimport torch
(หรือเมื่อคุณใช้ PyTorch) มันจะช่วยimport pickle
ให้คุณและคุณไม่จำเป็นต้องโทรpickle.dump()
และpickle.load()
โดยตรงซึ่งเป็นวิธีการบันทึกและโหลดวัตถุ
ในความเป็นจริงtorch.save()
และtorch.load()
จะห่อpickle.dump()
และpickle.load()
สำหรับคุณ
state_dict
คำตอบอื่น ๆ ที่กล่าวสมควรได้รับการบันทึกมากขึ้นเพียงไม่กี่
state_dict
เรามีอะไรใน PyTorch มีอยู่สองstate_dict
ตัว
โมเดล PyTorch torch.nn.Module
มีการmodel.parameters()
เรียกเพื่อรับพารามิเตอร์ที่เรียนรู้ได้ (w และ b) พารามิเตอร์ที่เรียนรู้ได้เหล่านี้เมื่อตั้งค่าแบบสุ่มจะอัปเดตตามเวลาที่เราเรียนรู้ พารามิเตอร์ learnable state_dict
เป็นครั้งแรก
ประการที่สองstate_dict
คือคำสั่งรัฐเพิ่มประสิทธิภาพ คุณจำได้ว่าเครื่องมือเพิ่มประสิทธิภาพใช้เพื่อปรับปรุงพารามิเตอร์ที่เรียนรู้ได้ของเรา แต่เครื่องมือเพิ่มประสิทธิภาพstate_dict
ได้รับการแก้ไข ไม่มีอะไรให้เรียนรู้ในนั้น
เนื่องจากstate_dict
วัตถุเป็นพจนานุกรมภาษาไพ ธ อนพวกเขาจึงสามารถบันทึกอัปเดตแก้ไขและเรียกคืนได้อย่างง่ายดายเพิ่มความเป็นโมดุลเดอเรชันให้กับโมเดล PyTorch และเครื่องมือเพิ่มประสิทธิภาพอย่างมาก
มาสร้างแบบจำลองง่าย ๆ เพื่ออธิบายสิ่งนี้:
import torch
import torch.optim as optim
model = torch.nn.Linear(5, 2)
# Initialize optimizer
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
print("Model's state_dict:")
for param_tensor in model.state_dict():
print(param_tensor, "\t", model.state_dict()[param_tensor].size())
print("Model weight:")
print(model.weight)
print("Model bias:")
print(model.bias)
print("---")
print("Optimizer's state_dict:")
for var_name in optimizer.state_dict():
print(var_name, "\t", optimizer.state_dict()[var_name])
รหัสนี้จะส่งออกต่อไปนี้:
Model's state_dict:
weight torch.Size([2, 5])
bias torch.Size([2])
Model weight:
Parameter containing:
tensor([[ 0.1328, 0.1360, 0.1553, -0.1838, -0.0316],
[ 0.0479, 0.1760, 0.1712, 0.2244, 0.1408]], requires_grad=True)
Model bias:
Parameter containing:
tensor([ 0.4112, -0.0733], requires_grad=True)
---
Optimizer's state_dict:
state {}
param_groups [{'lr': 0.001, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [140695321443856, 140695321443928]}]
หมายเหตุนี่เป็นรุ่นที่น้อยที่สุด คุณอาจลองเพิ่มชุดข้อมูลตามลำดับ
model = torch.nn.Sequential(
torch.nn.Linear(D_in, H),
torch.nn.Conv2d(A, B, C)
torch.nn.Linear(H, D_out),
)
หมายเหตุว่ามีเพียงชั้นกับพารามิเตอร์ learnable (ชั้นสับสนชั้นเชิงเส้น, ฯลฯ ) และบัฟเฟอร์ลงทะเบียน (ชั้น batchnorm) state_dict
มีรายการในรูปแบบของ
สิ่งที่ไม่สามารถเรียนรู้ได้นั้นเป็นของวัตถุของเครื่องมือเพิ่มประสิทธิภาพstate_dict
ซึ่งมีข้อมูลเกี่ยวกับสถานะของเครื่องมือเพิ่มประสิทธิภาพเช่นเดียวกับพารามิเตอร์ที่ใช้
เรื่องที่เหลือก็เหมือนกัน ในช่วงการอนุมาน (นี่เป็นระยะเมื่อเราใช้แบบจำลองหลังการฝึกอบรม) สำหรับการทำนาย เราทำนายตามพารามิเตอร์ที่เราเรียนรู้ model.state_dict()
ดังนั้นสำหรับการอนุมานเราก็จำเป็นต้องบันทึกค่าพารามิเตอร์
torch.save(model.state_dict(), filepath)
และเพื่อใช้ในภายหลัง model.load_state_dict (torch.load (filepath)) model.eval ()
หมายเหตุ: อย่าลืมบรรทัดสุดท้ายmodel.eval()
สิ่งนี้สำคัญมากหลังจากโหลดแบบจำลอง
torch.save(model.parameters(), filepath)
นอกจากนี้ยังไม่ได้พยายามที่จะบันทึก model.parameters()
เป็นเพียงวัตถุกำเนิดไฟฟ้า
ในด้านอื่น ๆ ที่torch.save(model, filepath)
จะช่วยประหยัดวัตถุรูปแบบของตัวเอง state_dict
แต่เก็บไว้ในใจแบบไม่ได้มีการเพิ่มประสิทธิภาพของ ตรวจสอบคำตอบที่ยอดเยี่ยมอื่น ๆ โดย @Jadiel de Armas เพื่อบันทึก dict สถานะของเครื่องมือเพิ่มประสิทธิภาพ