اذهب إلى المحتوى
  • 0

الفرق بين 'SAME' و  'VALID' في الطبقة tf.nn.max_pool في تنسرفلو tensorflow؟

عامر ابراهيم

السؤال

Recommended Posts

  • 1

الحشو padding   هو الآلية التي ستتبعها الخوارزمية أثناء عملية ال convolution (الالتفاف) على المصفوفة للتعامل مع حدود المصفوفة. ففي حالة قمت بضبطها على Valid فهذا يعني أن الخوارزمية قد تتجاهل حدود المصفوفة، مثلاً إذا كان حجم الخطوة strides هو2 وأبعاد المصفوفة 3*2 سيتم تجاهل العمود الثالث من المصفوفة ولن يدخل في الخوارزمية (فقدان معلومات). لأن حجم الخطوة هو بكسلين وبالتالي لن تستطيع معالجة هذا العمود لوحده لذا تتجاهله ، وطبعاً تكون أبعاد المصفوفة الناتجة أقل دوماً. أما في حالة وضعته على SAME فستقوم الخوارزمية بإضافة عمود جديد إلى اليمين وستضبط قيمه بأصفار (حشو padding) وبالتالي ستصبح المصفوفة 4*2 وبالتالي سيتم أخذ كل الأعمدة بعين الاعتبار وفي هذه الحالة ستكون أبعاد المصفوفة الناتجة هي نفس أبعاد المصفوفة الأصلية (عندما يكون حجم الخطوة 1 ينتج نفس الأبعاد) أو أقل. المعادلة التالية تحدد الأبعاد الناتجة في حالة استخدام VALID:

output_shape = math.floor((input_shape - ksize) / strides) + 1 (when input_shape >= ksize)

أما في حالة استخدمت same فسوف يقوم بعملية الحشو. والمصفوفة الناتجة في هذه الحالة:

output_shape = math.floor((input_shape - 1) / strides) + 1

إليك بعض الأمثلة:

import tensorflow as tf
# تعريف تنسر
matrix = tf.constant([
    [0, 0, 1, 7],
    [0, 2, 0, 0],
    [5, 2, 0, 0],
    [0, 0, 9, 8],
])
#max_pool ضبط حجمها بالشكل الذي تتوقعه دالة 
reshaped = tf.reshape(matrix, (1, 4, 4, 1))
########################## SAME #########################
#على المصفوفة  max_pool تطبيق 
a1=tf.nn.max_pool(reshaped, ksize=2, strides=2, padding="SAME")
a1
"""
<tf.Tensor: shape=(1, 2, 2, 1), dtype=int32, numpy=
array([[[[2],
         [7]],

        [[5],
         [9]]]], dtype=int32)>
"""
a1.shape
# TensorShape([1, 2, 2, 1])
########################## VAILD #########################
matrix = tf.constant([
    [0, 0, 1, 7],
    [0, 2, 0, 0],
    [5, 2, 0, 0],
    [0, 0, 9, 8],
])
matrix = tf.constant([
    [0, 0, 1, 7],
    [0, 2, 0, 0],
    [5, 2, 0, 0],
    [0, 0, 9, 8],
])
reshaped = tf.reshape(matrix, (1, 4, 4, 1))
#على المصفوفة  max_pool تطبيق 
a2=tf.nn.max_pool(reshaped, ksize=2, strides=2, padding="VALID")
a2
"""
<tf.Tensor: shape=(1, 2, 2, 1), dtype=int32, numpy=
array([[[[2],
         [7]],

        [[5],
         [9]]]], dtype=int32)>
"""
a2.shape
# TensorShape([1, 2, 2, 1])

مثال آخر، هنا ستبقى المصفوفة بنفس الأبعاد عند استخدام SAME:

########################## SAME #########################
#على المصفوفة  max_pool تطبيق 
a1=tf.nn.max_pool(reshaped, ksize=2, strides=1, padding="SAME")
a1
"""
<tf.Tensor: shape=(1, 4, 4, 1), dtype=int32, numpy=
array([[[[2],
         [2],
         [7],
         [7]],

        [[5],
         [2],
         [0],
         [0]],

        [[5],
         [9],
         [9],
         [8]],

        [[0],
         [9],
         [9],
         [8]]]], dtype=int32)>
"""
import tensorflow as tf
# تعريف تنسر
matrix = tf.constant([
    [ 0, 1],
    [ 2, 0]
])
#max_pool ضبط حجمها بالشكل الذي تتوقعه دالة 
reshaped = tf.reshape(matrix, (1, 2, 2, 1))
########################## SAME #########################
import tensorflow as tf
# تعريف تنسر
matrix = tf.constant([
    [ 0, 1],
    [ 2, 0]
])
#max_pool ضبط حجمها بالشكل الذي تتوقعه دالة 
reshaped = tf.reshape(matrix, (1, 2, 2, 1))
#على المصفوفة  max_pool تطبيق 
a1=tf.nn.max_pool(reshaped, ksize=2, strides=1, padding="SAME")
a1
"""
<tf.Tensor: shape=(1, 2, 2, 1), dtype=int32, numpy=
array([[[[2],
         [1]],

        [[2],
         [0]]]], dtype=int32)>


"""

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...