.. _sec_deferred_init:
Ertelenmiş İlkleme
==================
Şimdiye kadar, ağlarımızı kurarken özensiz davranışlarımızdan yakayı
kurtarmış görünebiliriz. Özellikle, çalışmaması gerektiği düşündüğümüz,
aşağıdaki sezgisel olmayan şeyleri yaptık:
- Ağ mimarilerini girdi boyutlarını belirlemeden tanımladık.
- Bir önceki katmanın çıktı boyutunu belirtmeden katmanlar ekledik.
- Hatta modellerimizin kaç parametre içermesi gerektiğini belirlemek
için yeterli bilgi sağlamadan önce bu parametreleri "ilklettik".
Kodumuzun çalışmasına şaşırabilirsiniz. Sonuçta, derin öğrenme
çerçevesinin bir ağın girdi boyutluluğunun ne olacağını söylemesi mümkün
değildir. Buradaki püf nokta, çerçevenin *ilklemeyi ertelemesidir*,
verileri modelden ilk kez geçirene kadar bekleyerek koşma anında her
katmanın boyutunu çıkarır.
Daha sonra, evrişimli sinir ağları ile çalışırken, bu teknik daha da
uygun hale gelecektir, çünkü girdi boyutluluğu (yani, bir imgenin
çözünürlüğü) sonraki her katmanın boyutluluğunu etkileyecektir. Bu
nedenle, kodun yazılması sırasında boyutluluğun ne olduğunu bilmeye
gerek kalmadan parametreleri ayarlama becerisi, modellerimizi belirleme
ve daha sonra değiştirme görevini büyük ölçüde basitleştirebilir.
Ardından, ilkleme mekaniğinin daha derinine ineceğiz.
Bir Ağ Örneği Yaratma
---------------------
Bir MLP örneği yaratarak başlayalım.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
from mxnet import np, npx
from mxnet.gluon import nn
npx.set_np()
def get_net():
net = nn.Sequential()
net.add(nn.Dense(256, activation='relu'))
net.add(nn.Dense(10))
return net
net = get_net()
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
import tensorflow as tf
net = tf.keras.models.Sequential([
tf.keras.layers.Dense(256, activation=tf.nn.relu),
tf.keras.layers.Dense(10),
])
.. raw:: html
.. raw:: html
Bu noktada, ağ muhtemelen girdi katmanının ağırlıklarının boyutlarını
bilemez çünkü girdi boyutu bilinmemektedir. Sonuç olarak, çerçeve henüz
herhangi bir parametreyi ilklemedi. Aşağıdaki parametrelere erişmeyi
deneyerek bunu test ediyoruz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
print(net.collect_params)
print(net.collect_params())
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
256, Activation(relu))
(1): Dense(-1 -> 10, linear)
)>
sequential0_ (
Parameter dense0_weight (shape=(256, -1), dtype=float32)
Parameter dense0_bias (shape=(256,), dtype=float32)
Parameter dense1_weight (shape=(10, -1), dtype=float32)
Parameter dense1_bias (shape=(10,), dtype=float32)
)
Parametre nesneleri varken, her katmanın girdi boyutunun -1 olarak
listelendiğini unutmayın. MXNet, parametre boyutunun bilinmediğini
belirtmek için -1 özel değerini kullanır. Bu noktada,
``net[0].weight.data()`` erişim girişimleri, parametrelere erişilmeden
önce ağın ilkletilmesi gerektiğini belirten bir çalışma zamanı hatasını
tetikleyecektir. Şimdi parametreleri ``initialize`` işlevi ile ilklemeye
çalıştığımızda ne olacağını görelim.
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
net.initialize()
net.collect_params()
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
sequential0_ (
Parameter dense0_weight (shape=(256, -1), dtype=float32)
Parameter dense0_bias (shape=(256,), dtype=float32)
Parameter dense1_weight (shape=(10, -1), dtype=float32)
Parameter dense1_bias (shape=(10,), dtype=float32)
)
Gördüğümüz gibi hiçbir şey değişmedi. Girdi boyutları bilinmediğinde,
ilkleme çağrıları parametreleri gerçekten ilkletmez. Bunun yerine, bu
çağrı, parametreleri ilklemek istediğimizi (ve isteğe bağlı olarak,
hangi dağılım olduğuna göre) MXNet'e kaydeder.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
[net.layers[i].get_weights() for i in range(len(net.layers))]
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
[[], []]
Her katman nesnesinin var olduğunu ancak ağırlıkların boş (atanmamış)
olduğunu unutmayın. ``net.get_weights()``'ın kullanılması, ağırlıklar
henüz ilkletilmediği için bir hata oluşturacaktır.
.. raw:: html
.. raw:: html
Sonrasında çerçevenin en sonunda parametreleri ilklemesi için ağ
üzerinden veriyi geçirelim.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
X = np.random.uniform(size=(2, 20))
net(X)
net.collect_params()
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
sequential0_ (
Parameter dense0_weight (shape=(256, 20), dtype=float32)
Parameter dense0_bias (shape=(256,), dtype=float32)
Parameter dense1_weight (shape=(10, 256), dtype=float32)
Parameter dense1_bias (shape=(10,), dtype=float32)
)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
X = tf.random.uniform((2, 20))
net(X)
[w.shape for w in net.get_weights()]
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
[(20, 256), (256,), (256, 10), (10,)]
.. raw:: html
.. raw:: html
Girdi boyutluluğunu, 20'yi, öğrenir öğrenmez, 20 değerini yerine
koyarak, çerçeve ilk katmanın ağırlık matrisinin şeklini belirleyebilir.
İlk katman şeklini tanımladıktan sonra çerçeve boyutsallığı ikinci
katmana ilerletir, ta ki tüm şekiller bilinene kadar hesaplama çizgesi
üzerinden devam eder. Bu durumda, yalnızca ilk katmanın ertelenmiş
ilkleme gerektirdiğini, ancak çerçevenin sırayla ilklettiğini unutmayın.
Tüm parametre şekilleri bilindikten sonra, çerçeve sonunda parametreleri
ilkleyebilir.
Özet
----
- Ertelenmiş ilkleme, çerçevenin parametre şekillerini otomatik olarak
çıkarmasına izin vermede, mimarileri değiştirmeyi kolaylaştırmada ve
genel bir hata kaynağını ortadan kaldırmada kullanışlı olabilir.
- Çerçevenin en sonunda parametreleri ilklemesi sağlamak için verileri
modelden geçirebiliriz.
Alıştırmalar
------------
1. İlk katmanda girdi boyutlarını belirtirseniz, ancak sonraki
katmanlarda girmezseniz ne olur? Anında ilklemeyi elde eder misiniz?
2. Uyumsuz boyutlar belirtirseniz ne olur?
3. Boyutluluğu değişken bir girdiye sahipseniz ne yapmanız gerekir?
İpucu: Bağlı parametrelere bakınız.
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html