Soru PyTorch'da eğitimli bir model kaydetmenin en iyi yolu?


PyTorch'da eğitimli bir modeli kurtarmak için alternatif yollar arıyordum. Şimdiye kadar iki alternatif buldum.

  1. torch.save () bir model kaydetmek ve torch.load () model yüklemek için.
  2. model.state_dict () eğitimli bir model kaydetmek ve model.load_state_dict () Kaydedilen modeli yüklemek için

Buna rastladım tartışma Yaklaşım 2, yaklaşım 1 üzerinden tavsiye edilir.

Sorum şu, ikinci yaklaşım neden tercih ediliyor? Sadece çünkü torch.nn modüller bu iki işleve sahiptir ve bunları kullanmak için teşvik edilir?


60
2018-03-09 19:06


Menşei


Sanırım torch.save (), geri yayılım kullanımı için ara çıktılar gibi tüm ara değişkenleri de kaydetmesidir. Fakat sadece model parametrelerini, örneğin ağırlık / önyargı vb. Gibi kaydetmeniz gerekir. Bazen eski, ikincisinden çok daha büyük olabilir. - Dawei Yang
Test ettim torch.save(model, f) ve torch.save(model.state_dict(), f). Kaydedilen dosyalar aynı boyuta sahiptir. Şimdi kafam karıştı. Ayrıca, model.state_dict () öğesini son derece yavaş bir şekilde kaydetmek için turşu kullanarak buldum. Bence en iyi yol kullanmaktır torch.save(model.state_dict(), f)Modelin oluşturulmasını ele aldığınızdan ve torç model ağırlıklarının yüklenmesini üstlendiğinden, olası sorunları ortadan kaldırır. Referans: discuss.pytorch.org/t/saving-torch-models/838/4 - Dawei Yang


Cevaplar:


buldum bu sayfa Github repo'larında, içeriği buraya yapıştırırım.


Bir modeli kaydetmek için önerilen yaklaşım

Bir modeli serileştirmek ve geri yüklemek için iki ana yaklaşım vardır.

İlk (önerilen), yalnızca model parametrelerini kaydeder ve yükler:

torch.save(the_model.state_dict(), PATH)

Daha sonra:

the_model = TheModelClass(*args, **kwargs)
the_model.load_state_dict(torch.load(PATH))

İkincisi, tüm modeli kaydeder ve yükler:

torch.save(the_model, PATH)

Daha sonra:

the_model = torch.load(PATH)

Ancak bu durumda, serileştirilmiş veriler belirli sınıflara bağlanır. ve kullanılan tam dizin yapısı, bu yüzden çeşitli şekillerde kırılabilir diğer projelerde veya bazı ciddi refakatçilerden sonra kullanılır.


85
2018-05-06 10:18



Göre göre discuss.pytorch.org/t/saving-and-loading-a-model-in-pytorch/... model varsayılan olarak modeli eğitmek için yeniden yükler. Bu nedenle, yüklemeden sonra, eğitimin devam etmemesi için yüklemeden sonra the_model.eval () öğesini elle çağırmanız gerekir. - WillZ


Ne yapmak istediğine bağlı.

Durum # 1: Çıkarım için kendiniz kullanmak için modeli kaydedin: Modeli kurtarırsınız, geri yüklersiniz ve sonra modeli değerlendirme moduna geçirirsiniz. Bu, genellikle sahip olduğunuz için yapılır BatchNorm ve Dropout varsayılan olarak, yapım aşamasında tren modunda olan katmanlar:

torch.save(model.state_dict(), filepath)

#Later to restore:
model.load_state_dict(torch.load(filepath))
model.eval()

Vaka # 2: Daha sonra eğitime devam etmek için modeli kaydedin: Tasarlamak üzere olduğunuz modeli eğitmeye devam etmeniz gerekiyorsa, sadece modelden daha fazlasını kaydetmeniz gerekir. Ayrıca, optimizer, epoch, skor vb. Durumlarını da kaydetmeniz gerekir. Bunu böyle yaparsınız:

state = {
    'epoch': epoch,
    'state_dict': model.state_dict(),
    'optimizer': optimizer.state_dict(),
    ...
}
torch.save(state, filepath)

Antrenmana devam edebilmek için aşağıdaki gibi şeyler yaparsınız: state = torch.load(filepath)ve sonra, her nesnenin durumunu geri yüklemek için böyle bir şey:

model.load_state_dict(state['state_dict'])
optimizer.load_state_dict(stata['optimizer'])

Eğitime devam ettiğiniz için, ÇALIŞMAYIN model.eval() yükleme yaparken durumları geri yükledikten sonra.

Örnek 3: Kodunuza erişimi olmayan başka biri tarafından kullanılacak model: Tensorflow'da bir .pb Hem mimariyi hem de modelin ağırlıklarını tanımlayan dosya. Bu çok kullanışlı, özellikle kullanılırken Tensorflow serve. Bunu Pytorch'ta yapmanın eşdeğer yolu şöyle olurdu:

torch.save(model, filepath)

# Then later:
model = torch.load(filepath)

Bu yol hala kurşun geçirmez değildir ve pytorch hala çok fazla değişiklik geçirdiği için tavsiye etmem.


30
2018-03-02 23:34



2. durumda antrenmana nasıl devam edersiniz? - Atnas
Cevabı uygun şekilde güncelleyeceğim. - Jadiel de Armas


Bunu okuyan insanlar da bir göz atmak isteyebilir torch.onnx.

https://github.com/onnx/tutorials/blob/master/tutorials/PytorchOnnxExport.ipynb


0
2018-05-17 21:07