Keras giriş açıklaması: input_shape, unit, batch_size, dim, etc


263

Herhangi Keras tabakasının (For Layersınıfı), kutu birisi arasındaki farkı anlamak için nasıl açıklamak input_shape, units, dimvb?

Örneğin doc units, bir katmanın çıktı şeklini belirtiyor diyor .

Aşağıdaki sinir ağı görüntüsünde hidden layer14 birim vardır. Bu doğrudan nesnenin unitsniteliğine Layermi çevrilir ? Yoksa unitsKeras'ta gizli katmandaki her bir ağırlığın şekli birim sayısının katına eşit mi?

Kısacası, modelin niteliklerini - özellikle katmanları - aşağıdaki görüntü ile nasıl anlar / görselleştirir? resim açıklamasını buraya girin

Yanıtlar:


413

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_dimskaler 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, dimbir 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, Sequentialmodeller 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)

7
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üyorum input_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?
Maxim.K

17
Bu virgül ikinci bir boyut yaratmaz. tupleSadece bir öğe içeren bir python gösterimi . input_shape(728,)ile aynıdır batch_input=(batch_size,728). Bu, her örneğin 728 değerine sahip olduğu anlamına gelir.
Daniel Möller

@ DanielMöller: "Girdi elemanları" ile "boyutlar" arasındaki farkın ne olduğunu biraz ayrıntılandırabilir misiniz? Yukarıdaki grafiğin üç boyutlu bir giriş katmanı olduğunu düşünürdüm, böylece dim = 3 yapıyoruz , bu yüzden burada ne eksik olduğumu merak ediyorum, çünkü girişin 1 boyutlu olduğunu yazıyorum ...
Helen

1
Bir vektörün bir boyutu vardır, ancak birçok unsuru vardır. Şekli vardır (n,) ---- Bir matrisin iki boyutu vardır, 0 boyutu m öğeleri vardır, boyut 1 n öğeleri vardır, toplam mxn öğeleri, şekil (m, n). Küçük küplere bölünmüş bir "küp", her küçük veri küpü varsa, bu mxnxo elemanları, şekil (m, n, o) ile 3D olacaktır.
Daniel Möller

2
@Prince, sipariş önemlidir. Sen Keras kullanmak için yapılandırabilirsiniz data_format = 'channels_first'ya data_format='channels_last'. Her zaman en son kanalları kullanmanızı öneririm (Keras varsayılanı). Diğer tüm katmanlarla daha uyumludur.
Daniel Möller

11

Netleştirilen Giriş Boyutu:

Doğrudan bir cevap değil, ancak Giriş Boyutu kelimesinin yeterince kafa karıştırıcı olabileceğini fark ettim, bu yüzden dikkatli olun:

O (yalnızca kelime boyutu) şunları ifade edebilir:

a) Zaman serisi sinyalini ışınlamak için sensör eksenlerinin # N'si veya RGB renk kanalı (3) gibi Giriş Verilerinin (veya akışının) boyutu : önerilen kelime => "InputStream Dimension"

b) Giriş Özelliklerinin (veya Giriş katmanının) toplam sayısı / uzunluğu ( MINST renkli görüntü için 28 x 28 = 784) veya FFT dönüştürülmüş Spektrum Değerlerinde 3000 veya

"Giriş Katmanı / Giriş Özelliği Boyutu"

c) Girişin boyutsallığı ( boyut #) (tipik olarak Keras LSTM'de beklendiği gibi 3D) veya (#RowofSamples, Senorların # Sayısı, Değerlerin Sayısı ..) 3 yanıttır.

"N Girdi Boyutları"

d) Bu kaydırılmamış giriş görüntü verilerindeki SPECIFIC Giriş Şekli (örneğin (30,50,50,3) veya kaydırılmamış Keras ise (30, 250, 3) :

Keras'ın input_dim öğesi, Giriş Katmanı Boyutu / Giriş Özelliği Sayısı anlamına gelir

model = Sequential()
model.add(Dense(32, input_dim=784))  #or 3 in the current posted example above
model.add(Activation('relu'))

Keras LSTM'de, toplam Zaman Adımlarını ifade eder

Terim çok kafa karıştırıcı, doğru ve biz çok kafa karıştırıcı bir dünyada yaşıyoruz !!

Machine Learning'deki zorluklardan birinin farklı diller veya lehçeler ve terminolojilerle uğraşmak olduğunu düşünüyorum (örneğin, İngilizce'nin 5-8 derece farklı sürümüne sahipseniz, farklı konuşmacılarla sohbet etmek için çok yüksek yeterliliğe ihtiyacınız var). Muhtemelen bu programlama dillerinde de aynıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.