أنظر أيضا:
التعلم الالي. الشبكات العصبية (الجزء 1): عملية التعلم المدرك
التعلم الالي. الشبكات العصبية (الجزء 2): نمذجة OR ، XOR باستخدام TensorFlow.js
في المقالات السابقة ، تم استخدام نوع واحد فقط من طبقات الشبكة العصبية - كثيفة ، متصلة بالكامل ، عندما يكون لكل خلية عصبية في الطبقة الأصلية اتصال مع جميع الخلايا العصبية من الطبقات السابقة.
للتعامل مع صورة 24 × 24 بالأبيض والأسود ، على سبيل المثال ، سيتعين علينا تحويل تمثيل المصفوفة للصورة إلى متجه يحتوي على 24 × 24 = 576 عنصرًا. كما يمكنك أن تتخيل ، مع مثل هذا التحول ، نفقد سمة مهمة - الموضع النسبي للبكسل في الاتجاهات الرأسية والأفقية للمحاور ، وأيضًا ، على الأرجح ، في معظم الحالات ، لا يكاد يكون للبكسل الموجود في الزاوية اليسرى العليا من الصورة أي تأثير منطقي يمكن تفسيره على البكسل في الزاوية اليمنى السفلى.
للقضاء على أوجه القصور هذه ، يتم استخدام الطبقات التلافيفية (CNN) لمعالجة الصور.
الغرض الرئيسي من CNN هو استخراج أجزاء صغيرة من الصورة الأصلية تحتوي على ميزات داعمة (مميزة) (ميزات) ، مثل الحواف أو الخطوط أو الأقواس أو الوجوه. في مستويات المعالجة التالية ، يمكن التعرف على أجزاء أكثر تعقيدًا قابلة للتكرار من القوام (الدوائر والأشكال المربعة وما إلى ذلك) من هذه الحواف ، والتي يمكن بعد ذلك طيها في أنسجة أكثر تعقيدًا (جزء من الوجه ، عجلة السيارة ، إلخ).
على سبيل المثال ، ضع في اعتبارك مشكلة كلاسيكية - التعرف على صورة الأرقام. كل رقم له مجموعته الخاصة من الشخصيات المميزة له (الدوائر ، الخطوط). في نفس الوقت ، يمكن أن تتكون كل دائرة أو خط من حواف أصغر (الشكل 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):
![3 – [3,3] 3 – [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 المحدد.
- المساحة المتروكة - "نفس" ، "صالحة" - تعيين حشوة صفرية ، افتراضيًا "صالح"