Apa peran "Ratakan" di Keras?

109

Saya mencoba memahami peran Flattenfungsi di Keras. Di bawah ini adalah kode saya, yang merupakan jaringan dua lapis sederhana. Ini mengambil data bentuk 2 dimensi (3, 2), dan mengeluarkan data bentuk 1 dimensi (1, 4):

model = Sequential()
model.add(Dense(16, input_shape=(3, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

x = np.array([[[1, 2], [3, 4], [5, 6]]])

y = model.predict(x)

print y.shape

Ini cetakan yang ymemiliki bentuk (1, 4). Namun, jika saya menghapus Flattengaris, maka akan muncul cetakan yang yberbentuk (1, 3, 4).

Saya tidak mengerti ini. Dari pemahaman saya tentang jaringan saraf, model.add(Dense(16, input_shape=(3, 2)))fungsinya membuat lapisan yang sepenuhnya terhubung sepenuhnya tersembunyi, dengan 16 node. Masing-masing node ini terhubung ke masing-masing elemen masukan 3x2. Oleh karena itu, 16 node pada keluaran lapisan pertama ini sudah "datar". Jadi, bentuk keluaran dari lapisan pertama harus (1, 16). Kemudian, lapisan kedua mengambil ini sebagai masukan, dan keluaran data bentuk (1, 4).

Jadi jika output dari lapisan pertama sudah "datar" dan berbentuk (1, 16), mengapa saya perlu meratakannya lebih lanjut?

Karnivaurus
sumber

Jawaban:

123

Jika Anda membaca entri dokumentasi Keras untuk Dense, Anda akan melihat bahwa panggilan ini:

Dense(16, input_shape=(5,3))

akan menghasilkan Densejaringan dengan 3 masukan dan 16 keluaran yang akan diterapkan secara independen untuk masing-masing dari 5 langkah. Jadi, jika D(x)mengubah vektor 3 dimensi menjadi vektor 16-d, yang akan Anda dapatkan sebagai output dari lapisan Anda adalah rangkaian vektor: [D(x[0,:]), D(x[1,:]),..., D(x[4,:])]dengan bentuk (5, 16). Untuk mendapatkan perilaku yang Anda tentukan, pertama Flatten- tama Anda dapat memasukkan input ke vektor 15-d dan kemudian menerapkan Dense:

model = Sequential()
model.add(Flatten(input_shape=(3, 2)))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

EDIT: Karena beberapa orang berjuang untuk memahami - di sini Anda memiliki gambar penjelasan:

masukkan deskripsi gambar di sini

Marcin Możejko
sumber
Terima kasih atas penjelasan Anda. Hanya untuk memperjelas: dengan Dense(16, input_shape=(5,3), akankah setiap output neuron dari set 16 (dan, untuk semua 5 set neuron ini), dihubungkan ke semua (3 x 5 = 15) neuron input? Atau akankah setiap neuron pada set pertama 16 hanya terhubung ke 3 neuron pada set pertama yang terdiri dari 5 neuron input, dan kemudian setiap neuron pada set kedua 16 hanya terhubung ke 3 neuron pada set kedua dari 5 input neuron, dll .... Saya bingung yang mana!
Karnivaurus
1
Anda memiliki satu lapisan Dense yang mendapat 3 neuron dan keluaran 16 yang diterapkan ke masing-masing dari 5 set 3 neuron.
Marcin Możejko
1
Ah ok. Apa yang saya coba lakukan adalah mengambil daftar 5 piksel warna sebagai masukan, dan saya ingin mereka melewati lapisan yang sepenuhnya terhubung. Jadi input_shape=(5,3)artinya ada 5 piksel, dan tiap piksel punya tiga kanal (R, G, B). Tetapi menurut apa yang Anda katakan, setiap saluran akan diproses secara individual, sedangkan saya ingin ketiga saluran diproses oleh semua neuron di lapisan pertama. Jadi, apakah menerapkan Flattenlapisan segera di awal memberi saya apa yang saya inginkan?
Karnivaurus
8
Sedikit gambar dengan dan tanpa Flattenmungkin membantu untuk memahami.
Xvolks
2
Ok, Guys - Saya memberikan Anda gambar. Sekarang Anda dapat menghapus suara negatif Anda.
Marcin Możejko
52

masukkan deskripsi gambar di sini Ini adalah cara kerja Flatten mengubah Matriks menjadi array tunggal.

Mahesh Kembhavi
sumber
4
Orang ini perlu membuat lebih banyak gambar. Saya suka ini. Masuk akal.
alofgran
10
Ya, tapi mengapa itu diperlukan, inilah pertanyaan sebenarnya yang saya pikir.
Helen - down dengan PCorrectness
35

bacaan singkat:

Meratakan tensor berarti menghilangkan semua dimensi kecuali satu. Inilah tepatnya yang dilakukan lapisan Flatten.

membaca panjang:

Jika kita mengambil model asli (dengan lapisan Flatten) yang dibuat dengan pertimbangan kita bisa mendapatkan ringkasan model berikut:

Layer (type)                 Output Shape              Param #   
=================================================================
D16 (Dense)                  (None, 3, 16)             48        
_________________________________________________________________
A (Activation)               (None, 3, 16)             0         
_________________________________________________________________
F (Flatten)                  (None, 48)                0         
_________________________________________________________________
D4 (Dense)                   (None, 4)                 196       
=================================================================
Total params: 244
Trainable params: 244
Non-trainable params: 0

Untuk ringkasan ini, gambar berikutnya diharapkan memberikan sedikit pengertian tentang ukuran input dan output untuk setiap lapisan.

Bentuk keluaran untuk lapisan Flatten seperti yang dapat Anda baca adalah (None, 48). Ini tipnya. Anda harus membacanya (1, 48)atau (2, 48)atau ... atau (16, 48)... atau (32, 48), ...

Faktanya, None pada posisi itu berarti ukuran batch apa saja. Agar masukan diingat, dimensi pertama berarti ukuran tumpukan dan yang kedua berarti jumlah fitur masukan.

Peran lapisan Ratakan di Keras sangat sederhana:

Operasi perataan pada tensor membentuk ulang tensor menjadi bentuk yang sama dengan jumlah elemen yang terdapat dalam tensor bukan termasuk dimensi tumpukan .

masukkan deskripsi gambar di sini


Catatan: Saya menggunakan model.summary()metode untuk memberikan bentuk output dan detail parameter.

prosti
sumber
1
Diagram yang sangat berwawasan.
Shrey Joshi
1
Terima kasih untuk diagramnya. Ini memberi saya gambaran yang jelas.
Sultan Ahmed Sagor
0

Ratakan memperjelas cara Anda membuat serialisasi tensor multidimensi (biasanya input). Ini memungkinkan pemetaan antara tensor masukan (rata) dan lapisan tersembunyi pertama. Jika hidden layer pertama adalah "padat", setiap elemen tensor input (serial) akan dihubungkan dengan setiap elemen dari hidden array. Jika Anda tidak menggunakan Flatten, cara tensor masukan dipetakan ke lapisan tersembunyi pertama akan menjadi ambigu.

roberto
sumber
0

Saya menemukan ini baru-baru ini, itu pasti membantu saya memahami: https://www.cs.ryerson.ca/~aharley/vis/conv/

Jadi ada sebuah input, sebuah Conv2D, MaxPooling2D dll, layer Flatten ada di akhir dan menunjukkan dengan tepat bagaimana mereka dibentuk dan bagaimana mereka selanjutnya mendefinisikan klasifikasi akhir (0-9).

AEngineer
sumber