Birimler:
"Nöronlar" veya "hücreler" miktarı veya katmanın içinde ne varsa.
Her katmanın bir özelliğidir ve evet, çıktı şekliyle ilgilidir (daha sonra göreceğimiz gibi). Resminizde, kavramsal olarak diğer katmanlardan farklı olan giriş katmanı dışında, aşağıdakilere sahipsiniz:
- Gizli katman 1: 4 birim (4 nöron)
- Gizli katman 2: 4 birim
- Son katman: 1 adet
Şekiller
Şekiller, model yapılandırmasının sonuçlarıdır. Şekiller, bir dizi veya tensörün her bir boyutta kaç elementi temsil ettiğini gösteren tupledir.
Örnek: bir şekil (30,4,10)
, birinci boyutta 30, ikinci olarak 4 ve üçüncü olarak 10, toplam 30 * 4 * 10 = 1200 öğe veya sayı içeren 3 boyutlu bir dizi veya tensör anlamına gelir.
Giriş şekli
Katmanlar arasında akan tansörlerdir. Tensörler şekil veren matrisler olarak görülebilir.
Keras'ta, giriş katmanının kendisi bir katman değil, bir tensördür. İlk gizli katmana gönderdiğiniz başlangıç tensörüdür. Bu tensörün egzersiz verilerinizle aynı şekle sahip olması gerekir.
Örnek: RGB'de (3 kanal) 50x50 piksellik 30 görüntünüz varsa, giriş verilerinizin şekli (30,50,50,3)
. Daha sonra giriş katmanı tensörünüz bu şekle sahip olmalıdır ("keras içindeki şekiller" bölümündeki ayrıntılara bakın).
Her katman türü, belirli sayıda boyuta sahip giriş gerektirir:
Dense
katmanlar, (batch_size, input_size)
- veya
(batch_size, optional,...,optional, input_size)
- 2D evrişimli katmanlar aşağıdaki gibi girdilere ihtiyaç duyar:
- kullanıyorsanız
channels_last
:(batch_size, imageside1, imageside2, channels)
- kullanıyorsanız
channels_first
:(batch_size, channels, imageside1, imageside2)
- 1D kıvrımlar ve tekrarlayan katmanlar kullanımı
(batch_size, sequence_length, features)
Şimdi, giriş şekli tanımlamanız gereken tek şekildir, çünkü modeliniz bunu bilemez. Eğitim verilerinize göre bunu sadece siz biliyorsunuz.
Diğer tüm şekiller, her katmanın birimlerine ve özelliklerine göre otomatik olarak hesaplanır.
Şekiller ve birimler arasındaki ilişki - Çıktı şekli
Giriş şekli göz önüne alındığında, diğer tüm şekiller katman hesaplamalarının sonucudur.
Her katmanın "birimleri" çıkış şeklini (katman tarafından üretilen ve sonraki katmanın girişi olacak olan tensörün şekli) tanımlar.
Her katman türü belirli bir şekilde çalışır. Yoğun katmanlar "birimlere" dayalı çıktı şekline, kıvrımlı katmanlar "filtrelere" dayalı çıktı şekline sahiptir. Ancak her zaman bazı katman özelliklerine dayanır. (Her katmanın çıktıları için belgelere bakın)
Grafiğinizde gösterilen "Yoğun" katmanlarla ne olacağını gösterelim.
Yoğun bir katmanın çıkış şekli vardır (batch_size,units)
. Evet, katmanın özelliği olan birimler de çıktı şeklini tanımlar.
- Gizli tabaka 1: 4 adet, çıktı şekli:
(batch_size,4)
.
- Gizli tabaka 2: 4 adet, çıktı şekli:
(batch_size,4)
.
- Son katman: 1 adet, çıkış şekli:
(batch_size,1)
.
Ağırlıklar
Ağırlıklar, giriş ve çıkış şekillerine göre tamamen otomatik olarak hesaplanacaktır. Yine, her katman türü belirli bir şekilde çalışır. Ancak ağırlıklar, bazı matematiksel işlemlerle giriş şeklini çıkış şekline dönüştürebilen bir matris olacaktır.
Yoğun bir katmanda, ağırlıklar tüm girdileri çoğaltır. Bu, girdi başına bir sütun ve birim başına bir satır içeren bir matristir, ancak bu temel işler için genellikle önemli değildir.
Resimde, her ok üzerinde bir çarpma numarası varsa, tüm sayılar birlikte ağırlık matrisini oluşturur.
Keras'ta Şekiller
Daha önce, giriş şekli olan 30 resim, 50x50 piksel ve 3 kanal örneği verdim (30,50,50,3)
.
Giriş şekli tanımlamanız gereken tek şey olduğundan, Keras ilk katmanda talep edecektir.
Ancak bu tanımda, Keras, toplu boyut olan ilk boyutu yok sayar. Modeliniz herhangi bir parti boyutu ile başa çıkabilmelidir, böylece sadece diğer boyutları tanımlayabilirsiniz:
input_shape = (50,50,3)
#regardless of how many images I have, each image has this shape
İsteğe bağlı olarak veya belirli model türleri için gerekli olduğunda, toplu iş boyutunu içeren şekli batch_input_shape=(30,50,50,3)
veya aracılığıyla iletebilirsiniz batch_shape=(30,50,50,3)
. Bu, egzersiz olanaklarınızı bu benzersiz parti boyutuyla sınırlar, bu nedenle yalnızca gerçekten gerekli olduğunda kullanılmalıdır.
Her iki şekilde de seçerseniz, modeldeki tensörlerin toplu boyutu olacaktır.
Yani, kullansanız bile input_shape=(50,50,3)
, keras size mesaj gönderdiğinde veya model özetini yazdırdığınızda, gösterilecektir (None,50,50,3)
.
İlk boyut toplu iş boyutudur, None
çünkü eğitim için kaç örnek verdiğinize bağlı olarak değişebilir. (Toplu iş boyutunu açıkça tanımladıysanız, yerine tanımladığınız sayı görünür None
)
Ayrıca, gelişmiş işlerde, doğrudan tensörler üzerinde (örneğin Lambda katmanlarının içinde veya kayıp fonksiyonunda) çalıştığınızda, parti boyutu boyutu orada olacaktır.
- Dolayısıyla, giriş şeklini tanımlarken, toplu iş boyutunu göz ardı edersiniz:
input_shape=(50,50,3)
- Doğrudan tensörlerde işlem yaparken, şekil tekrar olacaktır
(30,50,50,3)
- Keras size bir mesaj gönderdiğinde, şekil
(None,50,50,3)
veya (30,50,50,3)
size ne tür mesaj gönderdiğine bağlı olarak olur.
Dim
Ve sonunda, nedir dim
?
Giriş şeklinizin yalnızca bir boyutu varsa, bunu bir demet olarak vermeniz gerekmez, input_dim
skaler bir sayı olarak verirsiniz .
Dolayısıyla, giriş katmanınızın 3 öğeye sahip olduğu modelinizde, bu ikisinden birini kullanabilirsiniz:
input_shape=(3,)
- Virgül yalnızca bir boyutunuz olduğunda gereklidir
input_dim = 3
Ancak doğrudan tensörlerle uğraşırken, dim
bir tensörün kaç boyuta sahip olduğunu ifade eder. Örneğin, şekli olan bir tensörün (25.10909) 2 boyutu vardır.
Keras'ta görüntünüzü tanımlama
Keras'ın bunu yapmanın iki yolu vardır, Sequential
modeller veya fonksiyonel API Model
. Sıralı modeli kullanmaktan hoşlanmıyorum, daha sonra bunu unutmanız gerekecek çünkü dallı modeller isteyeceksiniz.
PS: burada aktivasyon fonksiyonları gibi diğer yönleri göz ardı ettim.
Sıralı model ile :
from keras.models import Sequential
from keras.layers import *
model = Sequential()
#start from the first hidden layer, since the input is not actually a layer
#but inform the shape of the input, with 3 elements.
model.add(Dense(units=4,input_shape=(3,))) #hidden layer 1 with input
#further layers:
model.add(Dense(units=4)) #hidden layer 2
model.add(Dense(units=1)) #output layer
İşlevsel API Modeli ile :
from keras.models import Model
from keras.layers import *
#Start defining the input tensor:
inpTensor = Input((3,))
#create the layers and pass them the input tensor to get the output tensor:
hidden1Out = Dense(units=4)(inpTensor)
hidden2Out = Dense(units=4)(hidden1Out)
finalOut = Dense(units=1)(hidden2Out)
#define the model's start and end points
model = Model(inpTensor,finalOut)
Tansörlerin şekilleri
Katmanları tanımlarken toplu boyutları yok saydığınızı unutmayın:
- inpTensor:
(None,3)
- hidden1Out:
(None,4)
- hidden2Out:
(None,4)
- finalOut:
(None,1)
input_shape=
Parametre hakkında bir soru kalıyor: argümanın ilk değeri hangi boyuta başvuruyor? Ben böyle şeyler görüyoruminput_shape=(728, )
, bu yüzden aklımda ilk argüman sütunları (sabit) ve ikinci satırları (değişmekte serbest) ifade eder. Peki bu Python'un sıra sıra dizilerine nasıl uyuyor?