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 None
karena 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_dim
sebagai 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 dim
akan 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, Sequential
model, 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)
input_shape=
parameter tetap: ke dimensi mana nilai pertama argumen merujuk? Saya melihat hal-hal sepertiinput_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?