উত্তর:
আমি সি 3 ডি থেকে ছবি সহ ব্যাখ্যা করতে চাই ।
সংক্ষেপে, সমাবর্তন দিক এবং আউটপুট আকার গুরুত্বপূর্ণ!
↑↑↑↑↑ 1 ডি রূপান্তর - বেসিক ↑↑↑↑↑
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 ডি রূপান্তর - বেসিক ↑↑↑↑↑
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 ডি কনভলিউশনস - বেসিক ↑↑↑↑↑
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 ডি কনভোলিউশনগুলি - লেনেট, ভিজিজি, ..., ↑↑↑↑↑ ↑↑↑↑↑
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)
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 রূপান্তর - গুগলনেট, ..., ↑↑↑↑↑
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)
- মূল লিঙ্ক: লিঙ্ক
- লেখক: মার্টিন গারনার
- টুইটার: @মার্টিন_গোর্নার
- গুগল +: প্লাস ++
D 1 ডি ইনপুট সহ 1 ডি কনভোলিউশনগুলি ↑↑↑↑↑
2D ইনপুট সহ D 1D কনভলিউশনগুলি ↑↑↑↑↑
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()
1
, তারপর → সারিতে 1+stride
। কনভলিউশন নিজেই শিফট ইনগ্রেন্টেট, সুতরাং কেন কনভলিউশনটির দিকটি গুরুত্বপূর্ণ?
@ রুনহানির উত্তর অনুসরণ করে আমি ব্যাখ্যাটি আরও পরিষ্কার করার জন্য আরও কয়েকটি বিশদ যুক্ত করছি এবং এটি আরও কিছুটা ব্যাখ্যা করার চেষ্টা করব (এবং অবশ্যই টিএফ 1 এবং টিএফ 2 এর বহিরাগতদের সাথে)।
প্রধান অতিরিক্ত বিটগুলির মধ্যে একটি আমি অন্তর্ভুক্ত করছি,
tf.Variable
আপনি টিএফ 1 এবং টিএফ 2 ব্যবহার করে কীভাবে 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
)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]]])}))
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 ডি সমঝোতা সফলভাবে ব্যবহৃত হয়েছে ।
2D সমাবর্তন বন্ধ। আপনি যদি একজন গভীর শিক্ষার লোক হন তবে আপনি 2 ডি সমঝোতার মাধ্যমে পৌঁছান নি এমন সম্ভাবনাগুলি হ'ল শূন্যের। এটি চিত্রের শ্রেণিবদ্ধকরণ, অবজেক্ট সনাক্তকরণ ইত্যাদির জন্য সিএনএন-তে পাশাপাশি চিত্রগুলির জড়িত এনএলপি সমস্যাগুলিতে ব্যবহৃত হয় (যেমন চিত্রের ক্যাপশন জেনারেশন)।
আসুন একটি উদাহরণ চেষ্টা করুন, আমি এখানে নিম্নলিখিত ফিল্টারগুলির সাথে একটি কনভ্যুশনাল কার্নেল পেয়েছি,
এবং নির্দিষ্ট করে তুলতে আমার ডেটাতে নিম্নলিখিত আকার রয়েছে,
[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
)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)})
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 সমঝোতা গভীর শিক্ষার ক্ষেত্রে খুব প্রচলিত।
সিএনএন (কনভলিউশন নিউরাল নেটওয়ার্কস) প্রায় সমস্ত কম্পিউটার ভিশন টাস্কের জন্য 2 ডি কনভোলিউশন অপারেশন ব্যবহার করে (যেমন চিত্রের শ্রেণিবিন্যাস, অবজেক্ট সনাক্তকরণ, ভিডিও শ্রেণিবদ্ধকরণ)।
মাত্রার সংখ্যা বাড়ার সাথে কী চলছে তা চিত্রিত করা এখন ক্রমশ কঠিন হয়ে পড়েছে। তবে 1 ডি এবং 2 ডি কনভ্যুশান কীভাবে কাজ করে তা ভালভাবে বোঝার সাথে 3 ডি কনভ্যুশনে এই বোঝার সাধারণকরণ করা খুব সোজা-এগিয়ে forward সুতরাং এখানে যায়।
এবং নির্দিষ্ট করে তুলতে আমার ডেটাতে নিম্নলিখিত আকার রয়েছে,
[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
)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))})
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')
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
নীচে আপনি পার্থক্য দেখতে পারেন।
চূড়ান্ত শব্দ : আপনি যদি খুব কৌতূহলী হন তবে আপনি ভাবতে পারেন। আমরা পুরো বোতামটি স্বয়ংক্রিয় মাত্রা হ্রাস করার জন্য ফেলেছি এবং এখন বিভিন্ন ধাপের কথা বলছি। তবে স্ট্রাইড সম্পর্কে সর্বোত্তম জিনিস হ'ল কখন এবং কীভাবে মাত্রা হ্রাস পাবে তা নিয়ন্ত্রণ করুন।
সংক্ষেপে, 1 ডি সিএনএন-তে, কার্নেলটি 1 দিকে এগিয়ে যায়। 1 ডি সিএনএন এর ইনপুট এবং আউটপুট ডেটা 2 মাত্রিক। বেশিরভাগ সময় টাইম-সিরিজ ডেটা ব্যবহার করা হয়।
2 ডি সিএনএন-তে, কার্নেলটি 2 টি দিকে এগিয়ে যায়। 2 ডি সিএনএন এর ইনপুট এবং আউটপুট ডেটা 3 মাত্রিক। বেশিরভাগই চিত্রের ডেটাতে ব্যবহৃত হয়।
3 ডি সিএনএন-তে, কার্নেলটি 3 টি দিকে এগিয়ে যায়। 3 ডি সিএনএন এর ইনপুট এবং আউটপুট ডেটা 4 মাত্রিক। সর্বাধিক 3 ডি চিত্রের ডেটাতে ব্যবহৃত হয় (এমআরআই, সিটি স্ক্যান)।
আপনি এখানে আরও বিশদ জানতে পারেন: https://medium.com/@xzz201920/conv1d-conv2d-and-conv3d-8a59182c4d6