Bir modelin durumunu kaydetme ve geri yükleme yeteneği, transfer öğrenimi veya önceden eğitilmiş modeller kullanılarak çıkarım yapılması gibi birçok uygulama için hayati öneme sahiptir. Bir modelin parametrelerini (ağırlıklar, önyargılar vb.) bir kontrol noktası dosyasına veya dizine kaydetmek, bunu başarmanın bir yoludur.
Bu modül , TensorFlow v2 formatı kontrol noktalarını yüklemek ve kaydetmek için yüksek seviyeli bir arayüzün yanı sıra bu dosya formatına yazan ve bu formattan okuyan daha düşük seviyeli bileşenler sağlar.
Basit modelleri yükleme ve kaydetme
Checkpointable
protokolüne uygun olarak birçok basit model, herhangi bir ek kod gerekmeden kontrol noktalarına serileştirilebilir:
import Checkpoints
import ImageClassificationModels
extension LeNet: Checkpointable {}
var model = LeNet()
...
try model.writeCheckpoint(to: directory, name: "LeNet")
ve daha sonra aynı kontrol noktası aşağıdakiler kullanılarak okunabilir:
try model.readCheckpoint(from: directory, name: "LeNet")
Model yükleme ve kaydetmeye yönelik bu varsayılan uygulama, modeldeki her tensör için, model yapıları içindeki özelliklerin adlarına dayanan yol tabanlı bir adlandırma şeması kullanacaktır. Örneğin, LeNet-5 modelindeki ilk evrişimdeki ağırlıklar ve sapmalar sırasıyla conv1/filter
ve conv1/bias
adlarıyla kaydedilecektir. Yükleme sırasında kontrol noktası okuyucusu bu adlara sahip tensörleri arayacaktır.
Model yükleme ve kaydetmeyi özelleştirme
Hangi tensörlerin kaydedilip yükleneceği veya bu tensörlerin adlandırılması üzerinde daha fazla kontrole sahip olmak istiyorsanız Checkpointable
protokolü birkaç özelleştirme noktası sunar.
Belirli türlerdeki özellikleri yok saymak için, modelinizde Type.property
biçiminde bir dizi dizi döndüren bir ignoredTensorPaths
uygulaması sağlayabilirsiniz. Örneğin, her Dikkat katmanında scale
özelliğini yok saymak için ["Attention.scale"]
değerini döndürebilirsiniz.
Varsayılan olarak, bir modeldeki daha derindeki her düzeyi ayırmak için eğik çizgi kullanılır. Bu, modelinize checkpointSeparator
uygulanarak ve bu ayırıcı için kullanılacak yeni bir dize sağlanarak özelleştirilebilir.
Son olarak, tensör adlandırmasında en yüksek düzeyde özelleştirme için tensorNameMap
uygulayabilir ve modeldeki bir tensör için oluşturulan varsayılan dize adından denetim noktasında istenen dize adına eşleyen bir işlev sağlayabilirsiniz. En yaygın olarak bu, her biri kendi adlandırma kurallarına ve model yapılarına sahip olan diğer çerçevelerle oluşturulan kontrol noktalarıyla birlikte çalışmak için kullanılacaktır. Özel bir eşleme işlevi, bu tensörlerin nasıl adlandırılacağı konusunda en yüksek düzeyde özelleştirme sağlar.
Varsayılan CheckpointWriter.identityMap
(kontrol noktaları için otomatik olarak oluşturulan tensör yolu adını kullanır) veya bir sözlükten eşleme oluşturabilen CheckpointWriter.lookupMap(table:)
işlevi gibi bazı standart yardımcı işlevler sağlanır.
Özel eşlemenin nasıl gerçekleştirilebileceğine dair bir örnek için lütfen OpenAI'nin kontrol noktaları için kullanılan adlandırma şemasıyla tam olarak eşleşmek üzere bir eşleme işlevi kullanan GPT-2 modeline bakın.
CheckpointReader ve CheckpointWriter bileşenleri
Denetim noktası yazımı için, Checkpointable
protokolü tarafından sağlanan uzantı, bir modelin özellikleri üzerinde yineleme yapmak ve dize tensör yollarını Tensör değerlerine eşleyen bir sözlük oluşturmak için yansıma ve anahtar yolları kullanır. Bu sözlük, denetim noktasının yazılacağı bir dizinle birlikte temel bir CheckpointWriter
sağlanır. Bu CheckpointWriter
söz konusu sözlükten disk üzerindeki kontrol noktasını oluşturma görevini yerine getirir.
Bu sürecin tersi, CheckpointReader
diskteki kontrol noktası dizininin konumunun verildiği okumadır. Daha sonra bu kontrol noktasından okur ve kontrol noktası içindeki tensörlerin adlarını kayıtlı değerleriyle eşleştiren bir sözlük oluşturur. Bu sözlük, bir modeldeki mevcut tensörleri bu sözlüktekilerle değiştirmek için kullanılır.
Hem yükleme hem de kaydetme için Checkpointable
protokolü, yukarıda açıklanan eşleme işlevini kullanarak tensörlere giden dizi yollarını karşılık gelen disk üzerindeki tensör adlarıyla eşler.
Checkpointable
protokolü gerekli işlevselliğe sahip değilse veya kontrol noktası yükleme ve kaydetme işlemi üzerinde daha fazla kontrol isteniyorsa CheckpointReader
ve CheckpointWriter
sınıfları kendi başlarına kullanılabilir.
TensorFlow v2 kontrol noktası formatı
TensorFlow v2 kontrol noktası formatı, bu başlıkta kısaca açıklandığı gibi, TensorFlow modeli kontrol noktaları için ikinci nesil formattır. Bu ikinci nesil format, 2016'nın sonlarından beri kullanılmaktadır ve v1 kontrol noktası formatına göre bir dizi iyileştirmeye sahiptir. TensorFlow SavedModel'ler, model parametrelerini kaydetmek için içlerindeki v2 kontrol noktalarını kullanır.
TensorFlow v2 kontrol noktası aşağıdaki gibi bir yapıya sahip bir dizinden oluşur:
checkpoint/modelname.index
checkpoint/modelname.data-00000-of-00002
checkpoint/modelname.data-00001-of-00002
burada ilk dosya denetim noktasının meta verilerini saklar ve geri kalan dosyalar model için serileştirilmiş parametreleri tutan ikili parçalardır.
Dizin meta veri dosyası, parçalarda bulunan tüm serileştirilmiş tensörlerin türlerini, boyutlarını, konumlarını ve dize adlarını içerir. Bu indeks dosyası, kontrol noktasının yapısal olarak en karmaşık kısmıdır ve kendisi de SSTable/LevelDB'yi temel alan tensorflow::table
temel alır. Bu indeks dosyası, anahtarların dizeler ve değerlerin protokol arabellekleri olduğu bir dizi anahtar-değer çiftinden oluşur. Dizeler sıralanır ve önek sıkıştırılır. Örneğin: ilk giriş conv1/weight
ve sonraki conv1/bias
ise, ikinci giriş yalnızca bias
kısmını kullanır.
Bu genel dizin dosyası bazen Snappy sıkıştırması kullanılarak sıkıştırılır. SnappyDecompression.swift
dosyası, sıkıştırılmış bir Veri örneğinden Snappy açma işleminin yerel Swift uygulamasını sağlar.
Dizin başlığı meta verileri ve tensör meta verileri, protokol arabellekleri olarak kodlanır ve Swift Protobuf aracılığıyla doğrudan kodlanır/kodları çözülür.
CheckpointIndexReader
ve CheckpointIndexWriter
sınıfları, bu dizin dosyalarının yüklenmesini ve kaydedilmesini, kapsamlı CheckpointReader
ve CheckpointWriter
sınıflarının bir parçası olarak yönetir. İkincisi, tensör verilerini içeren yapısal olarak daha basit ikili parçalara neyin okunacağını ve bunlara ne yazılacağını belirlemek için indeks dosyalarını temel olarak kullanır.
Bir modelin durumunu kaydetme ve geri yükleme yeteneği, transfer öğrenimi veya önceden eğitilmiş modeller kullanılarak çıkarım yapılması gibi birçok uygulama için hayati öneme sahiptir. Bir modelin parametrelerini (ağırlıklar, önyargılar vb.) bir kontrol noktası dosyasına veya dizine kaydetmek, bunu başarmanın bir yoludur.
Bu modül , TensorFlow v2 formatı kontrol noktalarını yüklemek ve kaydetmek için yüksek seviyeli bir arayüzün yanı sıra bu dosya formatına yazan ve bu formattan okuyan daha düşük seviyeli bileşenler sağlar.
Basit modelleri yükleme ve kaydetme
Checkpointable
protokolüne uygun olarak birçok basit model, herhangi bir ek kod gerekmeden kontrol noktalarına serileştirilebilir:
import Checkpoints
import ImageClassificationModels
extension LeNet: Checkpointable {}
var model = LeNet()
...
try model.writeCheckpoint(to: directory, name: "LeNet")
ve daha sonra aynı kontrol noktası aşağıdakiler kullanılarak okunabilir:
try model.readCheckpoint(from: directory, name: "LeNet")
Model yükleme ve kaydetmeye yönelik bu varsayılan uygulama, modeldeki her tensör için, model yapıları içindeki özelliklerin adlarına dayanan yol tabanlı bir adlandırma şeması kullanacaktır. Örneğin, LeNet-5 modelindeki ilk evrişimdeki ağırlıklar ve sapmalar sırasıyla conv1/filter
ve conv1/bias
adlarıyla kaydedilecektir. Yükleme sırasında kontrol noktası okuyucusu bu adlara sahip tensörleri arayacaktır.
Model yükleme ve kaydetmeyi özelleştirme
Hangi tensörlerin kaydedilip yükleneceği veya bu tensörlerin adlandırılması üzerinde daha fazla kontrole sahip olmak istiyorsanız Checkpointable
protokolü birkaç özelleştirme noktası sunar.
Belirli türlerdeki özellikleri yok saymak için, modelinizde Type.property
biçiminde bir dizi dizi döndüren bir ignoredTensorPaths
uygulaması sağlayabilirsiniz. Örneğin, her Dikkat katmanında scale
özelliğini yok saymak için ["Attention.scale"]
değerini döndürebilirsiniz.
Varsayılan olarak, bir modeldeki daha derindeki her düzeyi ayırmak için eğik çizgi kullanılır. Bu, modelinize checkpointSeparator
uygulanarak ve bu ayırıcı için kullanılacak yeni bir dize sağlanarak özelleştirilebilir.
Son olarak, tensör adlandırmasında en yüksek düzeyde özelleştirme için tensorNameMap
uygulayabilir ve modeldeki bir tensör için oluşturulan varsayılan dize adından denetim noktasında istenen dize adına eşleyen bir işlev sağlayabilirsiniz. En yaygın olarak bu, her biri kendi adlandırma kurallarına ve model yapılarına sahip olan diğer çerçevelerle oluşturulan kontrol noktalarıyla birlikte çalışmak için kullanılacaktır. Özel bir eşleme işlevi, bu tensörlerin nasıl adlandırılacağı konusunda en yüksek düzeyde özelleştirme sağlar.
Varsayılan CheckpointWriter.identityMap
(kontrol noktaları için otomatik olarak oluşturulan tensör yolu adını kullanır) veya bir sözlükten eşleme oluşturabilen CheckpointWriter.lookupMap(table:)
işlevi gibi bazı standart yardımcı işlevler sağlanır.
Özel eşlemenin nasıl gerçekleştirilebileceğine dair bir örnek için lütfen OpenAI'nin kontrol noktaları için kullanılan adlandırma şemasıyla tam olarak eşleşmek üzere bir eşleme işlevi kullanan GPT-2 modeline bakın.
CheckpointReader ve CheckpointWriter bileşenleri
Denetim noktası yazımı için, Checkpointable
protokolü tarafından sağlanan uzantı, bir modelin özellikleri üzerinde yineleme yapmak ve dize tensör yollarını Tensör değerlerine eşleyen bir sözlük oluşturmak için yansıma ve anahtar yolları kullanır. Bu sözlük, denetim noktasının yazılacağı bir dizinle birlikte temel bir CheckpointWriter
sağlanır. Bu CheckpointWriter
söz konusu sözlükten disk üzerindeki kontrol noktasını oluşturma görevini yerine getirir.
Bu sürecin tersi, CheckpointReader
diskteki kontrol noktası dizininin konumunun verildiği okumadır. Daha sonra bu kontrol noktasından okur ve kontrol noktası içindeki tensörlerin adlarını kayıtlı değerleriyle eşleştiren bir sözlük oluşturur. Bu sözlük, bir modeldeki mevcut tensörleri bu sözlüktekilerle değiştirmek için kullanılır.
Hem yükleme hem de kaydetme için Checkpointable
protokolü, yukarıda açıklanan eşleme işlevini kullanarak tensörlere giden dizi yollarını karşılık gelen disk üzerindeki tensör adlarıyla eşler.
Checkpointable
protokolü gerekli işlevselliğe sahip değilse veya kontrol noktası yükleme ve kaydetme işlemi üzerinde daha fazla kontrol isteniyorsa CheckpointReader
ve CheckpointWriter
sınıfları kendi başlarına kullanılabilir.
TensorFlow v2 kontrol noktası formatı
TensorFlow v2 kontrol noktası formatı, bu başlıkta kısaca açıklandığı gibi, TensorFlow modeli kontrol noktaları için ikinci nesil formattır. Bu ikinci nesil format, 2016'nın sonlarından beri kullanılmaktadır ve v1 kontrol noktası formatına göre bir dizi iyileştirmeye sahiptir. TensorFlow SavedModel'ler, model parametrelerini kaydetmek için içlerindeki v2 kontrol noktalarını kullanır.
TensorFlow v2 kontrol noktası aşağıdaki gibi bir yapıya sahip bir dizinden oluşur:
checkpoint/modelname.index
checkpoint/modelname.data-00000-of-00002
checkpoint/modelname.data-00001-of-00002
burada ilk dosya denetim noktasının meta verilerini saklar ve geri kalan dosyalar model için serileştirilmiş parametreleri tutan ikili parçalardır.
Dizin meta veri dosyası, parçalarda bulunan tüm serileştirilmiş tensörlerin türlerini, boyutlarını, konumlarını ve dize adlarını içerir. Bu indeks dosyası, kontrol noktasının yapısal olarak en karmaşık kısmıdır ve kendisi de SSTable/LevelDB'yi temel alan tensorflow::table
temel alır. Bu indeks dosyası, anahtarların dizeler ve değerlerin protokol arabellekleri olduğu bir dizi anahtar-değer çiftinden oluşur. Dizeler sıralanır ve önek sıkıştırılır. Örneğin: ilk giriş conv1/weight
ve sonraki conv1/bias
ise, ikinci giriş yalnızca bias
kısmını kullanır.
Bu genel dizin dosyası bazen Snappy sıkıştırması kullanılarak sıkıştırılır. SnappyDecompression.swift
dosyası, sıkıştırılmış bir Veri örneğinden Snappy açma işleminin yerel Swift uygulamasını sağlar.
Dizin başlığı meta verileri ve tensör meta verileri, protokol arabellekleri olarak kodlanır ve Swift Protobuf aracılığıyla doğrudan kodlanır/kodları çözülür.
CheckpointIndexReader
ve CheckpointIndexWriter
sınıfları, bu dizin dosyalarının yüklenmesini ve kaydedilmesini, kapsamlı CheckpointReader
ve CheckpointWriter
sınıflarının bir parçası olarak yönetir. İkincisi, tensör verilerini içeren yapısal olarak daha basit ikili parçalara neyin okunacağını ve bunlara ne yazılacağını belirlemek için indeks dosyalarını temel olarak kullanır.