Apa peran "Meratakan" di Keras?

Saya mencoba untuk memahami peran Meratakan fungsi di Keras. Di bawah ini adalah kode saya, yang sederhana dua lapisan jaringan. Dibutuhkan dalam 2-dimensi data dari bentuk (3, 2), dan output 1-dimensi data dari bentuk (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 y memiliki bentuk (1, 4). Namun, jika saya menghapus Meratakan line, kemudian cetak yang y memiliki bentuk (1, 3, 4).

Saya don't memahami hal ini. Dari pemahaman saya dari jaringan saraf, model.tambahkan(Padat(16, input_shape=(3, 2))) fungsi adalah menciptakan tersembunyi sepenuhnya terhubung lapisan, dengan 16 node. Masing-masing node terhubung ke masing-masing 3x2 elemen input. Oleh karena itu, 16 node pada output dari layer pertama yang sudah "televisi". Jadi, output bentuk lapisan pertama harus (1, 16). Kemudian, kedua lapisan ini sebagai input, dan output data dari bentuk (1, 4).

Jadi jika output dari layer pertama yang sudah "televisi" dan dari bentuk (1, 16), mengapa saya perlu untuk lebih meratakan itu?

Larutan

jika anda membaca dokumentasi dari Padat di sini anda akan melihat bahwa:

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

akan mengakibatkan Padat jaringan dengan 3 input dan 16 output yang akan diterapkan secara terpisah untuk masing-masing dari 5 langkah. Jadi jika D(x) berubah 3 dimensi vektor 16-d vektor apa yang anda'll mendapatkan output dari layer anda akan menjadi urutan vektor: [D(x[0,:], D(x[1,:],..., D(x[4,:]] dengan bentuk (5, 16). Dalam rangka untuk memiliki perilaku yang anda tentukan, anda mungkin pertama Meratakan masukan anda ke 15-d vektor dan kemudian menerapkan Padat:

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 aplikasi yang menjelaskan gambar:

Komentar (13)

baca pendek:

Perataan tensor berarti untuk menghapus semua dimensi kecuali satu. Ini adalah persis apa yang Meratakan lapisan lakukan.

panjang baca:

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

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 mudah-mudahan akan memberikan sedikit lebih banyak rasa pada input dan ukuran output untuk masing-masing lapisan.

Output bentuk untuk Meratakan lapisan seperti yang dapat anda baca adalah (Tiada, 48). Berikut adalah tip. Anda harus membacanya (1, 48) atau (2, 48) ... atau (16, 48) ... atau (32, 48), ...

Pada kenyataannya, None pada posisi itu berarti setiap batch size. Untuk input ke ingat, pertama dimensi berarti ukuran batch dan yang kedua berarti jumlah input fitur.

Peran Meratakan lapisan di Keras adalah super sederhana:

Sebuah meratakan operasi pada membentuk tensor tensor memiliki bentuk yang sama dengan jumlah elemen yang terkandung dalam tensor tidak termasuk batch dimensi.


Catatan: saya menggunakan model.ringkasan() metode untuk memberikan output bentuk dan rincian parameter.

Komentar (1)

Ini adalah cara Meratakan bekerja mengkonversi Matriks untuk array tunggal.

Komentar (2)