Conv1D और Conv2D के बीच अंतर क्या है?


19

मैं केरस कनवल्शन डॉक्स से गुजर रहा था और मुझे दो प्रकार के कनवल्शन कन्यू 1 डी और कन्वर्ज़ 2 डी मिले हैं। मैंने कुछ वेब खोज की और यही मैं Conv1D और Conv2D के बारे में समझता हूं; Conv1D का उपयोग दृश्यों के लिए किया जाता है और छवियों के लिए Conv2D का उपयोग किया जाता है।

मुझे हमेशा लगा कि कन्वेन्शन नेरल नेटवर्क्स का इस्तेमाल केवल इमेज के लिए किया जाता है और इस तरह से सीएनएन की कल्पना की जाती है

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

एक छवि को एक बड़े मैट्रिक्स के रूप में माना जाता है और फिर एक फ़िल्टर इस मैट्रिक्स पर स्लाइड करेगा और डॉट उत्पाद की गणना करेगा। मेरा मानना ​​है कि कायरों का कन्वर्ज़न 2 के रूप में उल्लेख है। अगर Conv2D इस तरह से काम करता है तो Conv1D का तंत्र क्या है और हम इसके तंत्र की कल्पना कैसे कर सकते हैं?


2
इस जवाब पर एक नज़र डालें । उम्मीद है की यह मदद करेगा।
learner101

जवाबों:


4

कन्वेंशन एक गणितीय ऑपरेशन है जहां आप एक टेंसर या मैट्रिक्स या वेक्टर को एक छोटे से "संक्षेप" करते हैं। यदि आपका इनपुट मैट्रिक्स एक आयामी है तो आप आयामों के साथ उसको संक्षेप में प्रस्तुत करते हैं, और यदि किसी टेंसर के पास n आयाम हैं तो आप सभी n आयामों के साथ संक्षेप कर सकते हैं । Conv1D और Conv2D एक या दो आयामों के साथ सारांशित (हल) करते हैं।

मैं=Σजे=-10मैं+जे*wजे
मैं=[1,n-+1]

wमैं=1/n

[:123w:1/21/2w:1/21/2]=[:1+222+32]

मैंएल=Σजे1=1-1जे2=2-1जे3=4-10मैं+जे1,+जे2,एल+जे3*wजे1जे2जे3
मैं=[1,n1-1+1],=[1,n2-2+1],एल=[1,n3-3+1]


3

यह 1 डी कनवल्शन कॉस्ट सेवर है, यह उसी तरह से काम करता है, लेकिन 1 आयाम सरणी मान लें जो तत्वों के साथ गुणा करता है। यदि आप किसी पंक्ति या स्तंभों के एक मैट्रिक्स के बारे में सोचना चाहते हैं, अर्थात जब हम गुणा करते हैं तो हमें उसी आकार की एक सरणी मिलती है, लेकिन निम्न या उच्च मूल्यों की, इस प्रकार यह मूल्यों की तीव्रता को बढ़ाने या कम करने में मदद करता है।

यह छवि आपकी मदद कर सकती है, यहाँ छवि विवरण दर्ज करें

विवरण के लिए देखें, https://www.youtube.com/watch?v=qVP574skyuM


1

मैं एक Pytorch परिप्रेक्ष्य का उपयोग कर रहा हूँ, हालांकि, तर्क एक ही रहता है।

Conv1d () का उपयोग करते समय, हमें यह ध्यान रखना होगा कि हम 2-आयामी इनपुट जैसे कि एक-हॉट-एन्कोड डीएनए अनुक्रम या ब्लैक एंड व्हाइट चित्रों के साथ काम करने जा रहे हैं।

अधिक पारंपरिक Conv2d () और Conv1d () के बीच एकमात्र अंतर यह है कि बाद वाला 1-आयामी कर्नेल का उपयोग करता है जैसा कि नीचे दी गई तस्वीर में दिखाया गया है।

Conv1d () उदाहरण /programming/48859378/how-to-give-the-1d-input-to-convolutional-neural-networkcnn-using-eras/52508449 पर मिला।

यहां, आपके इनपुट डेटा की ऊंचाई "गहराई" (या in_channels) बन जाती है, और हमारी पंक्तियाँ कर्नेल आकार बन जाती हैं। उदाहरण के लिए,

import torch
import torch.nn as nn

tensor = torch.randn(1,100,4)
output = nn.Conv1d(in_channels =100,out_channels=1,kernel_size=1,stride=1)(tensor)
#output.shape == [1,1,4]

हम देख सकते हैं कि कर्नेल स्वचालित रूप से चित्र की ऊँचाई तक पहुँच जाता है (जैसे कि कन्वर्शन में) (कर्नेल की गहराई स्वचालित रूप से छवि के चैनलों को फैला देती है) और इसलिए हम सभी को देने के लिए कर्नेल का आकार स्पैन के संबंध में है। पंक्तियाँ।

हमें बस यह याद रखना है कि यदि हम 2-आयामी इनपुट मान रहे हैं, तो हमारे फ़िल्टर हमारे कॉलम बन जाते हैं और हमारी पंक्तियाँ कर्नेल आकार बन जाती हैं।


चित्र इस पिछले प्रश्न से लिया गया था: stackoverflow.com/questions/48859378/…
Erick Platero

1

मैं अंतर को विस्तार से और विस्तार से बताना चाहता हूं (कोड में टिप्पणी) और बहुत आसान तरीके से।

पहले TensorFlow में Conv2D की जांच करते हैं

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

c1 = [[0, 0, 1, 0, 2], [1, 0, 2, 0, 1], [1, 0, 2, 2, 0], [2, 0, 0, 2, 0], [2, 1, 2, 2, 0]]
c2 = [[2, 1, 2, 1, 1], [2, 1, 2, 0, 1], [0, 2, 1, 0, 1], [1, 2, 2, 2, 2], [0, 1, 2, 0, 1]]
c3 = [[2, 1, 1, 2, 0], [1, 0, 0, 1, 0], [0, 1, 0, 0, 0], [1, 0, 2, 1, 0], [2, 2, 1, 1, 1]]
data = tf.transpose(tf.constant([[c1, c2, c3]], dtype=tf.float32), (0, 2, 3, 1))
# we transfer [batch, in_channels, in_height, in_width] to [batch, in_height, in_width, in_channels]
# where batch = 1, in_channels = 3 (c1, c2, c3 or the x[:, :, 0], x[:, :, 1], x[:, :, 2] in the gif), in_height and in_width are all 5(the sizes of the blue matrices without padding) 
f2c1 = [[0, 1, -1], [0, -1, 0], [0, -1, 1]]
f2c2 = [[-1, 0, 0], [1, -1, 0], [1, -1, 0]]
f2c3 = [[-1, 1, -1], [0, -1, -1], [1, 0, 0]]
filters = tf.transpose(tf.constant([[f2c1, f2c2, f2c3]], dtype=tf.float32), (2, 3, 1, 0))
# we transfer the [out_channels, in_channels, filter_height, filter_width] to [filter_height, filter_width, in_channels, out_channels]
# out_channels is 1(in the gif it is 2 since here we only use one filter W1), in_channels is 3 because data has three channels(c1, c2, c3), filter_height and filter_width are all 3(the sizes of the filter W1)
# f2c1, f2c2, f2c3 are the w1[:, :, 0], w1[:, :, 1] and w1[:, :, 2] in the gif
output = tf.squeeze(tf.nn.conv2d(data, filters, strides=2, padding=[[0, 0], [1, 1], [1, 1], [0, 0]]))
# this is just the o[:,:,1] in the gif
# <tf.Tensor: id=93, shape=(3, 3), dtype=float32, numpy=
# array([[-8., -8., -3.],
#        [-3.,  1.,  0.],
#        [-3., -8., -5.]], dtype=float32)>

और Conv1D Conv1D का एक विशेष मामला है जैसा कि इस पैरा में Conv1D के TensorFlow doc से बताया गया है

आंतरिक रूप से, यह सेशन इनपुट टेनर्स को फिर से व्यवस्थित करता है और tf.nn.conv2d को आमंत्रित करता है। उदाहरण के लिए, यदि data_format "NC", आकार के दसवें भाग [बैच, in_width, in_channels] के साथ [बैच, 1, in_width, in_channels] पर फिर से शुरू नहीं होता है, और फ़िल्टर को [1, फ़िल्टर_ एक्सपोज़र, in_channels, के लिए पुन: आकार दिया जाता है out_channels]। फिर परिणाम को [बैच, आउट_ एक्सपोज़र, आउट_चैनल्स] (जहाँ आउट_एक्सएक्सएक्स के रूप में स्ट्राइड और पेडिंग का एक कार्य है) में वापस लाया जाता है और कॉलर को वापस कर दिया जाता है।

आइए देखें कि हम Conv1D को कन्वर्ज़न 2 की समस्या में भी कैसे स्थानांतरित कर सकते हैं। चूंकि Conv1D का उपयोग आमतौर पर एनएलपी परिदृश्यों में किया जाता है, इसलिए हम इसे एनएलपी समस्या में चित्रित कर सकते हैं।
यहाँ छवि विवरण दर्ज करें

cat = [0.7, 0.4, 0.5]
sitting = [0.2, -0.1, 0.1]
there = [-0.5, 0.4, 0.1]
dog = [0.6, 0.3, 0.5]
resting = [0.3, -0.1, 0.2]
here = [-0.5, 0.4, 0.1]
sentence = tf.constant([[cat, sitting, there, dog, resting, here]]
# sentence[:,:,0] is equivalent to x[:,:,0] or c1 in the first example and the same for sentence[:,:,1] and sentence[:,:,2]
data = tf.reshape(sentence), (1, 1, 6, 3))
# we reshape [batch, in_width, in_channels] to [batch, 1, in_width, in_channels] according to the quote above
# each dimension in the embedding is a channel(three in_channels)
f3c1 = [0.6, 0.2]
# equivalent to f2c1 in the first code snippet or w1[:,:,0] in the gif
f3c2 = [0.4, -0.1]
# equivalent to f2c2 in the first code snippet or w1[:,:,1] in the gif
f3c3 = [0.5, 0.2]
# equivalent to f2c3 in the first code snippet or w1[:,:,2] in the gif
# filters = tf.constant([[f3c1, f3c2, f3c3]])
# [out_channels, in_channels, filter_width]: [1, 3, 2]
# here we have also only one filter and also three channels in it. please compare these three with the three channels in W1 for the Conv2D in the gif
filter1D = tf.transpose(tf.constant([[f3c1, f3c2, f3c3]]), (2, 1, 0))
# shape: [2, 3, 1] for the conv1d example
filters = tf.reshape(filter1D, (1, 2, 3, 1))  # this should be expand_dim actually
# transpose [out_channels, in_channels, filter_width] to [filter_width, in_channels, out_channels]] and then reshape the result to [1, filter_width, in_channels, out_channels] as we described in the text snippet from Tensorflow doc of conv1doutput
output = tf.squeeze(tf.nn.conv2d(data, filters, strides=(1, 1, 2, 1), padding="VALID"))
# the numbers for strides are for [batch, 1, in_width, in_channels] of the data input
# <tf.Tensor: id=119, shape=(3,), dtype=float32, numpy=array([0.9       , 0.09999999, 0.12      ], dtype=float32)>

मान लें कि Conv1D (TensorFlow में भी) का उपयोग कर:

output = tf.squeeze(tf.nn.conv1d(sentence, filter1D, stride=2, padding="VALID"))
# <tf.Tensor: id=135, shape=(3,), dtype=float32, numpy=array([0.9       , 0.09999999, 0.12      ], dtype=float32)>
# here stride defaults to be for the in_width

हम देख सकते हैं कि Conv2D में 2 डी का अर्थ है कि इनपुट और फ़िल्टर में प्रत्येक चैनल 2 आयामी है (जैसा कि हम gif उदाहरण में देखते हैं) और Conv1D में 1D का अर्थ है इनपुट और फ़िल्टर में प्रत्येक चैनल 1 आयामी है (जैसा कि हम बिल्ली में देखते हैं। और कुत्ता एनएलपी उदाहरण)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.