التعلم الالي. الشبكات العصبية (الجزء 3) - الشبكة التلافيفية تحت المجهر. استكشاف Tensorflow.js API

أنظر أيضا:

  1. التعلم الالي. الشبكات العصبية (الجزء 1): عملية التعلم المدرك

  2. التعلم الالي. الشبكات العصبية (الجزء 2): نمذجة OR ، XOR باستخدام TensorFlow.js

في المقالات السابقة ، تم استخدام نوع واحد فقط من طبقات الشبكة العصبية - كثيفة ، متصلة بالكامل ، عندما يكون لكل خلية عصبية في الطبقة الأصلية اتصال مع جميع الخلايا العصبية من الطبقات السابقة.

للتعامل مع صورة 24 × 24 بالأبيض والأسود ، على سبيل المثال ، سيتعين علينا تحويل تمثيل المصفوفة للصورة إلى متجه يحتوي على 24 × 24 = 576 عنصرًا. كما يمكنك أن تتخيل ، مع مثل هذا التحول ، نفقد سمة مهمة - الموضع النسبي للبكسل في الاتجاهات الرأسية والأفقية للمحاور ، وأيضًا ، على الأرجح ، في معظم الحالات ، لا يكاد يكون للبكسل الموجود في الزاوية اليسرى العليا من الصورة أي تأثير منطقي يمكن تفسيره على البكسل في الزاوية اليمنى السفلى.

للقضاء على أوجه القصور هذه ، يتم استخدام الطبقات التلافيفية (CNN) لمعالجة الصور.

الغرض الرئيسي من CNN هو استخراج أجزاء صغيرة من الصورة الأصلية تحتوي على ميزات داعمة (مميزة) (ميزات) ، مثل الحواف أو الخطوط أو الأقواس أو الوجوه. في مستويات المعالجة التالية ، يمكن التعرف على أجزاء أكثر تعقيدًا قابلة للتكرار من القوام (الدوائر والأشكال المربعة وما إلى ذلك) من هذه الحواف ، والتي يمكن بعد ذلك طيها في أنسجة أكثر تعقيدًا (جزء من الوجه ، عجلة السيارة ، إلخ).

على سبيل المثال ، ضع في اعتبارك مشكلة كلاسيكية - التعرف على صورة الأرقام. كل رقم له مجموعته الخاصة من الشخصيات المميزة له (الدوائر ، الخطوط). في نفس الوقت ، يمكن أن تتكون كل دائرة أو خط من حواف أصغر (الشكل 1)

الشكل 1 - مبدأ تشغيل الطبقات التلافيفية المتصلة بالتتابع ، مع تخصيص السمات المميزة لكل مستوى من المستويات.  تستخلص كل طبقة من الطبقات التالية من مجموعة طبقات CNN المتسلسلة ديزي أنماطًا أكثر تعقيدًا بناءً على تلك المحددة مسبقًا.
1 – , . CNN , .

1. (convolutional layer)

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

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

\ يسار [\ يبدأ {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. , , , .

الشكل 2 - الحساب داخل الطبقات التلافيفية
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
 3 –          [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, – , :

- filternumber

- 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 [\ start {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).

الشكل 10 - التحول في طبقة العينة الفرعية
10 –

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

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

الشكل 11 - تنعيم الإزاحة المكانية بعد طبقة MaxPooling
11 – MaxPooling

, .

, , – (stride).

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

TensorFlow.js (pooling layer)

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

- تجمع الحجم - الرقم | رقم [] - أبعاد المرشح ، إذا تم تحديد الرقم ، فسيأخذ بعد المرشح شكل مربع ، إذا تم تحديده كمصفوفة ، فقد يختلف الارتفاع والعرض

- خطوات - رقم | الرقم [] هو خطوة إلى الأمام ، ومعلمة اختيارية ولها افتراضيًا نفس أبعاد poolSize المحدد.

- المساحة المتروكة - "نفس" ، "صالحة" - تعيين حشوة صفرية ، افتراضيًا "صالح"




All Articles