• 0

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

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

tf.nn.max_pool(
    input, ksize, strides, padding, data_format=None, name=None
)

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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)>


"""

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


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

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن