Modelleri kaydedin ve yükleyin

TensorFlow.js, Layers API ile oluşturulan veya mevcut TensorFlow modellerinden dönüştürülen modellerin kaydedilmesi ve yüklenmesine yönelik işlevsellik sağlar. Bunlar sizin yetiştirdiğiniz modeller olabileceği gibi başkaları tarafından eğitilen modeller de olabilir. Layers api'yi kullanmanın önemli bir yararı, onunla oluşturulan modellerin serileştirilebilir olmasıdır ve bu eğitimde bunu keşfedeceğiz.

Bu eğitim, TensorFlow.js modellerinin (JSON dosyalarıyla tanımlanabilir) kaydedilmesine ve yüklenmesine odaklanacaktır. TensorFlow Python modellerini de içe aktarabiliriz. Bu modellerin yüklenmesi aşağıdaki iki eğitimde ele alınmaktadır:

Bir tf.Model kaydedin

tf.Model ve tf.Sequential her ikisi de bir modelin topolojisini ve ağırlıklarını kaydetmenize olanak tanıyan bir model.save işlevi sağlar.

  • Topoloji: Bu, bir modelin mimarisini (yani hangi işlemleri kullandığını) açıklayan bir dosyadır. Modellerin harici olarak saklanan ağırlıklarına referanslar içerir.

  • Ağırlıklar: Bunlar, belirli bir modelin ağırlıklarını verimli bir formatta saklayan ikili dosyalardır. Genellikle topolojiyle aynı klasörde saklanırlar.

Bir modeli kaydetme kodunun nasıl göründüğüne bir göz atalım

const saveResult = await model.save('localstorage://my-model-1');

Dikkat edilmesi gereken birkaç nokta:

  • save yöntemi, bir şema ile başlayan URL benzeri bir dize bağımsız değişkeni alır. Bu, bir modeli kaydetmeye çalıştığımız hedefin türünü açıklar. Yukarıdaki örnekte şema localstorage:// dir.
  • Şemayı bir yol takip ediyor. Yukarıdaki örnekte yol my-model-1 .
  • save yöntemi eşzamansızdır.
  • model.save dönüş değeri, modelin topolojisinin bayt boyutları ve ağırlıkları gibi bilgileri taşıyan bir JSON nesnesidir.
  • Modeli kaydetmek için kullanılan ortam, modeli hangi ortamların yükleyebileceğini etkilemez. Bir modeli node.js'ye kaydetmek, onun tarayıcıya yüklenmesini engellemez.

Aşağıda mevcut farklı şemaları inceleyeceğiz.

Yerel Depolama (Yalnızca Tarayıcı)

Şema: localstorage://

await model.save('localstorage://my-model');

Bu, bir modeli tarayıcının yerel deposuna my-model adı altında kaydeder. Bu durum yenilemeler arasında da devam edecek, ancak alan sorun teşkil ederse yerel depolama kullanıcılar veya tarayıcının kendisi tarafından temizlenebilecek. Her tarayıcı, belirli bir etki alanı için yerel depolama alanında ne kadar verinin depolanabileceğine ilişkin kendi sınırını da belirler.

IndexedDB (Yalnızca Tarayıcı)

Şema: indexeddb://

await model.save('indexeddb://my-model');

Bu, bir modeli tarayıcının IndexedDB depolama alanına kaydeder. Yerel depolama gibi yenilemeler arasında varlığını sürdürür ve aynı zamanda depolanan nesnelerin boyutu konusunda daha büyük sınırlara sahip olma eğilimindedir.

Dosya İndirmeleri (Yalnızca Tarayıcı)

Şema: downloads://

await model.save('downloads://my-model');

Bu, tarayıcının model dosyalarını kullanıcının makinesine indirmesine neden olacaktır. İki dosya oluşturulacak:

  1. Aşağıda açıklanan ağırlıklar dosyasına topoloji ve referansı taşıyan [my-model].json adlı bir metin JSON dosyası.
  2. [my-model].weights.bin adlı ağırlık değerlerini taşıyan ikili dosya.

Dosyaları farklı bir adla almak için [my-model] adını değiştirebilirsiniz.

.json dosyası göreceli bir yol kullanarak .bin dosyasına işaret ettiğinden, iki dosyanın aynı klasörde olması gerekir.

HTTP(S) İsteği

Şema: http:// veya https://

await model.save('http://model-server.domain/upload')

Bu, bir modeli uzak bir sunucuya kaydetmek için bir web isteği oluşturacaktır. İsteği yerine getirebildiğinden emin olabilmeniz için uzak sunucunun kontrolü sizde olmalıdır.

Model, POST isteği aracılığıyla belirtilen HTTP sunucusuna gönderilecektir. POST'un gövdesi multipart/form-data formatındadır ve iki dosyadan oluşur

  1. Aşağıda açıklanan ağırlıklar dosyasına topoloji ve referansı taşıyan model.json adlı bir metin JSON dosyası.
  2. model.weights.bin adlı ağırlık değerlerini taşıyan ikili dosya.

İki dosyanın adının her zaman tam olarak yukarıda belirtildiği gibi olacağını unutmayın (ad, işlevin içinde yerleşiktir). Bu API belgesi, save öğesinden kaynaklanan isteği işlemek için flask web çerçevesinin nasıl kullanılabileceğini gösteren bir Python kod pasajı içerir.

Çoğunlukla HTTP sunucunuza daha fazla argüman aktarmanız veya başlık istemeniz gerekecektir (örn. kimlik doğrulama için veya modelin kaydedileceği klasörü belirtmek istiyorsanız). tf.io.browserHTTPRequest içindeki URL dizesi bağımsız değişkenini değiştirerek, save işleminden isteklerin bu yönleri üzerinde ayrıntılı kontrol elde edebilirsiniz. Bu API, HTTP isteklerinin kontrolünde daha fazla esneklik sağlar.

Örneğin:

await model.save(tf.io.browserHTTPRequest(
    'http://model-server.domain/upload',
    {method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));

Yerel Dosya Sistemi (yalnızca Node.js)

Şema: file://

await model.save('file:///path/to/my-model');

Node.js üzerinde çalışırken dosya sistemine doğrudan erişimimiz olur ve modelleri oraya kaydedebiliriz. Yukarıdaki komut, iki dosyayı scheme sonra belirtilen path kaydedecektir.

  1. Aşağıda açıklanan ağırlıklar dosyasına topoloji ve referansı taşıyan [model].json adlı bir metin JSON dosyası.
  2. [model].weights.bin adlı ağırlık değerlerini taşıyan ikili dosya.

İki dosyanın adının her zaman tam olarak yukarıda belirtildiği gibi olacağını unutmayın (ad, işlevin içinde yerleşiktir).

Bir tf.Model yükleniyor

Yukarıdaki yöntemlerden biri kullanılarak kaydedilen bir model verildiğinde, onu tf.loadLayersModel API'sini kullanarak yükleyebiliriz.

Bir model yükleme kodunun nasıl göründüğüne bir göz atalım

const model = await tf.loadLayersModel('localstorage://my-model-1');

Dikkat edilmesi gereken birkaç nokta:

  • model.save() gibi, loadLayersModel işlevi de şema ile başlayan URL benzeri bir dize argümanı alır. Bu, bir modeli yüklemeye çalıştığımız hedefin türünü açıklar.
  • Şemayı bir yol takip ediyor. Yukarıdaki örnekte yol my-model-1 .
  • URL benzeri dize, IOHandler arayüzüyle eşleşen bir nesneyle değiştirilebilir.
  • tf.loadLayersModel() işlevi eşzamansızdır.
  • tf.loadLayersModel dönüş değeri tf.Model

Aşağıda mevcut farklı şemaları inceleyeceğiz.

Yerel Depolama (Yalnızca Tarayıcı)

Şema: localstorage://

const model = await tf.loadLayersModel('localstorage://my-model');

Bu, tarayıcının yerel deposundan my-model adlı bir modeli yükler.

IndexedDB (Yalnızca Tarayıcı)

Şema: indexeddb://

const model = await tf.loadLayersModel('indexeddb://my-model');

Bu, tarayıcının IndexedDB deposundan bir model yükler.

HTTP(S)

Şema: http:// veya https://

const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');

Bu, bir modeli http uç noktasından yükler. json dosyasını yükledikten sonra işlev, json dosyasının başvurduğu karşılık gelen .bin dosyaları için istekte bulunacaktır.

Yerel Dosya Sistemi (yalnızca Node.js)

Şema: file://

const model = await tf.loadLayersModel('file://path/to/my-model/model.json');

Node.js üzerinde çalışırken dosya sistemine doğrudan erişimimiz vardır ve buradan modelleri yükleyebiliriz. Yukarıdaki işlev çağrısında model.json dosyasının kendisini referans aldığımızı unutmayın (oysa kaydederken bir klasör belirtiriz). İlgili .bin dosyası/dosyaları, json dosyasıyla aynı klasörde olmalıdır.

Modelleri IOHandlers ile yükleme

Yukarıdaki şemalar ihtiyaçlarınız için yeterli değilse, özel yükleme davranışını bir IOHandler ile uygulayabilirsiniz. TensorFlow.js'nin sağladığı bir IOHandler , tarayıcı kullanıcılarının tarayıcıya model dosyaları yüklemesine olanak tanıyan tf.io.browserFiles . Daha fazla bilgi için belgelere bakın.

Özel IOHandlers ile Modelleri Kaydetme ve Yükleme

Yukarıdaki şemalar yükleme veya kaydetme ihtiyaçlarınız için yeterli değilse, bir IOHandler uygulayarak özel serileştirme davranışını uygulayabilirsiniz.

IOHandler save ve load yöntemine sahip bir nesnedir.

save işlevi, ModelArtifacts arayüzüyle eşleşen bir parametre alır ve SaveResult nesnesine çözümlenen bir söz döndürmelidir.

load işlevi hiçbir parametre almaz ve ModelArtifacts nesnesine çözümlenen bir söz döndürmelidir. Bu, save öğesine iletilen nesnenin aynısıdır.

Bir IOHandler'ın nasıl uygulanacağına ilişkin bir örnek için TarayıcıHTTPRequest'e bakın.