Lihat juga:
Pembelajaran mesin. Neural Networks (Bagian 1): Proses Pembelajaran Perceptron
Pembelajaran mesin. Jaringan Neural (Bagian 2): Pemodelan OR, XOR dengan TensorFlow.js
Dalam artikel sebelumnya, hanya satu dari jenis lapisan jaringan saraf yang digunakan - padat, terhubung sepenuhnya, ketika setiap neuron dari lapisan asli memiliki koneksi dengan semua neuron dari lapisan sebelumnya.
Untuk menangani, misalnya, gambar hitam putih 24x24, kita harus mengubah representasi matriks gambar menjadi vektor yang berisi 24x24 = 576 elemen. Seperti yang dapat Anda bayangkan, dengan transformasi seperti itu kita kehilangan atribut penting - posisi relatif piksel dalam arah vertikal dan horizontal sumbu, dan juga, mungkin, dalam banyak kasus, piksel yang terletak di sudut kiri atas gambar hampir tidak memiliki efek yang dapat dijelaskan secara logis pada piksel di pojok kanan bawah.
Untuk menghilangkan kekurangan ini, lapisan konvolusional (CNN) digunakan untuk pemrosesan gambar.
Tujuan utama CNN adalah mengekstrak bagian-bagian kecil dari citra asli yang mengandung fitur pendukung (ciri) (features), seperti edge, contour, arc atau face. Pada tingkat pemrosesan berikutnya, fragmen tekstur berulang yang lebih kompleks (lingkaran, bentuk persegi, dll.) Dapat dikenali dari tepi ini, yang kemudian dapat dilipat menjadi tekstur yang lebih kompleks (bagian muka, roda mobil, dll.).
Misalnya, pertimbangkan masalah klasik - pengenalan gambar angka. Setiap nomor memiliki kumpulan gambar khasnya sendiri untuk mereka (lingkaran, garis). Pada saat yang sama, setiap lingkaran atau garis dapat terdiri dari tepi yang lebih kecil (Gambar 1)

1. (convolutional layer)
CNN ( ), c () , . โ CNN โ .
, 2x2 ( K) , 2x2 ( N), :
, .
, (fully-connected, dense layers):
, - , โ - , ( ).
2. , , , .

(kernel size) โ 3, 5, 7.
(kernel) [kh, kw], [nh, nw], ( 3):
![Gambar 3 - Prinsip pembentukan lapisan keluaran konvolusional dengan dimensi kernel filter [3,3] Gambar 3 - Prinsip pembentukan lapisan keluaran konvolusional dengan dimensi kernel filter [3,3]](https://habrastorage.org/getpro/habr/upload_files/ebc/66a/8ef/ebc66a8ef2e7f8268951b9d3bcaf08ba.png)
, . , . , .
, โ (padding). , . , ph pw , :
, , , :

- . , (stride). โ (stride).

, sw, sh, :
, ( โ ). (). , (CONV1) 9x9x1 ( โ - ), 2 1x1 (stride) (padding) , , . 9x9x2 2 โ (. 6). CONV2 , , 2x2, , 2, 2x2x2. (CONV2) 9x9x4, 4 โ .

, kw kh , nw x nh x nd, nd - , , kw x kh x nd ( 6, CONV2).
7 , RGB, 3x3. , (3 ), 3x3x3.

TensorFlow.js
, : tf.layers.conv2d, โ , :
- filter โ number โ
- kernelSize โ number | number[] โ , number, , โ
- strides โ number | number[] - , [1,1], .
- padding โ โsameโ, โvalidโ โ , โvalidโ
.
'same'
, , () (stride) . , - 11 , โ 5, 13/5=2.6, โ 3 ( 8).

stride=1, ( 9), , ( 8).

'valid'
, strides , 8.
TensorFlow.js
, . :
- :
- :
, , tf.browser.fromPixels. , img canvas .
<img src="./sources/itechart.png" alt="Init image" id="target-image"/>
<canvas id="output-image-01"></canvas>
<script>
const imgSource = document.getElementById('target-image');
const image = tf.browser.fromPixels(imgSource, 1);
</script>, , , 3x3, โsameโ โreluโ:
const model = tf.sequential({
layers: [
tf.layers.conv2d({
inputShape: image.shape,
filters: 1,
kernelSize: 3,
padding: 'same',
activation: 'relu'
})
]
});[NUM_SAMPLES, WIDTH, HEIGHT,CHANNEL], tf.browser.fromPixel [WIDTH, HEIGHT, CHANNEL], โ ( , ):
const input = image.reshape([1].concat(image.shape));. , setWeights Layer, :
model.getLayer(null, 0).setWeights([
tf.tensor([
1, 1, 1,
0, 0, 0,
-1, -1, -1
], [3, 3, 1, 1]),
tf.tensor([0])
]);, , 0-255, NUM_SAMPLES:
const output = model.predict(input);
const max = output.max().arraySync();
const min = output.min().arraySync();
const outputImage = output.reshape(image.shape)
.sub(min)
.div(max - min)
.mul(255)
.cast('int32');canvas, tf.browser.toPixels:
tf.browser.toPixels(outputImage, document.getElementById('output-image-01'));:

2. (pooling layer)
, ( ), , . , , (pooling layer, subsample layer), . MaxPooling .
, .
. (kernel) , (stride) 1x1, . , (. 10).

, 4x4, 2x2 (stride) , 2x2, .
, ( 11) . , , MaxPooling . (translation invariance). , , 50%. , , MaxPooling .

, .
, , โ (stride).
MaxPooling AveragePooling, , , . , MaxPooling. AveragePooling , , MaxPooling .
TensorFlow.js (pooling layer)
tf.layers.maxPooling2d tf.layers.averagePooling2d. โ , :
- poolSize - nomor | angka [] - dimensi filter, jika angka ditentukan, maka dimensi filter berbentuk persegi, jika ditentukan sebagai larik, tinggi dan lebarnya dapat berbeda
- langkah - angka | number [] adalah langkah maju, parameter opsional dan secara default memiliki dimensi yang sama dengan poolSize yang ditentukan.
- padding - 'sama', 'valid' - mengatur padding nol, secara default 'valid'