खोज…


परिचय

2D कन्वेंशन की गणना इसी तरह से की जाती है कि कोई 1D कन्वेंशन की गणना करेगा: आप इनपुट पर अपने कर्नेल को स्लाइड करते हैं, तत्व-वार गुणन की गणना करते हैं और उन्हें योग करते हैं। लेकिन आपके कर्नेल / इनपुट के बजाय एक सरणी होने के नाते, यहां वे मैट्रिसेस हैं।

कोई पैडिंग, स्ट्राइड = 1 नहीं

सबसे आसान गणना के साथ यह सबसे बुनियादी उदाहरण है। मान लें कि आपका input और kernel हैं: यहाँ छवि विवरण दर्ज करें

जब आप अपना कर्नेल करेंगे तो आपको निम्न आउटपुट प्राप्त होंगे: यहाँ छवि विवरण दर्ज करें , जिसकी गणना निम्नलिखित तरीके से की जाती है:

  • 14 = 4 * 1 + 3 * 0 + 1 * 1 + 2 * 2 + 1 * 1 + 0 * 0 + 1 * 0 + 2 * 0 + 4 * 1
  • 6 = 3 * 1 + 1 * 0 + 0 * 1 + 1 * 2 + 0 * 1 + 1 * 0 + 2 * 0 + 4 * 0 + 1 * 1
  • 6 = 2 * 1 + 1 * 0 + 0 * 1 + 1 * 2 + 2 * 1 + 4 * 0 + 3 * 0 + 1 * 0 + 0 * 1
  • 12 = 1 * 1 + 0 * 0 + 1 * 1 + 2 * 2 + 4 * 1 + 1 * 0 + 1 * 0 + 0 * 0 + 2 * 1

TF का conv2d फ़ंक्शन बैचों में संकल्पों की गणना करता है और थोड़ा अलग प्रारूप का उपयोग करता है। इनपुट के लिए यह कर्नेल के लिए [batch, in_height, in_width, in_channels] है, यह [filter_height, filter_width, in_channels, out_channels] । इसलिए हमें सही प्रारूप में डेटा प्रदान करने की आवश्यकता है:

import tensorflow as tf
k = tf.constant([
    [1, 0, 1],
    [2, 1, 0],
    [0, 0, 1]
], dtype=tf.float32, name='k')
i = tf.constant([
    [4, 3, 1, 0],
    [2, 1, 0, 1],
    [1, 2, 4, 1],
    [3, 1, 0, 2]
], dtype=tf.float32, name='i')
kernel = tf.reshape(k, [3, 3, 1, 1], name='kernel')
image  = tf.reshape(i, [1, 4, 4, 1], name='image')

बाद में दृढ़ संकल्प के साथ गणना की जाती है:

res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "VALID"))
# VALID means no padding
with tf.Session() as sess:
   print sess.run(res)

और हमारे द्वारा गणना की गई हाथ के बराबर होगी।

कुछ गद्दी, तार = १

पैडिंग केवल बताने का एक फैंसी नाम है: कुछ स्थिर के साथ अपने इनपुट मैट्रिक्स को घेरें। अधिकांश मामलों में स्थिरांक शून्य होता है और यही कारण है कि लोग इसे शून्य गद्दी कहते हैं। इसलिए यदि आप हमारे मूल इनपुट में 1 का एक पैडिंग का उपयोग करना चाहते हैं ( padding=0, strides=1 साथ पहला उदाहरण देखें), मैट्रिक्स इस तरह दिखेगा:

यहाँ छवि विवरण दर्ज करें

सजा के मूल्यों की गणना करने के लिए आप एक ही स्लाइडिंग करते हैं। ध्यान दें कि हमारे मामले में मध्य में कई मूल्यों को पुनर्गणना करने की आवश्यकता नहीं है (वे पिछले उदाहरण में समान होंगे। मैं यहां सभी गणनाओं को भी नहीं दिखाऊंगा, क्योंकि विचार सीधे-सीधे है। परिणाम है:

यहाँ छवि विवरण दर्ज करें

कहाँ पे

  • 5 = 0 * 1 + 0 * 0 + 0 * 1 + 0 * 2 + 4 * 1 + 3 * 0 + 0 * 0 + 0 * 1 + 1 * 1
  • ...
  • 6 = 4 * 1 + 1 * 0 + 0 * 1 + 0 * 2 + 2 * 1 + 0 * 0 + 0 * 0 * 0 + 0 * 0 + 1 * 1

TF2 समारोह में मनमाने ढंग से पैडिंग का समर्थन नहीं करता है, इसलिए यदि आपको कुछ ऐसे पैडिंग की आवश्यकता है जो समर्थित नहीं है, तो tf.pad () का उपयोग करें। सौभाग्य से हमारे इनपुट के लिए पैडिंग 'SAME' पैडिंग = 1 के बराबर होगा। इसलिए हमें अपने पिछले उदाहरण में लगभग कुछ भी नहीं बदलने की आवश्यकता है:

res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 1, 1, 1], "SAME"))
# 'SAME' makes sure that our output has the same size as input and 
# uses appropriate padding. In our case it is 1.
with tf.Session() as sess:
   print sess.run(res)

आप सत्यापित कर सकते हैं कि उत्तर हाथ से गणना के समान होगा।

पैडिंग और स्ट्राइड्स (सबसे सामान्य मामला)

अब हम अपने पहले से वर्णित गद्देदार उदाहरण के लिए एक तार दी गई सजा लागू करेंगे और उस गणना की गणना करेंगे जहाँ p = 1, s = 2

यहाँ छवि विवरण दर्ज करें

पहले जब हम strides = 1 उपयोग करते थे, तो हमारा स्लेज विंडो 1 पोजीशन पर आ जाता है, strides = s साथ strides = s यह s पोजीशन से आगे बढ़ता है (आपको s^2 एलिमेंट्स को कम करने की आवश्यकता है। लेकिन हमारे मामले में हम एक शॉर्टकट ले सकते हैं और कोई भी प्रदर्शन नहीं कर सकते हैं। सभी पर संगणना। क्योंकि हमने पहले से ही s = 1 के मूल्यों की गणना की है, हमारे मामले में हम प्रत्येक दूसरे तत्व को पकड़ सकते हैं।

तो अगर समाधान s = 1 का मामला है

यहाँ छवि विवरण दर्ज करें

s = 2 मामले में यह होगा:

यहाँ छवि विवरण दर्ज करें

पिछले मैट्रिक्स में मान 14, 2, 12, 6 के पदों की जाँच करें। हमारे कोड में प्रदर्शन करने के लिए एकमात्र परिवर्तन चौड़ाई और ऊंचाई आयाम (2-nd, 3-rd) के लिए 1 से 2 तक के परिवर्तन को बदलना है।

res = tf.squeeze(tf.nn.conv2d(image, kernel, [1, 2, 2, 1], "SAME"))
with tf.Session() as sess:
   print sess.run(res)

वैसे, ऐसा कुछ भी नहीं है जो हमें विभिन्न आयामों के लिए अलग-अलग तारों का उपयोग करने से रोकता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow