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:
- katmanları kullanarak bir model oluşturduğunuz Katmanlar API'sini kullanarak.
- 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, buradaB
herhangi bir toplu iş boyutunda olabilir, modeli oluştururkeninputShape
[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.