আমি পার্থক্যটি দর্শনীয়ভাবে এবং বিশদে (কোডের মন্তব্যে) এবং খুব খুব সহজ পদ্ধতির মধ্যে ব্যাখ্যা করতে চাই।
প্রথমে টেনসরফ্লোতে কনভ 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 মাত্রিক (যেমন আমরা বিড়ালটিতে দেখি) এবং কুকুর এনএলপি উদাহরণ)।