Modeller ve katmanlar

Makine öğreniminde model , bir girdiyi bir çıktıyla eşleyen, öğrenilebilir parametrelere sahip bir işlevdir. Optimum parametreler, modelin veriler üzerinde eğitilmesiyle elde edilir. İyi eğitilmiş bir model, girdiden istenen çıktıya doğru bir eşleme sağlayacaktır.

TensorFlow.js'de makine öğrenimi modeli oluşturmanın iki yolu vardır:

  1. katmanları kullanarak bir model oluşturduğunuz Katmanlar API'sini kullanarak.
  2. Core API'yi tf.matMul() , tf.add() vb. gibi daha düşük seviyeli işlemlerle kullanma.

İlk olarak, model oluşturmak için daha üst düzey bir API olan Layers API'sine bakacağız. Daha sonra aynı modelin Core API kullanılarak nasıl oluşturulacağını göstereceğiz.

Layers API ile modeller oluşturma

Katmanlar API'sini kullanarak model oluşturmanın iki yolu vardır: Sıralı model ve işlevsel model. Sonraki iki bölümde her tür daha yakından inceleniyor.

Sıralı model

En yaygın model türü, katmanların doğrusal bir yığını olan Sequential modeldir. Katmanların bir listesini sequential() işlevine ileterek Sequential bir model oluşturabilirsiniz:

const model = tf.sequential({
 layers: [
   tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}),
   tf.layers.dense({units: 10, activation: 'softmax'}),
 ]
});

Veya add() yöntemi aracılığıyla:

const model = tf.sequential();
model.add(tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));

ÖNEMLİ: Modeldeki ilk katmanın bir inputShape ihtiyacı vardır. inputShape sağlarken toplu iş boyutunu hariç tuttuğunuzdan emin olun. Örneğin, [B, 784] şeklindeki model tensörlerini beslemeyi planlıyorsanız, burada B herhangi bir toplu iş boyutunda olabilir, modeli oluştururken inputShape [784] olarak belirtin.

Modelin katmanlarına model.layers ve daha spesifik olarak model.inputLayers ve model.outputLayers aracılığıyla erişebilirsiniz.

İşlevsel model

LayersModel oluşturmanın başka bir yolu da tf.model() işlevidir. tf.model() ve tf.sequential() arasındaki temel fark, tf.model() işlevinin, döngüleri olmadığı sürece rastgele bir katman grafiği oluşturmanıza olanak sağlamasıdır.

Burada tf.model() API'sini kullanarak yukarıdakiyle aynı modeli tanımlayan bir kod parçacığı verilmiştir:

// Create an arbitrary graph of layers, by connecting them
// via the apply() method.
const input = tf.input({shape: [784]});
const dense1 = tf.layers.dense({units: 32, activation: 'relu'}).apply(input);
const dense2 = tf.layers.dense({units: 10, activation: 'softmax'}).apply(dense1);
const model = tf.model({inputs: input, outputs: dense2});

Başka bir katmanın çıktısına bağlamak için her katmana apply() çağırırız. Bu durumda apply() un sonucu, Tensor gibi davranan ancak somut değerleri olmayan bir SymbolicTensor .

Sıralı modelden farklı olarak, ilk katmana inputShape sağlamak yerine tf.input() aracılığıyla bir SymbolicTensor oluşturduğumuzu unutmayın.

apply() ayrıca somut bir Tensor iletirseniz size somut bir Tensor da verebilir:

const t = tf.tensor([-2, 1, 0, 5]);
const o = tf.layers.activation({activation: 'relu'}).apply(t);
o.print(); // [0, 1, 0, 5]

Bu, katmanları ayrı ayrı test ederken ve çıktılarını görürken yararlı olabilir.

Sıralı bir modelde olduğu gibi, modelin katmanlarına model.layers ve daha spesifik olarak model.inputLayers ve model.outputLayers aracılığıyla erişebilirsiniz.

Doğrulama

Hem sıralı model hem de işlevsel model, LayersModel sınıfının örnekleridir. LayersModel ile çalışmanın en büyük faydalarından biri doğrulamadır: sizi giriş şeklini belirtmeye zorlar ve onu daha sonra girişinizi doğrulamak için kullanır. LayersModel ayrıca veriler katmanlar arasında akarken otomatik şekil çıkarımı da yapar. Şekli önceden bilmek, modelin parametrelerini otomatik olarak oluşturmasına olanak tanır ve ardışık iki katmanın birbiriyle uyumlu olup olmadığını size söyleyebilir.

Model özeti

Aşağıdakileri içeren modelin yararlı bir özetini yazdırmak için model.summary() öğesini çağırın:

  • Modeldeki tüm katmanların adı ve türü.
  • Her katman için çıktı şekli.
  • Her katmanın ağırlık parametrelerinin sayısı.
  • Modelin genel topolojisi varsa (aşağıda tartışılmıştır), her katmanın aldığı girdiler
  • Modelin eğitilebilen ve eğitilemeyen parametrelerinin toplam sayısı.

Yukarıda tanımladığımız model için konsolda aşağıdaki çıktıyı alıyoruz:

Katman (tür) Çıkış şekli Parametre #
yoğun_Dense1 (Yoğun) [boş,32] 25120
yoğun_Dense2 (Yoğun) [boş,10] 330
Toplam parametreler: 25450
Eğitilebilir parametreler: 25450
Eğitilemeyen parametreler: 0

Katmanların çıktı şekillerindeki null değerlere dikkat edin: modelin, girişin en dış boyut olarak bir toplu iş boyutuna sahip olmasını beklediğini hatırlatır; bu durumda bu, null değer nedeniyle esnek olabilir.

Serileştirme

LayersModel alt düzey API'ye göre kullanmanın en büyük avantajlarından biri, bir modeli kaydetme ve yükleme yeteneğidir. Bir LayersModel şunları bilir:

  • Modelin mimarisi, modeli yeniden oluşturmanıza olanak tanır.
  • modelin ağırlıkları
  • eğitim yapılandırması (kayıp, optimize edici, ölçümler).
  • optimize edicinin durumu, eğitime devam etmenize olanak tanır.

Bir modeli kaydetmek veya yüklemek için yalnızca 1 satır kod yeterlidir:

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

Yukarıdaki örnek, modeli tarayıcıdaki yerel depolamaya kaydeder. Farklı ortamlara (örn. dosya depolama, IndexedDB , tarayıcı indirmesini tetikleme vb.) nasıl kaydedileceğini öğrenmek için model.save() documentation ve kaydetme ve yükleme kılavuzuna bakın.

Özel katmanlar

Katmanlar bir modelin yapı taşlarıdır. Modeliniz özel bir hesaplama yapıyorsa geri kalan katmanlarla iyi etkileşim kuran özel bir katman tanımlayabilirsiniz. Aşağıda karelerin toplamını hesaplayan özel bir katman tanımlıyoruz:

class SquaredSumLayer extends tf.layers.Layer {
 constructor() {
   super({});
 }
 // In this case, the output is a scalar.
 computeOutputShape(inputShape) { return []; }

 // call() is where we do the computation.
 call(input, kwargs) { return input.square().sum();}

 // Every layer needs a unique name.
 getClassName() { return 'SquaredSum'; }
}

Bunu test etmek için, apply() yöntemini somut bir tensörle çağırabiliriz:

const t = tf.tensor([-2, 1, 0, 5]);
const o = new SquaredSumLayer().apply(t);
o.print(); // prints 30

ÖNEMLİ: Özel bir katman eklerseniz modeli serileştirme yeteneğinizi kaybedersiniz.

Core API ile modeller oluşturma

Bu kılavuzun başında TensorFlow.js'de makine öğrenimi modeli oluşturmanın iki yolu olduğundan bahsetmiştik.

Genel kural, her zaman ilk olarak Katmanlar API'sini kullanmaya çalışmaktır; çünkü bu API , en iyi uygulamaları takip eden ve bilişsel yükü azaltan, iyi benimsenmiş Keras API'sinden sonra modellenmiştir. Layers API ayrıca ağırlık başlatma, model serileştirme, izleme eğitimi, taşınabilirlik ve güvenlik kontrolü gibi çeşitli kullanıma hazır çözümler sunar.

Core API'yi aşağıdaki durumlarda kullanmak isteyebilirsiniz:

  • Maksimum esnekliğe veya kontrole ihtiyacınız var.
  • Serileştirmeye ihtiyacınız yoktur veya kendi serileştirme mantığınızı uygulayabilirsiniz.

Core API'deki modeller yalnızca bir veya daha fazla Tensors alan ve bir Tensor döndüren işlevlerdir. Yukarıda Core API kullanılarak yazılan modelin aynısı şuna benzer:

// The weights and biases for the two dense layers.
const w1 = tf.variable(tf.randomNormal([784, 32]));
const b1 = tf.variable(tf.randomNormal([32]));
const w2 = tf.variable(tf.randomNormal([32, 10]));
const b2 = tf.variable(tf.randomNormal([10]));

function model(x) {
  return x.matMul(w1).add(b1).relu().matMul(w2).add(b2).softmax();
}

Core API'de modelin ağırlıklarını oluşturmaktan ve başlatmaktan sorumlu olduğumuzu unutmayın. Her ağırlık, TensorFlow.js'ye bu tensörlerin öğrenilebilir olduğunu bildiren bir Variable tarafından desteklenir. tf.variable() kullanarak ve mevcut bir Tensor ileterek bir Variable oluşturabilirsiniz.

Bu kılavuzda, Katmanları ve Çekirdek API'yi kullanarak model oluşturmanın farklı yollarını öğrendiniz. Daha sonra, bir modelin nasıl eğitileceğini öğrenmek için eğitim modelleri kılavuzuna bakın.