Saya mencoba memahami peran Flatten
fungsi 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 y
memiliki bentuk (1, 4). Namun, jika saya menghapus Flatten
garis, maka akan muncul cetakan yang y
berbentuk (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?
sumber
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!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 menerapkanFlatten
lapisan segera di awal memberi saya apa yang saya inginkan?Flatten
mungkin membantu untuk memahami.Ini adalah cara kerja Flatten mengubah Matriks menjadi array tunggal.
sumber
bacaan singkat:
membaca panjang:
Jika kita mengambil model asli (dengan lapisan Flatten) yang dibuat dengan pertimbangan kita bisa mendapatkan ringkasan model berikut:
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 .
Catatan: Saya menggunakan
model.summary()
metode untuk memberikan bentuk output dan detail parameter.sumber
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.
sumber
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).
sumber