টেনসরফ্লো এবং কেরাস প্লাটোব্লকচেন ডেটা ইন্টেলিজেন্স সহ CNN-এর জন্য Flatten() - গ্লোবাল পুলিং ব্যবহার করবেন না। উল্লম্ব অনুসন্ধান. আ.

ফ্ল্যাটেন () ব্যবহার করবেন না - টেনসরফ্লো এবং কেরাসের সাথে সিএনএন-এর জন্য গ্লোবাল পুলিং

বেশিরভাগ অনুশীলনকারী, কনভোল্যুশনাল নিউরাল নেটওয়ার্ক (CNN) আর্কিটেকচার সম্পর্কে প্রথম শিখার সময় - শিখুন যে এটি তিনটি মৌলিক অংশ নিয়ে গঠিত:

  • কনভোল্যুশনাল লেয়ার
  • পুলিং লেয়ার
  • সম্পূর্ণভাবে সংযুক্ত স্তর

অধিকাংশ সম্পদ আছে কিছু আমার নিজের বই সহ এই সেগমেন্টেশনের ভিন্নতা। বিশেষত অনলাইন - সম্পূর্ণভাবে সংযুক্ত স্তরগুলি একটি উল্লেখ করে৷ সমতল স্তর এবং (সাধারণত) একাধিক ঘন স্তর.

এটি আদর্শ হিসাবে ব্যবহৃত হত, এবং ভিজিজিনেটের মতো সুপরিচিত আর্কিটেকচারগুলি এই পদ্ধতিটি ব্যবহার করেছিল এবং এতে শেষ হবে:

model = keras.Sequential([
    
    keras.layers.MaxPooling2D((2, 2), strides=(2, 2), padding='same'),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'), 
    keras.layers.Dropout(0.5),
    keras.layers.Dense(4096, activation='relu'),
    keras.layers.Dense(n_classes, activation='softmax')
])

যদিও, কিছু কারণে - এটি প্রায়শই ভুলে যায় যে VGGNet এই পদ্ধতিটি ব্যবহার করার জন্য কার্যত শেষ আর্কিটেকচার ছিল, সুস্পষ্ট গণনাগত বাধার কারণে এটি তৈরি করে। যত তাড়াতাড়ি ResNets, VGGNets (এবং 7 বছর আগে) এর ঠিক এক বছর পরে প্রকাশিত হয়েছিল, সমস্ত মূলধারার আর্কিটেকচারগুলি তাদের মডেল সংজ্ঞাগুলি দিয়ে শেষ করেছে:

model = keras.Sequential([
    
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dense(n_classes, activation='softmax')
])

সিএনএন-এ ফ্ল্যাটেনিং 7 বছর ধরে লেগে আছে। 7 বছর! এবং আপনার শেখার অভিজ্ঞতা এবং আপনি যে কম্পিউটেশনাল রিসোর্স ব্যবহার করছেন উভয়ের উপর এটির ক্ষতিকর প্রভাব সম্পর্কে যথেষ্ট লোক কথা বলছে বলে মনে হচ্ছে না।

গ্লোবাল এভারেজ পুলিং অনেক অ্যাকাউন্টে চ্যাপ্টা করার চেয়ে পছন্দনীয়। আপনি যদি একটি ছোট সিএনএন প্রোটোটাইটিং করছেন - গ্লোবাল পুলিং ব্যবহার করুন। আপনি যদি কাউকে সিএনএন সম্পর্কে শেখান - গ্লোবাল পুলিং ব্যবহার করুন। আপনি যদি একটি MVP তৈরি করছেন - গ্লোবাল পুলিং ব্যবহার করুন। অন্যান্য ব্যবহারের ক্ষেত্রে ফ্ল্যাটেনিং লেয়ার ব্যবহার করুন যেখানে সেগুলি আসলে প্রয়োজন।

কেস স্টাডি - সমতল বনাম গ্লোবাল পুলিং

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

পরিবর্তে একটি বৈশিষ্ট্য মানচিত্র যেমন সমতল (7, 7, 32) দৈর্ঘ্য 1536 এর ভেক্টরে এবং এই দীর্ঘ ভেক্টর থেকে প্যাটার্নগুলি সনাক্ত করার জন্য এক বা একাধিক স্তরকে প্রশিক্ষণ দেয়: আমরা এটিকে একটিতে ঘনীভূত করতে পারি (7, 7) ভেক্টর এবং সেখান থেকে সরাসরি শ্রেণীবদ্ধ করুন। এটা যে সহজ!

লক্ষ্য করুন যে ResNets-এর মতো নেটওয়ার্কগুলির জন্য বটলনেক স্তরগুলি কয়েক হাজার বৈশিষ্ট্যের মধ্যে গণনা করে, নিছক 1536 নয়। সমতল করার সময়, আপনি খুব অদক্ষ উপায়ে অদ্ভুতভাবে আকৃতির ভেক্টর থেকে শিখতে আপনার নেটওয়ার্ককে নির্যাতন করছেন। কল্পনা করুন একটি 2D চিত্র প্রতিটি পিক্সেল সারিতে কাটা হচ্ছে এবং তারপর একটি সমতল ভেক্টরে সংযুক্ত করা হচ্ছে। যে দুটি পিক্সেল উল্লম্বভাবে 0 পিক্সেল আলাদা ছিল তা নয় feature_map_width অনুভূমিকভাবে পিক্সেল দূরে! যদিও এটি একটি শ্রেণিবিন্যাস অ্যালগরিদমের জন্য খুব বেশি গুরুত্বপূর্ণ নাও হতে পারে, যা স্থানিক পরিবর্তনের পক্ষে - এটি কম্পিউটার দৃষ্টির অন্যান্য অ্যাপ্লিকেশনগুলির জন্য ধারণাগতভাবেও ভাল হবে না।

আসুন একটি ছোট প্রদর্শনী নেটওয়ার্ক সংজ্ঞায়িত করা যাক যা কয়েকটি ঘন স্তর সহ একটি সমতল স্তর ব্যবহার করে:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])
model.summary()

সারাংশ দেখতে কেমন?

...                                                              
 dense_6 (Dense)             (None, 10)                330       
                                                                 
=================================================================
Total params: 11,574,090
Trainable params: 11,573,898
Non-trainable params: 192
_________________________________________________________________

একটি খেলনা নেটওয়ার্কের জন্য 11.5M প্যারামিটার - এবং বড় ইনপুট সহ প্যারামিটারগুলি বিস্ফোরিত হতে দেখুন। 11.5M পরামিতি. EfficientNets, ~6M প্যারামিটারে কাজ ডিজাইন করা সেরা পারফরম্যান্স নেটওয়ার্কগুলির মধ্যে একটি, এবং প্রকৃত কার্যক্ষমতা এবং ডেটা থেকে শেখার ক্ষমতার পরিপ্রেক্ষিতে এই সাধারণ মডেলের সাথে তুলনা করা যায় না।

নেটওয়ার্কটিকে আরও গভীর করে আমরা এই সংখ্যাটিকে উল্লেখযোগ্যভাবে কমাতে পারি, যা বৈশিষ্ট্য মানচিত্রগুলিকে সমতল হওয়ার আগে কমাতে আরও সর্বোচ্চ পুলিং (এবং সম্ভাব্য স্ট্রাইডেড কনভোলিউশন) প্রবর্তন করবে। যাইহোক, বিবেচনা করুন যে আমরা নেটওয়ার্কটিকে আরও জটিল করে তুলব যাতে এটিকে কম কম্পিউটেশনালভাবে ব্যয়বহুল করে তোলা যায়, সবই একক স্তরের জন্য যা পরিকল্পনায় একটি রেঞ্চ নিক্ষেপ করছে।

স্তরগুলির সাথে আরও গভীরে গিয়ে ডেটা পয়েন্টগুলির মধ্যে আরও অর্থপূর্ণ, অ-রৈখিক সম্পর্ক বের করা উচিত, একটি চ্যাপ্টা স্তরের জন্য ইনপুট আকারকে কমানো নয়৷

এখানে গ্লোবাল পুলিং সহ একটি নেটওয়ার্ক রয়েছে:

model = keras.Sequential([
    keras.layers.Input(shape=(224, 224, 3)),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.Conv2D(32, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2), (2, 2)),
    keras.layers.BatchNormalization(),
    keras.layers.GlobalAveragePooling2D(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(10, activation='softmax')
])

model.summary()

সারসংক্ষেপ?

 dense_8 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 66,602
Trainable params: 66,410
Non-trainable params: 192
_________________________________________________________________

অনেক ভাল! যদি আমরা এই মডেলের সাথে আরও গভীরে যাই, তাহলে প্যারামিটারের সংখ্যা বাড়বে, এবং আমরা নতুন স্তরগুলির সাথে ডেটার আরও জটিল প্যাটার্নগুলি ক্যাপচার করতে সক্ষম হতে পারি৷ যদিও নির্বোধভাবে করা হয়, VGGNets আবদ্ধ একই সমস্যা দেখা দেবে।

আরও এগিয়ে যাওয়া - হাতে-হোল্ড এন্ড-টু-এন্ড প্রজেক্ট

আপনার অনুসন্ধিৎসু প্রকৃতি আপনাকে আরও যেতে চায়? আমরা আমাদের চেক আউট সুপারিশ নির্দেশিত প্রকল্প: "কনভোল্যুশনাল নিউরাল নেটওয়ার্ক - বেসিক আর্কিটেকচারের বাইরে".

সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!

আমি আপনাকে কিছুটা সময় ভ্রমণে নিয়ে যাব – 1998 থেকে 2022 পর্যন্ত, সারা বছর ধরে বিকশিত সংজ্ঞায়িত আর্কিটেকচারগুলিকে হাইলাইট করে, কী সেগুলিকে অনন্য করে তুলেছে, তাদের ত্রুটিগুলি কী, এবং উল্লেখযোগ্যগুলিকে প্রথম থেকে বাস্তবায়ন করে৷ যখন এটি আসে তখন আপনার হাতে কিছু ময়লা থাকার চেয়ে ভাল আর কিছুই নেই।

ইঞ্জিনে 4 বা 8টি সিলিন্ডার আছে কিনা এবং ইঞ্জিনের মধ্যে ভালভের অবস্থান কী তা না জেনেই আপনি গাড়ি চালাতে পারেন। যাইহোক – আপনি যদি একটি ইঞ্জিন (কম্পিউটার ভিশন মডেল) ডিজাইন এবং প্রশংসা করতে চান তবে আপনি একটু গভীরে যেতে চাইবেন। এমনকি আপনি যদি আর্কিটেকচার ডিজাইন করার জন্য সময় ব্যয় করতে না চান এবং পরিবর্তে পণ্য তৈরি করতে চান, যা বেশিরভাগই করতে চায় - আপনি এই পাঠে গুরুত্বপূর্ণ তথ্য পাবেন। VGGNet-এর মতো পুরানো আর্কিটেকচার ব্যবহার করলে কেন আপনার পণ্য এবং কর্মক্ষমতা ক্ষতিগ্রস্থ হবে এবং আপনি যদি আধুনিক কিছু তৈরি করেন তবে কেন সেগুলি এড়িয়ে যাওয়া উচিত, আপনি শিখতে পারবেন এবং আপনি ব্যবহারিক সমস্যা সমাধানের জন্য কোন আর্কিটেকচারে যেতে পারেন এবং কী কী তা শিখবেন। সুবিধা এবং অসুবিধা প্রতিটি জন্য হয়.

আপনি যদি এই পাঠের সংস্থানগুলি ব্যবহার করে আপনার ক্ষেত্রে কম্পিউটারের দৃষ্টিভঙ্গি প্রয়োগ করতে চান - আপনি নতুন মডেলগুলি খুঁজে পেতে সক্ষম হবেন, তারা কীভাবে কাজ করে তা বুঝতে পারবেন এবং কোন মানদণ্ডে আপনি তাদের তুলনা করতে পারেন এবং কোন বিষয়ে সিদ্ধান্ত নিতে পারেন ব্যবহার

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

উপসংহার

এই সংক্ষিপ্ত গাইডে, আমরা CNN আর্কিটেকচার ডিজাইনে চ্যাপ্টা করার বিকল্পটি দেখেছি। যদিও সংক্ষিপ্ত - প্রোটোটাইপ বা এমভিপি ডিজাইন করার সময় গাইডটি একটি সাধারণ সমস্যাকে সম্বোধন করে এবং আপনাকে চ্যাপ্টা করার একটি ভাল বিকল্প ব্যবহার করার পরামর্শ দেয়।

যেকোন অভিজ্ঞ কম্পিউটার ভিশন ইঞ্জিনিয়ার এই নীতিটি জানবেন এবং প্রয়োগ করবেন, এবং অনুশীলনটি মঞ্জুর করা হয়। দুর্ভাগ্যবশত, এটি সঠিকভাবে নতুন অনুশীলনকারীদের সাথে রিলে করা হয়েছে বলে মনে হচ্ছে না যারা সবেমাত্র ক্ষেত্রটিতে প্রবেশ করছে এবং স্টিকি অভ্যাস তৈরি করতে পারে যা পরিত্রাণ পেতে কিছু সময় নেয়।

আপনি যদি কম্পিউটার ভিশনে যাচ্ছেন - নিজের জন্য একটি উপকার করুন এবং আপনার শেখার যাত্রায় শ্রেণীবিভাগের আগে সমতল স্তরগুলি ব্যবহার করবেন না।

সময় স্ট্যাম্প:

থেকে আরো Stackabuse