Voir Ă©galement:
Apprentissage automatique. RĂ©seaux de neurones (partie 1): le processus d'apprentissage Perceptron
Apprentissage automatique. Réseaux de neurones (partie 2): modélisation OR, XOR avec TensorFlow.js
Dans les articles précédents, un seul des types de couches de réseau neuronal a été utilisé - dense, entiÚrement connecté, lorsque chaque neurone de la couche d'origine a une connexion avec tous les neurones des couches précédentes.
Pour gérer une image en noir et blanc 24x24, par exemple, il faudrait transformer la représentation matricielle de l'image en un vecteur contenant 24x24 = 576 éléments. Comme vous pouvez l'imaginer, avec une telle transformation, nous perdons un attribut important - la position relative des pixels dans les directions verticale et horizontale des axes, et aussi, probablement, dans la plupart des cas, le pixel situé dans le coin supérieur gauche de l'image n'a guÚre d'effet logiquement explicable sur le pixel dans le coin inférieur droit.
Pour éliminer ces inconvénients, des couches convolutives (CNN) sont utilisées pour le traitement d'image.
L'objectif principal de CNN est d'extraire de l'image d'origine de petites parties contenant des Ă©lĂ©ments (caractĂ©ristiques) de support, tels que des arĂȘtes, des contours, des arcs ou des faces. Aux niveaux de traitement suivants, des fragments de textures rĂ©pĂ©tables plus complexes (cercles, formes carrĂ©es, etc.) peuvent ĂȘtre reconnus Ă partir de ces bords, qui peuvent ensuite ĂȘtre pliĂ©s en textures encore plus complexes (partie du visage, roue de voiture, etc.).
Par exemple, considĂ©rons un problĂšme classique - la reconnaissance d'image des nombres. Chaque numĂ©ro a son propre ensemble de chiffres typiques pour eux (cercles, lignes). Dans le mĂȘme temps, chaque cercle ou ligne peut ĂȘtre composĂ© d'arĂȘtes plus petites (Figure 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):
, . , . , .
, â (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 - nombre | nombre [] - la dimension du filtre, si nombre est spécifié, alors la dimension du filtre prend une forme carrée, si elle est spécifiée sous forme de tableau, la hauteur et la largeur peuvent différer
- foulĂ©es - nombre | number [] est un pas en avant, un paramĂštre facultatif et a par dĂ©faut la mĂȘme dimension que poolSize spĂ©cifiĂ©.
- padding - 'same', 'valid' - mise à zéro padding, par défaut 'valid'