Input keras penjelasan: input_shape, unit, batch_size, redup, dll

262

Untuk setiap Keras lapisan ( Layerkelas), bisa seseorang menjelaskan bagaimana memahami perbedaan antara input_shape, units, dim, dll?

Sebagai contoh, kata doc, unitstentukan bentuk output dari sebuah layer.

Pada gambar jaringan syaraf di bawah ini hidden layer1memiliki 4 unit. Apakah ini langsung diterjemahkan ke unitsatribut Layerobjek? Atau apakah unitsdalam Keras sama dengan bentuk setiap berat dalam lapisan tersembunyi dikalikan jumlah unit?

Singkatnya, bagaimana seseorang memahami / memvisualisasikan atribut model - khususnya lapisan - dengan gambar di bawah ini? masukkan deskripsi gambar di sini

orang-orangan sawah
sumber

Jawaban:

412

Unit:

Jumlah "neuron", atau "sel", atau apa pun lapisan yang ada di dalamnya.

Ini adalah properti dari setiap layer, dan ya, itu terkait dengan bentuk output (seperti yang akan kita lihat nanti). Dalam gambar Anda, kecuali untuk lapisan input, yang secara konsep berbeda dari lapisan lain, Anda memiliki:

  • Lapisan tersembunyi 1: 4 unit (4 neuron)
  • Lapisan tersembunyi 2: 4 unit
  • Lapisan terakhir: 1 unit

Bentuk

Bentuk adalah konsekuensi dari konfigurasi model. Bentuk adalah tupel yang mewakili berapa banyak elemen yang dimiliki array atau tensor di setiap dimensi.

Contoh: bentuk (30,4,10)berarti array atau tensor dengan 3 dimensi, yang mengandung 30 elemen di dimensi pertama, 4 di kedua dan 10 di ketiga, total 30 * 4 * 10 = 1200 elemen atau angka.

Bentuk input

Apa yang mengalir di antara lapisan adalah tensor. Tensor dapat dilihat sebagai matriks, dengan bentuk.

Dalam Keras, layer input itu sendiri bukan layer, tetapi tensor. Ini adalah tensor awal yang Anda kirim ke lapisan tersembunyi pertama. Tensor ini harus memiliki bentuk yang sama dengan data latihan Anda.

Contoh: jika Anda memiliki 30 gambar 50x50 piksel dalam RGB (3 saluran), bentuk data input Anda adalah (30,50,50,3). Kemudian tensor layer input Anda, harus memiliki bentuk ini (lihat detail di bagian "bentuk dalam keras").

Setiap jenis lapisan memerlukan input dengan sejumlah dimensi:

  • Dense layer membutuhkan input sebagai (batch_size, input_size)
    • atau (batch_size, optional,...,optional, input_size)
  • Lapisan konvolusional 2D memerlukan input sebagai:
    • jika menggunakan channels_last:(batch_size, imageside1, imageside2, channels)
    • jika menggunakan channels_first:(batch_size, channels, imageside1, imageside2)
  • Konvolusi 1D dan lapisan berulang digunakan (batch_size, sequence_length, features)

Sekarang, bentuk input adalah satu-satunya yang harus Anda tentukan, karena model Anda tidak dapat mengetahuinya. Hanya Anda yang tahu itu, berdasarkan data pelatihan Anda.

Semua bentuk lainnya dihitung secara otomatis berdasarkan unit dan kekhasan masing-masing lapisan.

Hubungan antara bentuk dan unit - Bentuk output

Mengingat bentuk input, semua bentuk lainnya adalah hasil perhitungan lapisan.

"Unit" dari setiap lapisan akan menentukan bentuk keluaran (bentuk tensor yang dihasilkan oleh lapisan dan yang akan menjadi input dari lapisan berikutnya).

Setiap jenis lapisan bekerja dengan cara tertentu. Lapisan padat memiliki bentuk keluaran berdasarkan "unit", lapisan konvolusional memiliki bentuk keluaran berdasarkan "filter". Tetapi selalu didasarkan pada beberapa properti layer. (Lihat dokumentasi untuk apa yang dihasilkan setiap lapisan)

Mari kita tunjukkan apa yang terjadi dengan lapisan "Padat", yang merupakan tipe yang ditunjukkan dalam grafik Anda.

Lapisan padat memiliki bentuk keluaran (batch_size,units). Jadi, ya, unit, properti layer, juga menentukan bentuk output.

  • Tersembunyi lapisan 1: 4 unit, bentuk keluaran: (batch_size,4).
  • Tersembunyi lapisan 2: 4 unit, bentuk keluaran: (batch_size,4).
  • Lapisan terakhir: 1 unit, bentuk keluaran: (batch_size,1).

Bobot

Bobot akan sepenuhnya dihitung secara otomatis berdasarkan input dan bentuk output. Sekali lagi, setiap jenis lapisan bekerja dengan cara tertentu. Tetapi bobot akan menjadi matriks yang mampu mengubah bentuk input menjadi bentuk output oleh beberapa operasi matematika.

Dalam layer yang padat, timbang semua input. Ini adalah matriks dengan satu kolom per input dan satu baris per unit, tetapi ini sering tidak penting untuk pekerjaan dasar.

Dalam gambar, jika setiap panah memiliki angka perkalian, semua angka bersama akan membentuk matriks bobot.

Bentuk dalam Keras

Sebelumnya, saya memberi contoh 30 gambar, 50x50 piksel dan 3 saluran, memiliki bentuk input (30,50,50,3).

Karena bentuk input adalah satu-satunya yang perlu Anda tentukan, Keras akan menuntutnya di lapisan pertama.

Namun dalam definisi ini, Keras mengabaikan dimensi pertama, yang merupakan ukuran bets. Model Anda harus dapat menangani ukuran bets apa pun, sehingga Anda hanya menentukan dimensi lain:

input_shape = (50,50,3)
    #regardless of how many images I have, each image has this shape        

Secara opsional, atau ketika dibutuhkan oleh jenis model tertentu, Anda dapat melewati bentuk yang berisi ukuran bets melalui batch_input_shape=(30,50,50,3)atau batch_shape=(30,50,50,3). Ini membatasi kemungkinan pelatihan Anda untuk ukuran batch yang unik ini, sehingga harus digunakan hanya ketika benar-benar diperlukan.

Apa pun yang Anda pilih, tensor dalam model akan memiliki dimensi bets.

Jadi, bahkan jika Anda menggunakan input_shape=(50,50,3), ketika keras mengirimi Anda pesan, atau ketika Anda mencetak ringkasan model, itu akan ditampilkan (None,50,50,3).

Dimensi pertama adalah ukuran kumpulan, itu Nonekarena dapat bervariasi tergantung pada berapa banyak contoh yang Anda berikan untuk pelatihan. (Jika Anda menentukan ukuran batch secara eksplisit, maka angka yang Anda tentukan akan muncul sebagai ganti None)

Juga, dalam pekerjaan lanjut, ketika Anda benar-benar beroperasi langsung pada tensor (di dalam lapisan Lambda atau dalam fungsi loss, misalnya), dimensi ukuran bets akan ada di sana.

  • Jadi, saat mendefinisikan bentuk input, Anda mengabaikan ukuran batch: input_shape=(50,50,3)
  • Ketika melakukan operasi langsung pada tensor, bentuknya akan kembali (30,50,50,3)
  • Ketika keras mengirimi Anda pesan, bentuknya akan menjadi (None,50,50,3)atau (30,50,50,3), tergantung pada jenis pesan yang dikirimkannya kepada Anda.

Redup

Dan pada akhirnya, apa itu dim?

Jika bentuk input Anda hanya memiliki satu dimensi, Anda tidak perlu memberikannya sebagai tuple, Anda berikan input_dimsebagai angka skalar.

Jadi, dalam model Anda, di mana layer input Anda memiliki 3 elemen, Anda dapat menggunakan salah satu dari dua ini:

  • input_shape=(3,) - Koma diperlukan ketika Anda hanya memiliki satu dimensi
  • input_dim = 3

Tetapi ketika berhadapan langsung dengan tensor, sering kali dimakan merujuk pada berapa dimensi yang dimiliki tensor. Misalnya tensor dengan bentuk (25.10909) memiliki 2 dimensi.


Menentukan gambar Anda dalam Keras

Keras memiliki dua cara untuk melakukannya, Sequentialmodel, atau API fungsional Model. Saya tidak suka menggunakan model sekuensial, nanti Anda harus melupakannya karena Anda ingin model dengan cabang.

PS: di sini saya mengabaikan aspek lain, seperti fungsi aktivasi.

Dengan model Sequential :

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   

Dengan Model API fungsional :

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)

Bentuk tensor

Ingat Anda mengabaikan ukuran kumpulan saat mendefinisikan lapisan:

  • inpTensor: (None,3)
  • hidden1Out: (None,4)
  • hidden2Out: (None,4)
  • final: (None,1)
Daniel Möller
sumber
7
Satu pertanyaan tentang input_shape=parameter tetap: ke dimensi mana nilai pertama argumen merujuk? Saya melihat hal-hal seperti input_shape=(728, ), jadi dalam pikiran saya argumen pertama merujuk pada kolom (tetap) dan kedua ke baris (bebas untuk bervariasi). Tetapi bagaimana hal ini duduk dengan deretan deret deret utama Python?
Maxim.K
17
Koma itu tidak membuat dimensi kedua. Ini hanya notasi python untuk membuat tupleyang hanya mengandung satu elemen. input_shape(728,)sama dengan batch_input=(batch_size,728). Ini berarti bahwa setiap sampel memiliki nilai 728.
Daniel Möller
@ DanielMöller: bisa tolong jelaskan sedikit apa perbedaan antara "elemen input" dan "dimensi"? Saya akan berpikir bahwa grafik di atas memiliki lapisan input tiga dimensi, sehingga membuat redup = 3 , jadi saya bertanya-tanya apa yang saya lewatkan di sini, karena saya melihat Anda menulis bahwa inputnya adalah 1-dimensi ...
Helen
1
Vektor memiliki satu dimensi, tetapi banyak elemen. Ini memiliki bentuk (n,) ---- Sebuah matriks memiliki dua dimensi, dimensi 0 memiliki elemen m, dimensi 1 memiliki elemen n, total elemen mxn, bentuk (m, n). Jika Anda membayangkan "kubus" dibagi dalam kubus kecil, masing-masing kubus kecil dengan data, ini akan menjadi 3D, dengan elemen mxnxo, bentuk (m, n, o).
Daniel Möller
2
@Prince, pesanan penting. Anda dapat mengkonfigurasi Keras untuk menggunakan data_format = 'channels_first'atau data_format='channels_last'. Saya sarankan menggunakan selalu saluran terakhir (Keras 'default). Ini lebih kompatibel dengan semua lapisan lainnya.
Daniel Möller
11

Dimensi Input Yang Dijelaskan:

Bukan jawaban langsung, tapi saya baru sadar kata Dimensi Input bisa cukup membingungkan, jadi berhati-hatilah:

Itu (dimensi kata saja) dapat merujuk pada:

a) Dimensi Data Input (atau aliran) seperti # N sensor sumbu untuk memancarkan sinyal deret waktu, atau saluran warna RGB (3): kata yang disarankan => "Dimensi InputStream"

b) Jumlah total / panjang Fitur Input (atau lapisan Input) (28 x 28 = 784 untuk gambar warna MINST) atau 3000 di FFT yang mengubah Nilai Spektrum, atau

"Dimensi Input / Dimensi Fitur Input"

c) Dimensi (# dimensi) dari input (biasanya 3D seperti yang diharapkan dalam Keras LSTM) atau (#RowofSamples, #of Senors, #of Values ​​..) 3 adalah jawabannya.

"N Dimensi Input"

d) Bentuk Input SPESIFIK (mis. (30,50,50,3) dalam data gambar input yang tidak dibungkus ini, atau (30, 250, 3) jika Tidak Dibungkus dengan Keras:

Keras memiliki input_dim mengacu pada Dimensi Lapisan Input / Jumlah Fitur Input

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

Dalam Keras LSTM, ini mengacu pada total Langkah Waktu

Istilahnya sangat membingungkan, benar dan kita hidup di dunia yang sangat membingungkan !!

Saya menemukan salah satu tantangan dalam Pembelajaran Mesin adalah untuk berurusan dengan berbagai bahasa atau dialek dan terminologi (seperti jika Anda memiliki 5-8 versi bahasa Inggris yang sangat berbeda, maka Anda perlu kemahiran yang sangat tinggi untuk berkomunikasi dengan pembicara yang berbeda). Mungkin ini juga sama dalam bahasa pemrograman.

r poon
sumber