কেরাসে আমি কোথায় ব্যাচনারমালাইজেশন ফাংশন কল করব?


167

আমি যদি কেরাসে ব্যাচনারমালাইজেশন ফাংশনটি ব্যবহার করতে চাই, তবে আমাকে কি কেবল একবার শুরুতে কল করার দরকার নেই?

আমি এটির জন্য এই ডকুমেন্টেশনটি পড়েছি: http://keras.io/layers/normalization/

আমি এটি কল করার কথা ছিল না আমি দেখতে পাচ্ছি না। নীচে আমার কোডটি এটি ব্যবহার করার চেষ্টা করছে:

model = Sequential()
keras.layers.normalization.BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None)
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(2, init='uniform'))
model.add(Activation('softmax'))

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)

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

উত্তর:


225

এই প্রশ্নের উত্তরটি আরও কিছুটা বিশদে দিতে, এবং যেমন পাভেল বলেছিলেন, ব্যাচ নরমালাইজেশন হ'ল আরেকটি স্তর, তাই আপনি এটি আপনার পছন্দসই নেটওয়ার্ক আর্কিটেকচার তৈরি করতে যেমন এটি ব্যবহার করতে পারেন।

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

আপনার ক্ষেত্রে উপরে, এটি দেখতে দেখতে হতে পারে:


# import BatchNormalization
from keras.layers.normalization import BatchNormalization

# instantiate model
model = Sequential()

# we can think of this chunk as the input layer
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.5))

# we can think of this chunk as the hidden layer    
model.add(Dense(64, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.5))

# we can think of this chunk as the output layer
model.add(Dense(2, init='uniform'))
model.add(BatchNormalization())
model.add(Activation('softmax'))

# setting up the optimization of our weights 
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)

# running the fitting
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, validation_split=0.2, verbose = 2)

আশা করি এটি কিছুটা আরও পরিষ্কার করে দেয়।


25
অ্যাক্টিভেশন ফাংশন শেষে এফওয়াইআইআই স্পষ্টত ব্যাচের স্বাভাবিককরণ অনুশীলনে আরও ভাল কাজ করে
ক্লাদিউ

10
হাই ক্লেডিউ, আপনি কি এই এফওয়াইআই-তে আরও প্রসারিত করতে চান? এটি উপরের উত্তরটির সাথে সরাসরি বিরোধিতা করে বলে মনে হচ্ছে।
বেন ওগোরেক

7
@ বেনোগোরেক: নিশ্চিত বিষয়, আমি প্রাথমিকভাবে এটিকে এখানে ফলাফলের উপর ভিত্তি করে তৈরি করেছি যেখানে রিলু আরও ভাল সম্পাদন করার পরে ব্যাচের আদর্শ রেখেছিল nor এফডাব্লুআইডাব্লু আমি যে এক নেট চেষ্টা করেছি
সেটিকে একভাবে

32
মজাদার. কেবলমাত্র অনুসরণ করতে, আপনি যদি সেই সংক্ষিপ্তসারটি পড়তে থাকেন তবে এটি বলছে যে তাদের সেরা মডেল [গুগলনেট 128_BN_lim0606] আসলে বি এন এল এর আগে বিএন স্তর রয়েছে। যখন বিএন পরে অ্যাক্টিভেশন পরে কোনও বিচ্ছিন্ন ক্ষেত্রে সঠিকতার উন্নতি করতে পারে, যখন পুরো মডেলটি তৈরি করা হয়, তার আগে সর্বোত্তম অভিনয় করা হয়েছিল। সম্ভবত এটি সম্ভব যে অ্যাক্টিভেশন পরে বিএন স্থাপন করা নির্ভুলতার উন্নতি করতে পারে তবে সম্ভবত সমস্যা নির্ভর।
লুকাস রমজান

7
@ কার্ল থমé ধরণের উদাহরণস্বরূপ ReginaldIII এর এই রেডডিট মন্তব্যটি দেখুন । তারা বলেছে: "বিএন কনভলশন থেকে আগত বৈশিষ্ট্যগুলির বন্টনকে স্বাভাবিক করে তুলছে, কিছু [বৈশিষ্ট্য] এই বৈশিষ্ট্যগুলি রিএলইউর মতো একটি অ-লিনিয়ারিটি দ্বারা নেতিবাচক [এবং] কেটে যেতে পারে activ ফিচার স্পেস থেকে এগুলি ধুয়ে ফেলার আগে অবিলম্বে সাধারণীকরণের জন্য
মাব

60

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

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


27
আমি কেবল ডিপলাইনিং.আই ক্লাসে দেখেছি যে অ্যান্ড্রু এনজি বলেছেন যে ডিপ লার্নিং সম্প্রদায়ের মধ্যে এটি নিয়ে একটি বিতর্ক রয়েছে। তিনি অ-লিনিয়ারির আগে ব্যাচের সাধারণকরণ প্রয়োগকে পছন্দ করেন।
শাহেনশা

3
@ কেরাজীআর আমার অর্থ হ'ল প্রফেসর অ্যান্ড্রু এনজি গভীর জ্ঞান বিষয়ে তাঁর গভীর শিক্ষার ক্লাসে এই বিষয়টির বিষয়ে কথা বলেছেন। তিনি বলেছিলেন যে সম্প্রদায়টি বিভিন্ন কাজ করার সঠিক পদ্ধতিতে বিভক্ত এবং তিনি অ-লৈখিকতা প্রয়োগের আগে ব্যাচের সাধারণকরণ প্রয়োগকে পছন্দ করেন।
শাহেনশা

3
অ্যাক্টিভেশন এর আগে @ Jmancuso, বিএন প্রয়োগ করা হয়। নিজেই কাগজ থেকে সমীকরণ হয় g(BN(Wx + b))যেখানে gঅ্যাক্টিভেশন ফাংশন হয়।
yashgarg1232

43

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

যদিও সঠিক কোনও উত্তর নেই, ব্যাচ নরমালাইজেশনের লেখকরা বলেছেন যে এটি বর্তমান স্তরের অ-লৈখিকতার আগে অবিলম্বে প্রয়োগ করা উচিত। কারণ (মূল কাগজ থেকে উদ্ধৃত) -

"আমরা x = Wu + b কে স্বাভাবিক করে আনলাইনারিটির আগে অবিলম্বে বিএন ট্রান্সফর্মটি যুক্ত করি u আমরা আপনার স্তর স্তর ইনপুটগুলিকেও সাধারণীকরণ করতে পারতাম, তবে যেহেতু আপনি সম্ভবত অন্য একটি অন-লাইনের আউটপুট, তাই এর বিতরণের আকারটি পরিবর্তিত হওয়ার সম্ভাবনা রয়েছে প্রশিক্ষণ, এবং এর প্রথম এবং দ্বিতীয় মুহুর্তগুলিকে সীমাবদ্ধ করে কোভেরিয়াট শিফটটি মুছে ফেলা হবে না contrast বিপরীতে, উ + বি একটি প্রতিসাম্য, অপরিষ্কার বিতরণ হওয়ার সম্ভাবনা বেশি, এটি হ'ল "আরও গাউসিয়ান" (হাইভেরিনেন এবং ওজা, 2000) ; এটি স্বাভাবিককরণের ফলে স্থিতিশীল বিতরণ সহ অ্যাক্টিভেশন তৈরি হতে পারে। "


3
আমার নিজের ব্যক্তিগত অভিজ্ঞতায় এটি কোনও বিশাল পার্থক্য রাখে না, তবে সমস্ত কিছু সমান হয়ে গেছে, আমি সবসময় বিএন-কে সামান্যতর পারফর্ম করতে দেখেছি যখন ব্যাচ নরমালাইজেশনটি অ-লিনিয়ারিটির আগে প্রয়োগ করা হয় (অ্যাক্টিভেশন ফাংশনের আগে) before
ব্র্যাড হেসে

31

কেরাস এখন use_bias=Falseবিকল্পটি সমর্থন করে , তাই আমরা কিছু লেখার মতো কিছু সংরক্ষণ করতে পারি

model.add(Dense(64, use_bias=False))
model.add(BatchNormalization(axis=bn_axis))
model.add(Activation('tanh'))

অথবা

model.add(Convolution2D(64, 3, 3, use_bias=False))
model.add(BatchNormalization(axis=bn_axis))
model.add(Activation('relu'))

কেমন model.add(BatchNormalization())থেকে আলাদাmodel.add(BatchNormalization(axis=bn_axis))
Krazzy আর

@kRazzR আপনি যদি tensorflowব্যাকএন্ড হিসাবে ব্যবহার করছেন তবে এর থেকে আলাদা হবে না । এটি এখানে লেখা হয়েছে কারণ তিনি এটি keras.applicationsমডিউল থেকে অনুলিপি করেছেন , যেখানে bn_axisউভয় channels_firstএবং channels_lastফর্ম্যাটকে সমর্থন করার জন্য নির্দিষ্ট করা দরকার ।
ldavid

9
এটি কীভাবে ওপি প্রশ্নের সাথে সম্পর্কিত তা দয়া করে বিস্তারিত বলতে পারেন? (আমি বরং এনএনএসের কাছে শিক্ষানবিস তাই সম্ভবত আমি কিছু মিস করছি))
পেপ্যাক্স

30

স্তরটি অনুসরণ করে একটি স্তর Conv2Dঅনুসরণ করা এখন এটি প্রায় প্রবণতা হয়ে দাঁড়িয়েছে । তাই আমি তাদের সকলকে একবারে কল করার জন্য একটি ছোট ফাংশন করেছি। মডেল সংজ্ঞাটিকে পুরোপুরি ক্লিনার এবং পড়া সহজ করে তোলে।ReLuBatchNormalization

def Conv2DReluBatchNorm(n_filter, w_filter, h_filter, inputs):
    return BatchNormalization()(Activation(activation='relu')(Convolution2D(n_filter, w_filter, h_filter, border_mode='same')(inputs)))

7
এটিকে কেরাসের দিকে ঠেলে দিতে পারে?
sachinruk

6

এটি অন্য ধরণের স্তর, তাই আপনার এটি আপনার মডেলের উপযুক্ত স্থানে স্তর হিসাবে যুক্ত করা উচিত

model.add(keras.layers.normalization.BatchNormalization())

এখানে একটি উদাহরণ দেখুন: https://github.com/fchollet/keras/blob/master/example/kaggle_otto_nn.py


1
আমি ব্যাচনারমালাইজেশন যুক্ত করার পরে, Val_acc প্রতিটি পর্ব বাড়ানো বন্ধ করে দিয়েছে। আমি ব্যাচনারমালাইজেশন যুক্ত করার পরে প্রতি পর্বের পরে Val_acc একই সংখ্যায় স্থির ছিল। আমি ভেবেছিলাম ব্যাচ নরমালাইজেশনটি ভাল_এইচসি বাড়ানোর কথা। এটি সঠিকভাবে কাজ করছে কিনা আমি কীভাবে জানব? আপনি কি জানেন যে এর কারণ কী হতে পারে?
pr338

দুর্ভাগ্যক্রমে লিঙ্কটি আর বৈধ নয় :(
ব্যবহারকারী 2324712

কেরাসের কাঁটাচামচগুলিতে সেই উদাহরণের অনুলিপি রয়েছে (যেমন: github.com/WenchenLi/kaggle/blob/master/otto/keras/… ), তবে কেন জানি না এটি আসল কেরাস রেপো থেকে সরানো হয়েছিল, এবং যদি কোড সর্বশেষতম কেরাস সংস্করণগুলির সাথে সামঞ্জস্যপূর্ণ।
পাভেল সুরম্যানোক

4

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

কেরাসে, ঘন () বা কনভ 2 ডি () বলার সাহায্যে লিনিয়ার ফাংশন গণনা করার পরে, আমরা ব্যাচনরমালাইজেশন () ব্যবহার করি যা একটি স্তরে লিনিয়ার ফাংশন গণনা করে এবং তারপরে আমরা অ্যাক্টিভেশন () ব্যবহার করে স্তরটিতে অ-লিনিয়ারিটি যুক্ত করি।

from keras.layers.normalization import BatchNormalization
model = Sequential()
model.add(Dense(64, input_dim=14, init='uniform'))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(64, init='uniform'))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(2, init='uniform'))
model.add(BatchNormalization(epsilon=1e-06, mode=0, momentum=0.9, weights=None))
model.add(Activation('softmax'))

sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(X_train, y_train, nb_epoch=20, batch_size=16, show_accuracy=True, 
validation_split=0.2, verbose = 2)

ব্যাচ নরমালাইজেশন কীভাবে প্রয়োগ করা হয়?

ধরুন আমাদের একটি লেয়ারে একটি [l-1] ইনপুট আছে। এছাড়াও আমাদের স্তরের ওজনের জন্য ওজন [l] এবং পক্ষপাত ইউনিট খ [l] রয়েছে। একটি [l] লেয়ারের জন্য অ্যাক্টিভেশন ভেক্টর গণনা করা যাক (যেমন অ-লাইনারিটি যুক্ত করার পরে) l এবং z [l] নন-লিনিয়ারিটি যুক্ত করার আগে ভেক্টর হোন

  1. একটি [l-1] এবং ডব্লু [l] ব্যবহার করে আমরা স্তর স্তরটির জন্য z [l] গণনা করতে পারি
  2. সাধারণত ফিড-ফরোয়ার্ড প্রচারে আমরা জেড [এল] এর মতো এই পর্যায়ে জেড [এল] এর পক্ষপাতিত্ব ইউনিট যুক্ত করব [লি] + বি [এল], তবে ব্যাচ সাধারণকরণে খ [এল] সংযোজনের এই পদক্ষেপের প্রয়োজন নেই এবং না b [l] পরামিতি ব্যবহৃত হয়।
  3. Z [l] এর অর্থ গণনা করুন এবং প্রতিটি উপাদান থেকে এটি বিয়োগ করুন
  4. স্ট্যান্ডার্ড বিচ্যুতি ব্যবহার করে বিভক্ত (z [l] - গড়)। একে জেড_টেম্প [l] বলুন
  5. এখন নতুন পরামিতিগুলি সংজ্ঞায়িত করুন γ এবং β যা লুকানো স্তরের স্কেলটি নীচে পরিবর্তন করবে:

    z_norm [l] = γ.Z_temp [l] + β

এই কোড সংক্ষেপে, ঘন () একটি [l-1] নেয়, ডব্লু [l] ব্যবহার করে এবং জেড [এল] গণনা করে। তারপরে তাত্ক্ষণিক ব্যাচনারমালাইজেশন () z_norm দেওয়ার জন্য উপরের পদক্ষেপগুলি সম্পাদন করবে [l]। এবং তারপরে তাত্ক্ষণিকভাবে সক্রিয়করণ () তান (z_norm [l]) গণনা করবে যাতে একটি [l] দিতে পারে

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