
یکی از تکنیک های افزایش سرعت train و بهبود دقت در شبکه های CNN استفاده از لایه batch normalization می باشد
bn_layer = tf.layers.batch_normalization(inputs=layer, training=phase_train)
Arguments:
inputs: تنسور ورودی
axis: جهتی که نرمال سازی در آن راستا انجام می شود یا همون راستای نمایش ویژگی داده ها
training : True or False
برای انجام batch_normalization (پیاده سازی مقاله [1]) باید آن را بعد از تابع conv2d قرار می دهیم. ما در این مثال مقادیر پیش فرض را برای کدمون انتخاب می کنیم. اما در تنظیم پارامترهای مهم زیر باید دقت کنیم.
1- در مورد پارامتر Axis دقت کنید که از چه استاندارد داده ای در tf استفاده می کنید و تنسور ورودی را چگونه به عملگر conv ارسال می کنید. اگر از استاندار data_format="channels_first" استفاده می کنید مقدار Axis=1 و اگر از استاندار data_format="channels_last" استفاده می کنید مقدار Axis=-1 که همان مقدار پیش فرض است می باشد. دقت کنید در channels_last شکل تنسور ورودی (batch, ..., channels) می باشد و در channels_first شکل تنسور به صورت (batch, channels, ...) می باشد.
2- در مورد پارامتر training باید توجه داشته باشیم در فاز train مقدار آن True و در فاز ارزیابی و تست داده مقدار آن را False انتخاب کنیم.
فرایند بروزرسانی moving_mean و moving_variance بطور مستقیم در tf.layers.batch_normalization قرار ندارد بنابراین ما باید بروش زیر این کار در مرحله آموزش تزریق کنیم و در ساختار گراف برنامه مون قرار دهیم دهیم.
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) # it`s critical for batch normalization
with tf.control_dependencies(update_ops): # is critical for batch normalization
with tf.variable_scope('Optimizer'):
Optimizer = tf.train.AdamOptimizer(learning_rate=lr, name='Adam-optim').minimize(loss)
کد نهایی را در پست های بعدی خواهید دید
[1] Reference: http://arxiv.org/abs/1502.03167 ,"Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift", Sergey Ioffe, Christian Szegedy