Maschinelles Lernen. Neuronale Netze (Teil 3) - Faltungsnetzwerk unter dem Mikroskop. Erkunden der Tensorflow.js-API

Siehe auch:

  1. Maschinelles Lernen. Neuronale Netze (Teil 1): Der Perceptron-Lernprozess

  2. Maschinelles Lernen. Neuronale Netze (Teil 2): ​​Modellierung von OR, XOR mit TensorFlow.js

In frĂŒheren Artikeln wurde nur eine der Arten von neuronalen Netzwerkschichten verwendet - dicht, vollstĂ€ndig verbunden, wenn jedes Neuron der ursprĂŒnglichen Schicht eine Verbindung mit allen Neuronen aus den vorherigen Schichten hat.

Um beispielsweise ein 24x24-Schwarzweißbild zu verarbeiten, mĂŒssten wir die Matrixdarstellung des Bildes in einen Vektor umwandeln, der 24x24 = 576 Elemente enthĂ€lt. Wie Sie sich vorstellen können, verlieren wir bei einer solchen Transformation ein wichtiges Attribut - die relative Position der Pixel in vertikaler und horizontaler Richtung der Achsen, und wahrscheinlich hat in den meisten FĂ€llen auch das Pixel in der oberen linken Ecke des Bildes kaum logisch erklĂ€rbare Auswirkungen auf das Pixel in untere rechte Ecke.

Um diese MĂ€ngel zu beseitigen, werden Faltungsschichten (CNN) zur Bildverarbeitung verwendet.

Der Hauptzweck von CNN besteht darin, aus dem Originalbild kleine Teile zu extrahieren, die unterstĂŒtzende (charakteristische) Merkmale (Merkmale) wie Kanten, Konturen, Bögen oder FlĂ€chen enthalten. Auf den nĂ€chsten Verarbeitungsebenen können komplexere wiederholbare Fragmente von Texturen (Kreise, quadratische Formen usw.) an diesen Kanten erkannt werden, die dann zu noch komplexeren Texturen (Teil des Gesichts, Autorad usw.) gefaltet werden können.

Stellen Sie sich zum Beispiel ein klassisches Problem vor - die Bilderkennung von Zahlen. Jede Zahl hat ihre eigenen charakteristischen Zahlen (Kreise, Linien). Gleichzeitig kann jeder Kreis oder jede Linie aus kleineren Kanten bestehen (Abbildung 1).

Abbildung 1 - Funktionsprinzip von sequentiell verbundenen Faltungsschichten mit Zuordnung charakteristischer Merkmale auf jeder der Ebenen.  Jede der nÀchsten Schichten aus einem Satz von verketteten CNN-Schichten extrahiert komplexere Muster basierend auf den zuvor identifizierten.
1 – , . CNN , .

1. (convolutional layer)

CNN ( ), c () , .   – CNN – .

, 2x2 ( K) , 2x2 ( N), :

\ left [\ begin {matrix} n_ {11} & n_ {12} \\ n_ {21} & n_ {22} \\\ end {matrix} \ right] \ ast \ left [\ begin {matrix} k_ {11} & k_ {12} \\ k_ {21} & k_ {22} \\\ end {matrix} \ right] = n_ {11} k_ {11} + n_ {12} k_ {12} + n_ {21} k_ {21 } + n_ {22} k_ {22}

  , .

, (fully-connected, dense layers):

{sum = \ \ vec {X}} ^ T \ vec {W} = \ sum_ {i = 1} ^ {n = 4} {x_iw_i} = x_1w_1 + x_2w_2 + x_3w_3 + x_4w_4

, - , – - , ( ).

2. , , , .

Abbildung 2 - Berechnung innerhalb von Faltungsschichten
2 –

(kernel size) – 3, 5, 7.

(kernel) [kh, kw], [nh, nw], ( 3):

c_w = n_w-k_w + 1;  c_h = n_h-k_h + 1
Abbildung 3 - Das Prinzip der Bildung einer Faltungsausgangsschicht mit der Dimension des Filterkerns [3,3]
3 – [3,3]

, . , . , .

, – (padding). , . , ph pw , :

c_w = n_w + p_w-k_w + 1;  c_h = n_h + p_h-k_h + 1

, , , :

p_w=k_w-1; p_h=k_h-1
 4 –
4 –

- . , (stride). – (stride).

 5 –      (stride)
5 – (stride)

, sw, sh, :

c_w=\left \lfloor  (n_w+p_w-k_w+s_w)/s_w \right \rfloor; c_h=\left \lfloor  (n_h+p_h-k_h+s_h)/s_h \right \rfloor

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

 6 –
6 –

, kw kh , nw x nh x nd, nd - , , kw x kh x nd ( 6, CONV2).

7 , RGB, 3x3. , (3 ), 3x3x3.

 7 -    ,       RGB
7 - , RGB

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).

 8 –   ‘valid’  ‘same’      kernelSize=6  strides=5.
8 – ‘valid’ ‘same’ kernelSize=6 strides=5.

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

 9 –   ‘valid’  ‘same’      kernelSize=3  strides=1
9 – ‘valid’ ‘same’ kernelSize=3 strides=1

'valid'

, strides , 8.

TensorFlow.js

, . :

- :

\left[\begin{matrix}1&0&-1\\1&0&-1\\1&0&-1\\\end{matrix}\right]

- :

\ left [\ begin {matrix} 1 & 1 & 1 \\ 0 & 0 & 0 \\ - 1 & -1 & -1 \\\ end {matrix} \ right]

, , 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).

Abbildung 10 - Transformation in der Unterprobenschicht
10 –

, 4x4, 2x2 (stride) , 2x2, .

, ( 11) . , , MaxPooling . (translation invariance). , , 50%. , , MaxPooling .

Abbildung 11 - GlÀtten rÀumlicher Verschiebungen nach der MaxPooling-Ebene
11 – MaxPooling

, .

, , – (stride).

MaxPooling AveragePooling, , , . , MaxPooling. AveragePooling , , MaxPooling .

TensorFlow.js (pooling layer)

tf.layers.maxPooling2d tf.layers.averagePooling2d. – , :

- poolSize - number | number [] - Die Dimension des Filters. Wenn number angegeben ist, nimmt die Dimension des Filters eine quadratische Form an. Wenn sie als Array angegeben wird, können Höhe und Breite unterschiedlich sein

- Schritte - Nummer | number [] ist ein VorwĂ€rtsschritt, ein optionaler Parameter und hat standardmĂ€ĂŸig dieselbe Dimension wie die angegebene poolSize.

- padding - 'same', 'valid' - Einstellung von null padding, standardmĂ€ĂŸig 'valid'




All Articles