Conv1D এবং Conv2D এর মধ্যে পার্থক্য কী?


19

আমি কেরাস কনভলিউশন ডক্সের মধ্য দিয়ে যাচ্ছিলাম এবং আমি দুটি ধরণের কনভলিউশন কনভ 1 ডি এবং কনভ 2 ডি পেয়েছি। আমি কিছু ওয়েব অনুসন্ধান করেছি এবং এটি আমি কনভ 1 ডি এবং কনভ 2 ডি সম্পর্কে বুঝতে পারি; কনভ 1 ডি সিক্যুয়েন্স এবং কনভ 2 ডি চিত্রগুলির জন্য ব্যবহার করা হয়।

আমি সবসময় ভাবতাম কনভোলশন স্নায়ুর নেটওয়ার্কগুলি কেবল চিত্রগুলির জন্য এবং এইভাবে সিএনএন ভিজ্যুয়ালাইজ করা হত

এখানে চিত্র বর্ণনা লিখুন

কোনও চিত্রকে বড় ম্যাট্রিক্স হিসাবে বিবেচনা করা হয় এবং তারপরে একটি ফিল্টার এই ম্যাট্রিক্সের উপরে স্লাইড হয়ে ডট পণ্যটি গণনা করবে। এটি আমি বিশ্বাস করি কেরাস কোন কনভ 2 ডি হিসাবে উল্লেখ করেছে। যদি কনভ 2 ডি এভাবে কাজ করে তবে কনভ 1 ডি এর প্রক্রিয়াটি কী এবং আমরা কীভাবে এর প্রক্রিয়াটি কল্পনা করতে পারি?


2
এই উত্তরটি একবার দেখুন । আশাকরি এটা সাহায্য করবে.
শিক্ষণকারী 101

উত্তর:


4

কনভলিউশনটি একটি গাণিতিক ক্রিয়াকলাপ যেখানে আপনি একটি টেন্সর বা ম্যাট্রিক্স বা কোনও ভেক্টরকে ছোট একটিতে সংক্ষিপ্তকরণ করেন। যদি আপনার ইনপুট ম্যাট্রিক্সটি একটি মাত্রিক হয় তবে আপনি সেই সাথে মাত্রাগুলির সাথে সংক্ষিপ্তসারটি বানাবেন এবং যদি কোনও সেন্সরটির n টি মাত্রা থাকে তবে আপনি সমস্ত n মাত্রিক বরাবর সংক্ষিপ্ত করতে পারেন । Conv1D এবং Conv2D এক বা দুটি মাত্রা বরাবর সংক্ষিপ্তকরণ (একত্রীকরণ) করুন।

উদাহরণস্বরূপ, আপনি অনুগামী হিসাবে কোনও ভেক্টরকে একটি ছোট ভেক্টরে সংহত করতে পারেন। এন উপাদানগুলির সাথে একটি "লম্বা" ভেক্টর এ পান এবং মি-এল উপাদানগুলির সাথে একটি ওজন ভেক্টর ডাব্লু ব্যবহার করে এটি এন-এম + 1 উপাদানগুলির সাথে একটি "সংক্ষিপ্ত" (সংক্ষিপ্ত) ভেক্টর বিতে : যেখানে

bi=j=m10ai+jwj
i=[1,nm+1]

সুতরাং, আপনার যদি দৈর্ঘ্য n এর ভেক্টর থাকে এবং আপনার ওজন ম্যাট্রিক্সটি দৈর্ঘ্য n তবে ইনপুট ম্যাট্রিক্সের সমস্ত মানের গড় মানের সমান 1 মাপদণ্ড বা একটি দৈর্ঘ্যের ভেক্টর তৈরি করবে। আপনি যদি চান তবে এটি এক ধরণের অবক্ষয়যুক্ত সমঝোতা। যদি একই ওজন ম্যাট্রিক্স ইনপুট ম্যাট্রিক্সের চেয়ে কম হয় তবে আপনি দৈর্ঘ্য 2 ইত্যাদির আউটপুটে একটি চলমান গড় পাবেন etc.wi=1/n

[a:a1a2a3w:1/21/2w:1/21/2]=[b:a1+a22a2+a32]

আপনি একইভাবে 3 টি মাত্রিক টেনসর (ম্যাট্রিক্স) করতে পারেন: যেখানে

bikl=j1=m11j2=m21j3=m410ai+j1,k+j2,l+j3wj1j2j3
i=[1,n1m1+1],k=[1,n2m2+1],l=[1,n3m3+1]


3

এই 1 ডি কনভ্যুলশনটি ব্যয় সাশ্রয়কারী, এটি একইভাবে কাজ করে তবে একটি 1 টি মাত্রার অ্যারে ধরে রাখুন যা উপাদানগুলির সাথে একটি গুণকে তৈরি করে। আপনি যদি সারি বা কলামগুলির একটি ম্যাট্রিক্সের কথা ভাবতে চান বা একক মাত্রা অর্থাৎ যখন আমরা একক মাত্রা পাই তখন আমরা একই আকারের একটি অ্যারে পাই তবে নিম্ন বা উচ্চতর মান পেতে পারি, সুতরাং এটি মানগুলির তীব্রতাকে সর্বাধিকতর বা হ্রাস করতে সহায়তা করে।

এই চিত্রটি আপনাকে সাহায্য করতে পারে, এখানে চিত্র বর্ণনা লিখুন

বিশদগুলির জন্য দেখুন, https://www.youtube.com/watch?v=qVP574skyuM


1

আমি পাইটরঞ্চ দৃষ্টিভঙ্গি ব্যবহার করব, তবে যুক্তিটি একই থাকবে remains

কনভ 1 ডি () ব্যবহার করার সময় আমাদের মনে রাখতে হবে যে আমরা সম্ভবত দ্বি-মাত্রিক ইনপুট যেমন ওয়ান-হট-এনকোড ডিএনএ সিকোয়েন্স বা কালো এবং সাদা ছবি সহ কাজ করতে যাচ্ছি।

আরও প্রচলিত কনভ 2 ডি () এবং কনভ 1 ডি () এর মধ্যে পার্থক্যটি হ'ল পরেরটি নীচের ছবিতে প্রদর্শিত 1-মাত্রিক কার্নেল ব্যবহার করে।

কনভ 1 ডি () উদাহরণটি /programming/48859378/how-to-give-the-1d-input-to-convolutional-neural-networkcnn-used-keras/52508449 এ পাওয়া গেছে

এখানে, আপনার ইনপুট ডেটার উচ্চতা "গভীরতা" (বা ইনচ্যানেলগুলি) হয়ে যায় এবং আমাদের সারিগুলি কার্নেলের আকারে পরিণত হয়। উদাহরণ স্বরূপ,

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 ডি তে) কার্নেলের গভীরতা স্বয়ংক্রিয়ভাবে চিত্রের চ্যানেলগুলিকে স্প্যান করে) এবং অতএব আমরা যা দিতে বাকি রেখেছি তা হল এর স্প্যানের সাথে সম্পর্কিত কার্নেল আকার সারি।

আমাদের কেবল মনে রাখতে হবে যে আমরা যদি 2-মাত্রিক ইনপুট ধরে নিই তবে আমাদের ফিল্টারগুলি আমাদের কলামে পরিণত হয় এবং আমাদের সারিগুলি কার্নেলের আকারে পরিণত হয়।


এই পূর্ববর্তী প্রশ্ন থেকে ছবিটি তোলা হয়েছিল: স্ট্যাকওভারফ্লো
এরিক প্লাটারো

1

আমি পার্থক্যটি দর্শনীয়ভাবে এবং বিশদে (কোডের মন্তব্যে) এবং খুব খুব সহজ পদ্ধতির মধ্যে ব্যাখ্যা করতে চাই।

প্রথমে টেনসরফ্লোতে কনভ 2 ডি পরীক্ষা করা যাক ।

এখানে চিত্র বর্ণনা লিখুন

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)>

কনভ 1 ডি এর টেনসরফ্লো ডক থেকে এই অনুচ্ছেদে বর্ণিত কনভ 2 ডি এর একটি বিশেষ কেস ।

অভ্যন্তরীণভাবে, এই বিকল্পটি ইনপুট টেনারগুলিকে পুনরায় আকার দেয় এবং tf.nn.conv2d ডাকে। উদাহরণস্বরূপ, যদি ডেটাফর্ম্যাটটি "এনসি" দিয়ে শুরু না হয়, তবে [ব্যাচ, ইন_উইথ, ইন_চ্যানেলস] আকৃতির একটি টেনসর [ব্যাচ, 1, ইন_উইথ, ইন_চ্যানেল] এ পুনরায় আকার দেওয়া হয় এবং ফিল্টারটি [1, ফিল্টার_উইথ, ইন_চ্যানেলগুলিতে পুনরায় আকার দেওয়া হয়, out_channels]। এরপরে ফলাফলটি পুনরায় আকারে [ব্যাচ, আউট_উইথ, আউট_চ্যানেলস] (যেখানে আউট_উইথ কনফাইডের মতো স্ট্রাইড এবং প্যাডিংয়ের ফাংশন) এবং কলারে ফিরে আসে।

আসুন দেখুন আমরা কীভাবে Conv1D কে কনভ 2 ডি সমস্যা স্থানান্তর করতে পারি। যেহেতু কনভ 1 ডি সাধারণত এনএলপি দৃশ্যে ব্যবহৃত হয় আমরা তা উদাহরণস্বরূপ বলতে পারি এন এল পি সমস্যার মধ্যে।
এখানে চিত্র বর্ণনা লিখুন

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)>

কনভ 1 ডি ব্যবহার করে এটি করা যাক (টেনসরফ্লোতেও):

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

আমরা দেখতে পারি যে কনভি 2 ডি-তে 2D অর্থ ইনপুট এবং ফিল্টারের প্রতিটি চ্যানেলটি 2 মাত্রিক (যেমন আমরা জিআইএফ উদাহরণে দেখি) এবং কনভ 1 ডি-তে 1 ডি মানে ইনপুট এবং ফিল্টারটির প্রতিটি চ্যানেল 1 মাত্রিক (যেমন আমরা বিড়ালটিতে দেখি) এবং কুকুর এনএলপি উদাহরণ)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.