পুলিং স্তরগুলি ড্রপআউট স্তরগুলির আগে বা পরে যুক্ত করা হয়?


35

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

উত্তর:


18

সম্পাদনা: @ টোক ফ্যুর্বি সঠিকভাবে উল্লেখ করেছেন যে, টেনসরফ্লোতে ডিফল্ট প্রয়োগটি আসলে একটি উপাদান অনুসারে ড্রপআউট ব্যবহার করে। আমি আগে যা বর্ণনা করেছি তা সিএনএন-তে ড্রপআউটের একটি নির্দিষ্ট বৈকল্পিকের ক্ষেত্রে প্রযোজ্য, যা স্থানিক ড্রপআউট নামে পরিচিত :

একটি সিএনএন-তে প্রতিটি নিউরন একটি বৈশিষ্ট্যযুক্ত মানচিত্র তৈরি করে। যেহেতু ড্রপআউট স্পেসিয়াল ড্রপআউট প্রতি-নিউরনে কাজ করে, একটি নিউরন বাদ দেওয়া মানে সংশ্লিষ্ট বৈশিষ্ট্য মানচিত্রটি বাদ দেওয়া হয় - উদাহরণস্বরূপ প্রতিটি অবস্থানের একই মান হয় (সাধারণত 0)। সুতরাং প্রতিটি বৈশিষ্ট্যের মানচিত্রটি পুরোপুরি বাদ পড়েছে বা একেবারেই বাদ পড়েছে।

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

সম্পাদনা: তবে, আপনি যদি আসলে এলিমেন্ট-ভিত্তিক ড্রপআউট (যা টেনস্রোফ্লোতে ডিফল্ট হিসাবে সেট করা মনে হয়) ব্যবহার করেন তবে আপনি পুলিংয়ের আগে বা পরে ড্রপআউট প্রয়োগ করলে এটি একটি তাত্পর্যপূর্ণ হয়। তবে এটি করার কোনও ভুল উপায় অবশ্যই নেই is গড় পুলিং অপারেশনটি বিবেচনা করুন: আপনি যদি পুলিংয়ের আগে ড্রপআউট প্রয়োগ করেন তবে আপনি ফলস্বরূপ নিউরন অ্যাক্টিভেশনগুলি কার্যকরভাবে স্কেল করেন 1.0 - dropout_probabilityতবে বেশিরভাগ নিউরনগুলি শূন্য নয় (সাধারণভাবে) হবে। যদি আপনি গড় পুলিংয়ের পরে ড্রপআউট প্রয়োগ করেন তবে আপনি সাধারণত (1.0 - dropout_probability)শূন্য নন-স্কিলড নিউরন অ্যাক্টিভেশন এবং dropout_probabilityশূন্য নিউরনের একটি ভগ্নাংশের একটি ভগ্নাংশ দিয়ে শেষ করেন । উভয়ই আমার কাছে টেকসই বলে মনে হয়, দুটোই একেবারেই ভুল নয়।


1
আমি নিশ্চিত না যে এটি ড্রপআউট সম্পাদনের মানক উপায়। উদাহরণস্বরূপ tf.nn.DPout এ এটি উল্লেখ করেছে "ডিফল্টরূপে, প্রতিটি উপাদান স্বাধীনভাবে রাখা হয় বা বাদ দেওয়া হয়"। আপনার কি এটি উত্সাহিত করার কোনও উত্স আছে?
টোক ফর্বি

1
উহু! আমি যা বর্ণনা করেছি তাকে এখন স্থানিক ড্রপআউট বলা হয় : arxiv.org/pdf/1411.4280.pdf । সুতরাং @ টোকএফুরবি আমার দাবিতে সন্দেহ করার পক্ষে ঠিক আছে। তবে, আপনি যেমন লিঙ্কযুক্ত কাগজে পড়তে পারেন, স্থানিক ড্রপআউট পদ্ধতিতে পুরো বৈশিষ্ট্য মানচিত্র বাদ দেওয়া কর্মক্ষমতা উন্নত করে। এটি কোনও আশ্চর্যের বিষয় নয়, সংলগ্ন ক্রিয়াকলাপগুলি অত্যন্ত সংযুক্ত এবং কোনও নির্দিষ্ট উপাদানকে বাদ দেওয়া আসলে সেই উপাদানটির দ্বারা পরিচালিত তথ্যগুলি একেবারেই বাদ দেয় না (কারণ এটি করার সময় কোনও বৈশিষ্ট্যের মানচিত্রে একটি অবিচ্ছিন্ন "গর্ত" নামার খুব সম্ভাবনা নেই) উপাদান জ্ঞানী). এই পার্থক্য প্রতিফলিত করতে আমি আমার উত্তর সম্পাদনা করব।
schreon

10

এই টিউটোরিয়ালটি ড্রপআউটের আগে পুলিং ব্যবহার করে এবং ভাল ফলাফল পায়।

এর অর্থ এই নয় যে অন্য অর্ডারটি অবশ্যই কাজ করে না। আমার অভিজ্ঞতা সীমাবদ্ধ, আমি এগুলি কেবল পুলিং ছাড়াই ঘন স্তরগুলিতে ব্যবহার করেছি।


5

কেরাস থেকে ভিজিজির মতো কনফ্যান্টের উদাহরণ (পুলিংয়ের পরে ড্রপআউট ব্যবহৃত হয়):

import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD

# Generate dummy data
x_train = np.random.random((100, 100, 100, 3))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
x_test = np.random.random((20, 100, 100, 3))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(20, 1)), num_classes=10)

model = Sequential()
# input: 100x100 images with 3 channels -> (100, 100, 3) tensors.
# this applies 32 convolution filters of size 3x3 each.
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)

model.fit(x_train, y_train, batch_size=32, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=32)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.