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 şemalocalstorage://
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:
- Aşağıda açıklanan ağırlıklar dosyasına topoloji ve referansı taşıyan
[my-model].json
adlı bir metin JSON dosyası. -
[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
- Aşağıda açıklanan ağırlıklar dosyasına topoloji ve referansı taşıyan
model.json
adlı bir metin JSON dosyası. -
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.
- Aşağıda açıklanan ağırlıklar dosyasına topoloji ve referansı taşıyan
[model].json
adlı bir metin JSON dosyası. -
[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ğeritf.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.