কনভোলশনাল নিউরাল নেটওয়ার্কগুলিতে 1D, 2D এবং 3 ডি কনভোলিউশনগুলির অন্তর্নিহিত বোঝা


126

উদাহরণস্বরূপ ব্যবহারের মাধ্যমে প্রত্যেকে কীভাবে কনভ্যুশনাল নিউরাল নেটওয়ার্কগুলিতে (গভীর শিক্ষার ক্ষেত্রে) 1 ডি, 2 ডি এবং 3 ডি কনভোলিউশনের মধ্যে পার্থক্যটি স্পষ্টভাবে ব্যাখ্যা করতে পারেন?

উত্তর:


415

আমি সি 3 ডি থেকে ছবি সহ ব্যাখ্যা করতে চাই ।

সংক্ষেপে, সমাবর্তন দিক এবং আউটপুট আকার গুরুত্বপূর্ণ!

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

↑↑↑↑↑ 1 ডি রূপান্তর - বেসিক ↑↑↑↑↑

  • রূপান্তর গণনার জন্য মাত্র 1- দিকনির্দেশ (সময়-অক্ষ)
  • ইনপুট = [ডাব্লু], ফিল্টার = [কে], আউটপুট = [ডাব্লু]
  • প্রাক্তন ইনপুট = [1,1,1,1,1], ফিল্টার = [0.25,0.5,0.25], আউটপুট = [1,1,1,1,1]
  • আউটপুট-আকৃতি 1D অ্যারে
  • উদাহরণস্বরূপ) গ্রাফ স্মুথিং

tf.nn.conv1d কোড খেলনা উদাহরণ

import tensorflow as tf
import numpy as np

sess = tf.Session()

ones_1d = np.ones(5)
weight_1d = np.ones(3)
strides_1d = 1

in_1d = tf.constant(ones_1d, dtype=tf.float32)
filter_1d = tf.constant(weight_1d, dtype=tf.float32)

in_width = int(in_1d.shape[0])
filter_width = int(filter_1d.shape[0])

input_1d   = tf.reshape(in_1d, [1, in_width, 1])
kernel_1d = tf.reshape(filter_1d, [filter_width, 1, 1])
output_1d = tf.squeeze(tf.nn.conv1d(input_1d, kernel_1d, strides_1d, padding='SAME'))
print sess.run(output_1d)

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

↑↑↑↑↑ 2 ডি রূপান্তর - বেসিক ↑↑↑↑↑

  • রূপান্তর গণনা করতে 2- দিকনির্দেশ (x, y)
  • আউটপুট-আকৃতি 2 ডি ম্যাট্রিক্স
  • ইনপুট = [ডাব্লু, এইচ], ফিল্টার = [কে, কে] আউটপুট = [ডাব্লু, এইচ]
  • উদাহরণস্বরূপ) সোবেল ডিম ফ্লেটার

tf.nn.conv2d - খেলনা উদাহরণ

ones_2d = np.ones((5,5))
weight_2d = np.ones((3,3))
strides_2d = [1, 1, 1, 1]

in_2d = tf.constant(ones_2d, dtype=tf.float32)
filter_2d = tf.constant(weight_2d, dtype=tf.float32)

in_width = int(in_2d.shape[0])
in_height = int(in_2d.shape[1])

filter_width = int(filter_2d.shape[0])
filter_height = int(filter_2d.shape[1])

input_2d   = tf.reshape(in_2d, [1, in_height, in_width, 1])
kernel_2d = tf.reshape(filter_2d, [filter_height, filter_width, 1, 1])

output_2d = tf.squeeze(tf.nn.conv2d(input_2d, kernel_2d, strides=strides_2d, padding='SAME'))
print sess.run(output_2d)

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

↑↑↑↑↑ 3 ডি কনভলিউশনস - বেসিক ↑↑↑↑↑

  • 3- দিকনির্দেশ (x, y, z) ক্যালভুট রূপান্তর করতে
  • আউটপুট-আকৃতি 3 ডি ভলিউম
  • ইনপুট = [ডাব্লু, এইচ, এল ], ফিল্টার = [কে, কে, ডি ] আউটপুট = [ডাব্লু, এইচ, এম]
  • ডি <এল গুরুত্বপূর্ণ! ভলিউম আউটপুট তৈরীর জন্য
  • উদাহরণস্বরূপ) সি 3 ডি

tf.nn.conv3d - খেলনা উদাহরণ

ones_3d = np.ones((5,5,5))
weight_3d = np.ones((3,3,3))
strides_3d = [1, 1, 1, 1, 1]

in_3d = tf.constant(ones_3d, dtype=tf.float32)
filter_3d = tf.constant(weight_3d, dtype=tf.float32)

in_width = int(in_3d.shape[0])
in_height = int(in_3d.shape[1])
in_depth = int(in_3d.shape[2])

filter_width = int(filter_3d.shape[0])
filter_height = int(filter_3d.shape[1])
filter_depth = int(filter_3d.shape[2])

input_3d   = tf.reshape(in_3d, [1, in_depth, in_height, in_width, 1])
kernel_3d = tf.reshape(filter_3d, [filter_depth, filter_height, filter_width, 1, 1])

output_3d = tf.squeeze(tf.nn.conv3d(input_3d, kernel_3d, strides=strides_3d, padding='SAME'))
print sess.run(output_3d)

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

Input 3 ডি ইনপুট সহ 2 ডি কনভোলিউশনগুলি - লেনেট, ভিজিজি, ..., ↑↑↑↑↑ ↑↑↑↑↑

  • ইভেন্টহুট ইনপুট 3 ডি প্রাক্তন) 224x224x3, 112x112x32
  • আউটপুট-আকৃতি 3 ডি ভলিউম নয়, তবে 2 ডি ম্যাট্রিক্স
  • কারণ ফিল্টার গভীরতা = এল অবশ্যই ইনপুট চ্যানেল = এল এর সাথে মেলে
  • 2- দিকনির্দেশ (x, y) ক্যালকুয়েট কন 3 ডি নয়
  • ইনপুট = [ডাব্লু, এইচ, এল ], ফিল্টার = [কে, কে, এল ] আউটপুট = [ডাব্লু, এইচ]
  • আউটপুট-আকৃতি 2 ডি ম্যাট্রিক্স
  • আমরা যদি এন ফিল্টারগুলি প্রশিক্ষণ দিতে চাই তবে (এন ফিল্টার সংখ্যা)
  • তারপরে আউটপুট আকারটি (স্ট্যাকড 2 ডি) 3 ডি = 2 ডি এক্স এন ম্যাট্রিক্স।

কনফি 2 ডি - 1 ফিল্টারের জন্য লেনেট, ভিজিজি, ...

in_channels = 32 # 3 for RGB, 32, 64, 128, ... 
ones_3d = np.ones((5,5,in_channels)) # input is 3d, in_channels = 32
# filter must have 3d-shpae with in_channels
weight_3d = np.ones((3,3,in_channels)) 
strides_2d = [1, 1, 1, 1]

in_3d = tf.constant(ones_3d, dtype=tf.float32)
filter_3d = tf.constant(weight_3d, dtype=tf.float32)

in_width = int(in_3d.shape[0])
in_height = int(in_3d.shape[1])

filter_width = int(filter_3d.shape[0])
filter_height = int(filter_3d.shape[1])

input_3d   = tf.reshape(in_3d, [1, in_height, in_width, in_channels])
kernel_3d = tf.reshape(filter_3d, [filter_height, filter_width, in_channels, 1])

output_2d = tf.squeeze(tf.nn.conv2d(input_3d, kernel_3d, strides=strides_2d, padding='SAME'))
print sess.run(output_2d)

কনফি 2 ডি - এন ফিল্টারগুলির জন্য লেনেট, ভিজিজি, ...

in_channels = 32 # 3 for RGB, 32, 64, 128, ... 
out_channels = 64 # 128, 256, ...
ones_3d = np.ones((5,5,in_channels)) # input is 3d, in_channels = 32
# filter must have 3d-shpae x number of filters = 4D
weight_4d = np.ones((3,3,in_channels, out_channels))
strides_2d = [1, 1, 1, 1]

in_3d = tf.constant(ones_3d, dtype=tf.float32)
filter_4d = tf.constant(weight_4d, dtype=tf.float32)

in_width = int(in_3d.shape[0])
in_height = int(in_3d.shape[1])

filter_width = int(filter_4d.shape[0])
filter_height = int(filter_4d.shape[1])

input_3d   = tf.reshape(in_3d, [1, in_height, in_width, in_channels])
kernel_4d = tf.reshape(filter_4d, [filter_height, filter_width, in_channels, out_channels])

#output stacked shape is 3D = 2D x N matrix
output_3d = tf.nn.conv2d(input_3d, kernel_4d, strides=strides_2d, padding='SAME')
print sess.run(output_3d)

এখানে চিত্র বর্ণনা লিখুন CN সিএনএন - এ বোনাস 1x1 রূপান্তর - গুগলনেট, ..., ↑↑↑↑↑

  • 1x1 কুনিউভ বিভ্রান্ত করছে যখন আপনি এটিকে 2 ডি ইমেজ ফিল্টার হিসাবে সোবলের মতো ভাবেন
  • সিএনএন-তে 1x1 রূপান্তরের জন্য, উপরের ছবিটির মতো ইনপুটটি 3 ডি আকারের।
  • এটি গভীরতার ভিত্তিতে ফিল্টারিংয়ের গণনা করে
  • ইনপুট = [ডাব্লু, এইচ, এল], ফিল্টার = [1,1, এল] আউটপুট = [ডাব্লু, এইচ]
  • আউটপুট স্ট্যাকড আকৃতি 3D = 2D এক্স এন ম্যাট্রিক্স।

tf.nn.conv2d - বিশেষ কেস 1x1 রূপান্তর

in_channels = 32 # 3 for RGB, 32, 64, 128, ... 
out_channels = 64 # 128, 256, ...
ones_3d = np.ones((1,1,in_channels)) # input is 3d, in_channels = 32
# filter must have 3d-shpae x number of filters = 4D
weight_4d = np.ones((3,3,in_channels, out_channels))
strides_2d = [1, 1, 1, 1]

in_3d = tf.constant(ones_3d, dtype=tf.float32)
filter_4d = tf.constant(weight_4d, dtype=tf.float32)

in_width = int(in_3d.shape[0])
in_height = int(in_3d.shape[1])

filter_width = int(filter_4d.shape[0])
filter_height = int(filter_4d.shape[1])

input_3d   = tf.reshape(in_3d, [1, in_height, in_width, in_channels])
kernel_4d = tf.reshape(filter_4d, [filter_height, filter_width, in_channels, out_channels])

#output stacked shape is 3D = 2D x N matrix
output_3d = tf.nn.conv2d(input_3d, kernel_4d, strides=strides_2d, padding='SAME')
print sess.run(output_3d)

অ্যানিমেশন (3 ডি ইনপুট সহ 2 ডি কনভ)

এখানে চিত্র বর্ণনা লিখুন - মূল লিঙ্ক: লিঙ্ক
- লেখক: মার্টিন গারনার
- টুইটার: @মার্টিন_গোর্নার
- গুগল +: প্লাস ++

2 ডি ইনপুট সহ বোনাস 1D কনভলিউশনগুলি

এখানে চিত্র বর্ণনা লিখুন D 1 ডি ইনপুট সহ 1 ডি কনভোলিউশনগুলি ↑↑↑↑↑

এখানে চিত্র বর্ণনা লিখুন2D ইনপুট সহ D 1D কনভলিউশনগুলি ↑↑↑↑↑

  • ইভেন্টহফ ইনপুট 2 ডি প্রাক্তন) 20x14
  • আউটপুট-আকৃতি 2 ডি নয় , তবে 1 ডি ম্যাট্রিক্স
  • কারণ ফিল্টার উচ্চতা = এল অবশ্যই ইনপুট উচ্চতা = এল এর সাথে মিলে যায়
  • 1- দিকনির্দেশ (এক্স) ক্যালকুয়েট করার জন্য! 2D না
  • ইনপুট = [ডাব্লু, এল ], ফিল্টার = [কে, এল ] আউটপুট = [ডাব্লু]
  • আউটপুট-আকৃতি 1 ডি ম্যাট্রিক্স
  • আমরা যদি এন ফিল্টারগুলি প্রশিক্ষণ দিতে চাই তবে (এন ফিল্টার সংখ্যা)
  • তারপরে আউটপুট আকারটি (স্ট্যাকড 1 ডি) 2 ডি = 1 ডি এক্স এন ম্যাট্রিক্স।

বোনাস সি 3 ডি

in_channels = 32 # 3, 32, 64, 128, ... 
out_channels = 64 # 3, 32, 64, 128, ... 
ones_4d = np.ones((5,5,5,in_channels))
weight_5d = np.ones((3,3,3,in_channels,out_channels))
strides_3d = [1, 1, 1, 1, 1]

in_4d = tf.constant(ones_4d, dtype=tf.float32)
filter_5d = tf.constant(weight_5d, dtype=tf.float32)

in_width = int(in_4d.shape[0])
in_height = int(in_4d.shape[1])
in_depth = int(in_4d.shape[2])

filter_width = int(filter_5d.shape[0])
filter_height = int(filter_5d.shape[1])
filter_depth = int(filter_5d.shape[2])

input_4d   = tf.reshape(in_4d, [1, in_depth, in_height, in_width, in_channels])
kernel_5d = tf.reshape(filter_5d, [filter_depth, filter_height, filter_width, in_channels, out_channels])

output_4d = tf.nn.conv3d(input_4d, kernel_5d, strides=strides_3d, padding='SAME')
print sess.run(output_4d)

sess.close()

টেনসরফ্লো ইনপুট এবং আউটপুট

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

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

সারসংক্ষেপ

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


18
ব্যাখ্যাগুলিতে আপনার শ্রম এবং স্বচ্ছতার কথা বিবেচনা করে 8 টির উন্নতি খুব কম।
ব্যবহারকারী 3282777

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

2
আশ্চর্য উত্তর!
বেন

2 ডি the তে কনভিউশনির দিকনির্দেশ কেন ↲ আমি যে বলে যে দাবি করা অভিমুখ হল সূত্র দেখেছি সারিতে 1, তারপর সারিতে 1+stride। কনভলিউশন নিজেই শিফট ইনগ্রেন্টেট, সুতরাং কেন কনভলিউশনটির দিকটি গুরুত্বপূর্ণ?
মিন ট্রায়েট

আপনার প্রশ্নের জন্য ধন্যবাদ। হ্যাঁ! কনভোলশন নিজেই শিফট ইনগ্রেন্টেট। সুতরাং গণনা করার জন্য দিকনির্দেশের দিকটি কোনও বিষয় নয় ((আপনি দুটি বড় ম্যাট্রিক্সের গুণ দ্বারা 2 ডি কিউ গণনা করতে পারেন c ক্যাফের কাঠামোটি ইতিমধ্যে করেছে) তবে বোঝার জন্য কনভের দিকনির্দেশ দিয়ে ব্যাখ্যা করা আরও ভাল। কারণ 3 ডি ইনপুট সহ 2 ডি রূপান্তর দিকনির্দেশ ছাড়াই বিভ্রান্ত করছে। ^^
রানানী

6

@ রুনহানির উত্তর অনুসরণ করে আমি ব্যাখ্যাটি আরও পরিষ্কার করার জন্য আরও কয়েকটি বিশদ যুক্ত করছি এবং এটি আরও কিছুটা ব্যাখ্যা করার চেষ্টা করব (এবং অবশ্যই টিএফ 1 এবং টিএফ 2 এর বহিরাগতদের সাথে)।

প্রধান অতিরিক্ত বিটগুলির মধ্যে একটি আমি অন্তর্ভুক্ত করছি,

  • অ্যাপ্লিকেশন উপর জোর দেওয়া
  • এর ব্যবহার tf.Variable
  • ইনপুট / কার্নেলস / আউটপুট 1D / 2D / 3 ডি কনভোলজ সম্পর্কে আরও পরিষ্কার ব্যাখ্যা
  • স্ট্রাইড / প্যাডিংয়ের প্রভাব

1 ডি কনভলিউশন

আপনি টিএফ 1 এবং টিএফ 2 ব্যবহার করে কীভাবে 1 ডি কনভোলিউশন করতে পারেন তা এখানে।

এবং নির্দিষ্ট করে তুলতে আমার ডেটাতে নিম্নলিখিত আকার রয়েছে,

  • 1 ডি ভেক্টর - [batch size, width, in channels](উদাঃ 1, 5, 1)
  • কার্নেল - [width, in channels, out channels](উদাঃ 5, 1, 4)
  • আউটপুট - [batch size, width, out_channels](উদাঃ 1, 5, 4)

টিএফ 1 উদাহরণ

import tensorflow as tf
import numpy as np

inp = tf.placeholder(shape=[None, 5, 1], dtype=tf.float32)
kernel = tf.Variable(tf.initializers.glorot_uniform()([5, 1, 4]), dtype=tf.float32)
out = tf.nn.conv1d(inp, kernel, stride=1, padding='SAME')

with tf.Session() as sess:
  tf.global_variables_initializer().run()
  print(sess.run(out, feed_dict={inp: np.array([[[0],[1],[2],[3],[4]],[[5],[4],[3],[2],[1]]])}))

টিএফ 2 উদাহরণ

import tensorflow as tf
import numpy as np

inp = np.array([[[0],[1],[2],[3],[4]],[[5],[4],[3],[2],[1]]]).astype(np.float32)
kernel = tf.Variable(tf.initializers.glorot_uniform()([5, 1, 4]), dtype=tf.float32)
out = tf.nn.conv1d(inp, kernel, stride=1, padding='SAME')
print(out)

এটি টিএফ 2 এর সাথে কম কাজ করা যেমন টিএফ 2 এর প্রয়োজন হয় না Sessionএবং variable_initializerউদাহরণস্বরূপ।

বাস্তব জীবনে এটির মতো দেখতে কেমন হতে পারে?

সুতরাং আসুন বুঝতে দিন এটি একটি সিগন্যাল স্মুথিং উদাহরণ ব্যবহার করে কী করছে। বাম দিকে আপনি আসলটি পেয়েছেন এবং ডানদিকে আপনি একটি কনভোলিউশন 1 ডি আউটপুট পেয়েছেন যার মধ্যে 3 আউটপুট চ্যানেল রয়েছে।

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

একাধিক চ্যানেল মানে কি?

একাধিক চ্যানেলগুলি মূলত একটি ইনপুটটির একাধিক বৈশিষ্ট্য উপস্থাপনা। এই উদাহরণে আপনার কাছে তিনটি পৃথক ফিল্টার দ্বারা প্রাপ্ত তিনটি উপস্থাপনা রয়েছে। প্রথম চ্যানেলটি সমান ওজনযুক্ত স্মুথিং ফিল্টার। দ্বিতীয়টি এমন একটি ফিল্টার যা সীমানার চেয়ে ফিল্টারের মাঝামাঝি ওজন করে। চূড়ান্ত ফিল্টার দ্বিতীয়টির বিপরীতে কাজ করে। সুতরাং আপনি দেখতে পাচ্ছেন যে এই বিভিন্ন ফিল্টারগুলি কীভাবে বিভিন্ন প্রভাব নিয়ে আসে।

1 ডি কনভ্যুশনের গভীর শেখার অ্যাপ্লিকেশন

বাক্য শ্রেণিবদ্ধকরণ কার্যের জন্য 1 ডি সমঝোতা সফলভাবে ব্যবহৃত হয়েছে ।

2 ডি কনভোলিউশন

2D সমাবর্তন বন্ধ। আপনি যদি একজন গভীর শিক্ষার লোক হন তবে আপনি 2 ডি সমঝোতার মাধ্যমে পৌঁছান নি এমন সম্ভাবনাগুলি হ'ল শূন্যের। এটি চিত্রের শ্রেণিবদ্ধকরণ, অবজেক্ট সনাক্তকরণ ইত্যাদির জন্য সিএনএন-তে পাশাপাশি চিত্রগুলির জড়িত এনএলপি সমস্যাগুলিতে ব্যবহৃত হয় (যেমন চিত্রের ক্যাপশন জেনারেশন)।

আসুন একটি উদাহরণ চেষ্টা করুন, আমি এখানে নিম্নলিখিত ফিল্টারগুলির সাথে একটি কনভ্যুশনাল কার্নেল পেয়েছি,

  • এজ সনাক্তকরণের কার্নেল (3x3 উইন্ডো)
  • অস্পষ্ট কার্নেল (3x3 উইন্ডো)
  • তীক্ষ্ণ কার্নেল (3x3 উইন্ডো)

এবং নির্দিষ্ট করে তুলতে আমার ডেটাতে নিম্নলিখিত আকার রয়েছে,

  • চিত্র (কালো এবং সাদা) - [batch_size, height, width, 1](উদাঃ 1, 340, 371, 1)
  • কার্নেল (ওরফে ফিল্টার) - [height, width, in channels, out channels](উদাঃ 3, 3, 1, 3)
  • আউটপুট (ওরফে বৈশিষ্ট্য মানচিত্র) - [batch_size, height, width, out_channels](উদাঃ 1, 340, 371, 3)

টিএফ 1 উদাহরণ,

import tensorflow as tf
import numpy as np
from PIL import Image

im = np.array(Image.open(<some image>).convert('L'))#/255.0

kernel_init = np.array(
    [
     [[[-1, 1.0/9, 0]],[[-1, 1.0/9, -1]],[[-1, 1.0/9, 0]]],
     [[[-1, 1.0/9, -1]],[[8, 1.0/9,5]],[[-1, 1.0/9,-1]]],
     [[[-1, 1.0/9,0]],[[-1, 1.0/9,-1]],[[-1, 1.0/9, 0]]]
     ])

inp = tf.placeholder(shape=[None, image_height, image_width, 1], dtype=tf.float32)
kernel = tf.Variable(kernel_init, dtype=tf.float32)
out = tf.nn.conv2d(inp, kernel, strides=[1,1,1,1], padding='SAME')

with tf.Session() as sess:
  tf.global_variables_initializer().run()
  res = sess.run(out, feed_dict={inp: np.expand_dims(np.expand_dims(im,0),-1)})

টিএফ 2 উদাহরণ

import tensorflow as tf
import numpy as np
from PIL import Image

im = np.array(Image.open(<some image>).convert('L'))#/255.0
x = np.expand_dims(np.expand_dims(im,0),-1)

kernel_init = np.array(
    [
     [[[-1, 1.0/9, 0]],[[-1, 1.0/9, -1]],[[-1, 1.0/9, 0]]],
     [[[-1, 1.0/9, -1]],[[8, 1.0/9,5]],[[-1, 1.0/9,-1]]],
     [[[-1, 1.0/9,0]],[[-1, 1.0/9,-1]],[[-1, 1.0/9, 0]]]
     ])

kernel = tf.Variable(kernel_init, dtype=tf.float32)

out = tf.nn.conv2d(x, kernel, strides=[1,1,1,1], padding='SAME')

বাস্তব জীবনে এর মতো দেখতে কেমন হতে পারে?

এখানে আপনি উপরের কোড দ্বারা উত্পাদিত আউটপুট দেখতে পারেন। প্রথম চিত্রটি আসল এবং যাচ্ছে ঘড়ির ভিত্তিতে আপনার 1 ম ফিল্টার, 2 য় ফিল্টার এবং 3 ফিল্টারের আউটপুট রয়েছে। এখানে চিত্র বর্ণনা লিখুন

একাধিক চ্যানেল মানে কি?

প্রসঙ্গে যদি 2 ডি কনভোলিউশন হয় তবে এই একাধিক চ্যানেলগুলির অর্থ কী তা বোঝা অনেক সহজ। বলুন আপনি মুখের স্বীকৃতি দিচ্ছেন। আপনি ভাবতে পারেন (এটি একটি অত্যন্ত অবাস্তব সরলকরণ যা তবে পয়েন্টটি জুড়ে পায়) প্রতিটি ফিল্টার একটি চোখ, মুখ, নাক ইত্যাদির প্রতিনিধিত্ব করে যাতে প্রতিটি বৈশিষ্ট্যের মানচিত্রটি আপনার সরবরাহিত চিত্রটিতে সেই বৈশিষ্ট্যটি আছে কিনা তা একটি দ্বিচার উপস্থাপনা হতে পারে । আমি মনে করি না যে আমাকে চাপ দেওয়ার দরকার যে একটি মুখের স্বীকৃতি মডেলের জন্য সেগুলি অত্যন্ত মূল্যবান বৈশিষ্ট্য। এই নিবন্ধে আরও তথ্য ।

এটি আমি যা স্পষ্ট করে বলার চেষ্টা করছি তার একটি চিত্রণ।

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

2D সমঝোতার গভীর শেখার অ্যাপ্লিকেশন

2D সমঝোতা গভীর শিক্ষার ক্ষেত্রে খুব প্রচলিত।

সিএনএন (কনভলিউশন নিউরাল নেটওয়ার্কস) প্রায় সমস্ত কম্পিউটার ভিশন টাস্কের জন্য 2 ডি কনভোলিউশন অপারেশন ব্যবহার করে (যেমন চিত্রের শ্রেণিবিন্যাস, অবজেক্ট সনাক্তকরণ, ভিডিও শ্রেণিবদ্ধকরণ)।

3 ডি কনভোলিউশন

মাত্রার সংখ্যা বাড়ার সাথে কী চলছে তা চিত্রিত করা এখন ক্রমশ কঠিন হয়ে পড়েছে। তবে 1 ডি এবং 2 ডি কনভ্যুশান কীভাবে কাজ করে তা ভালভাবে বোঝার সাথে 3 ডি কনভ্যুশনে এই বোঝার সাধারণকরণ করা খুব সোজা-এগিয়ে forward সুতরাং এখানে যায়।

এবং নির্দিষ্ট করে তুলতে আমার ডেটাতে নিম্নলিখিত আকার রয়েছে,

  • 3 ডি ডেটা (LIDAR) - [batch size, height, width, depth, in channels](উদাঃ 1, 200, 200, 200, 1)
  • কার্নেল - [height, width, depth, in channels, out channels](উদাঃ 5, 5, 5, 1, 3)
  • আউটপুট - [batch size, width, height, width, depth, out_channels](উদাঃ 1, 200, 200, 2000, 3)

টিএফ 1 উদাহরণ

import tensorflow as tf
import numpy as np

tf.reset_default_graph()

inp = tf.placeholder(shape=[None, 200, 200, 200, 1], dtype=tf.float32)
kernel = tf.Variable(tf.initializers.glorot_uniform()([5,5,5,1,3]), dtype=tf.float32)
out = tf.nn.conv3d(inp, kernel, strides=[1,1,1,1,1], padding='SAME')

with tf.Session() as sess:
  tf.global_variables_initializer().run()
  res = sess.run(out, feed_dict={inp: np.random.normal(size=(1,200,200,200,1))})

টিএফ 2 উদাহরণ

import tensorflow as tf
import numpy as np

x = np.random.normal(size=(1,200,200,200,1))
kernel = tf.Variable(tf.initializers.glorot_uniform()([5,5,5,1,3]), dtype=tf.float32)
out = tf.nn.conv3d(x, kernel, strides=[1,1,1,1,1], padding='SAME') 

3 ডি সমঝোতার গভীর শেখার অ্যাপ্লিকেশন

LIDAR (লাইট ডিটেকশন অ্যান্ড রঙিং) ডেটা জড়িত মেশিন লার্নিং অ্যাপ্লিকেশনগুলি বিকাশ করার সময় 3 ডি কনভোলজেশন ব্যবহৃত হয়েছে যা প্রকৃতির 3 মাত্রিক।

কি ... আরও কলঙ্ক ?: স্ট্রাইড এবং প্যাডিং

ঠিক আছে আপনি প্রায় সেখানে আছেন। তাই ধরুন। আসুন দেখে নেওয়া যাক পদক্ষেপ এবং প্যাডিং কী। আপনি যদি তাদের সম্পর্কে চিন্তা করেন তবে তারা বেশ স্বজ্ঞাত।

আপনি যদি কোনও করিডোর পেরিয়ে যান তবে আপনি কম পদক্ষেপে দ্রুত সেখানে পৌঁছে যান। তবে এর অর্থ হ'ল আপনি যদি ঘরের উপর দিয়ে হাঁটেন তবে তার চেয়ে কম পার্শ্ববর্তী অবস্থা আপনি লক্ষ্য করেছেন। আসুন এখন একটি সুন্দর ছবি দিয়ে আমাদের বোঝার শক্তি জোরদার করা যাক! আসুন 2D সমঝোতার মাধ্যমে এগুলি বুঝতে পারি।

অগ্রগতি বোঝা

কনভলিউশন পদক্ষেপ

আপনি tf.nn.conv2dউদাহরণস্বরূপ ব্যবহার করার সময়, আপনাকে এটি 4 টি উপাদানের ভেক্টর হিসাবে সেট করতে হবে। এটি দেখে আতঙ্কিত হওয়ার কোনও কারণ নেই। এটি কেবল নিম্নলিখিত ক্রমের ধাপগুলি অন্তর্ভুক্ত করে।

  • 2 ডি কনভোলিউশন - [batch stride, height stride, width stride, channel stride]। এখানে, ব্যাচের স্ট্রাইড এবং চ্যানেল স্ট্রাইড আপনি কেবল একটিতে সেট করেছেন (আমি দীর্ঘ 5 বছর ধরে গভীর শিক্ষার মডেল বাস্তবায়ন করছি এবং সেগুলি কখনও একটি ব্যতীত সেট করতে হয়নি)। যাতে আপনাকে সেট করতে কেবলমাত্র 2 টি ধাপে ছেড়ে যায়।

  • 3 ডি কনভোলিউশন - [batch stride, height stride, width stride, depth stride, channel stride]। এখানে আপনি কেবল উচ্চতা / প্রস্থ / গভীরতার স্ট্রাইড সম্পর্কে চিন্তিত।

প্যাডিং বোঝা যাচ্ছে

এখন, আপনি লক্ষ্য করেছেন যে আপনার প্রান্তটি কতটা ছোট হোক না কেন (অর্থাত্ 1) সমঝোতার সময় একটি অনিবার্য মাত্রা হ্রাস ঘটছে (উদাহরণস্বরূপ 4 ইউনিটের প্রশস্ত চিত্রের সংশ্লেষণের পরে প্রস্থটি 3 হয়)। বিশেষত গভীর সমঝোতা নিউরাল নেটওয়ার্ক তৈরি করার সময় এটি অনাকাঙ্ক্ষিত। এখানেই প্যাডিং উদ্ধারে আসে। দুটি বেশিরভাগ ব্যবহৃত প্যাডিং প্রকার রয়েছে।

  • SAME এবং VALID

নীচে আপনি পার্থক্য দেখতে পারেন।

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

চূড়ান্ত শব্দ : আপনি যদি খুব কৌতূহলী হন তবে আপনি ভাবতে পারেন। আমরা পুরো বোতামটি স্বয়ংক্রিয় মাত্রা হ্রাস করার জন্য ফেলেছি এবং এখন বিভিন্ন ধাপের কথা বলছি। তবে স্ট্রাইড সম্পর্কে সর্বোত্তম জিনিস হ'ল কখন এবং কীভাবে মাত্রা হ্রাস পাবে তা নিয়ন্ত্রণ করুন।


2
  1. সিএনএন 1 ডি, 2 ডি, বা 3 ডি ইনপুট বা ফিল্টার মাত্রার পরিবর্তে কনভলিউশন দিক নির্দেশ করে।

  2. 1 চ্যানেল ইনপুট জন্য, সিএনএন 2 ডি সমান হয় সিএনএন 1 ডি কর্নেল দৈর্ঘ্য = ইনপুট দৈর্ঘ্য। (1 সমাবর্তীর দিকনির্দেশ)


2

সংক্ষেপে, 1 ডি সিএনএন-তে, কার্নেলটি 1 দিকে এগিয়ে যায়। 1 ডি সিএনএন এর ইনপুট এবং আউটপুট ডেটা 2 মাত্রিক। বেশিরভাগ সময় টাইম-সিরিজ ডেটা ব্যবহার করা হয়।

2 ডি সিএনএন-তে, কার্নেলটি 2 টি দিকে এগিয়ে যায়। 2 ডি সিএনএন এর ইনপুট এবং আউটপুট ডেটা 3 মাত্রিক। বেশিরভাগই চিত্রের ডেটাতে ব্যবহৃত হয়।

3 ডি সিএনএন-তে, কার্নেলটি 3 টি দিকে এগিয়ে যায়। 3 ডি সিএনএন এর ইনপুট এবং আউটপুট ডেটা 4 মাত্রিক। সর্বাধিক 3 ডি চিত্রের ডেটাতে ব্যবহৃত হয় (এমআরআই, সিটি স্ক্যান)।

আপনি এখানে আরও বিশদ জানতে পারেন: https://medium.com/@xzz201920/conv1d-conv2d-and-conv3d-8a59182c4d6

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