最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TensorFlow實(shí)現(xiàn)批量歸一化操作的示例

 更新時(shí)間:2020年04月22日 14:15:07   作者:Baby-Lily  
這篇文章主要介紹了TensorFlow實(shí)現(xiàn)批量歸一化操作的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

批量歸一化

在對(duì)神經(jīng)網(wǎng)絡(luò)的優(yōu)化方法中,有一種使用十分廣泛的方法——批量歸一化,使得神經(jīng)網(wǎng)絡(luò)的識(shí)別準(zhǔn)確度得到了極大的提升。

在網(wǎng)絡(luò)的前向計(jì)算過(guò)程中,當(dāng)輸出的數(shù)據(jù)不再同一分布時(shí),可能會(huì)使得loss的值非常大,使得網(wǎng)絡(luò)無(wú)法進(jìn)行計(jì)算。產(chǎn)生梯度爆炸的原因是因?yàn)榫W(wǎng)絡(luò)的內(nèi)部協(xié)變量轉(zhuǎn)移,即正向傳播的不同層參數(shù)會(huì)將反向訓(xùn)練計(jì)算時(shí)參照的數(shù)據(jù)樣本分布改變。批量歸一化的目的,就是要最大限度地保證每次的正向傳播輸出在同一分布上,這樣反向計(jì)算時(shí)參照的數(shù)據(jù)樣本分布就會(huì)與正向計(jì)算時(shí)的數(shù)據(jù)分布一樣了,保證分布的統(tǒng)一。

了解了原理,批量正則化的做法就會(huì)變得簡(jiǎn)單,即將每一層運(yùn)算出來(lái)的數(shù)據(jù)都?xì)w一化成均值為0方差為1的標(biāo)準(zhǔn)高斯分布。這樣就會(huì)在保留樣本分布特征的同時(shí),又消除層與層間的分布差異。在實(shí)際的應(yīng)用中,批量歸一化的收斂非???,并且有很強(qiáng)的泛化能力,在一些情況下,完全可以代替前面的正則化,dropout。

批量歸一化的定義

在TensorFlow中有自帶的BN函數(shù)定義:

tf.nn.batch_normalization(x,
             maen,
             variance,
             offset,
             scale,
             variance_epsilon)

各個(gè)參數(shù)的含義如下:

x:代表輸入

mean:代表樣本的均值

variance:代表方差

offset:代表偏移量,即相加一個(gè)轉(zhuǎn)化值,通常是用激活函數(shù)來(lái)做。

scale:代表縮放,即乘以一個(gè)轉(zhuǎn)化值,同理,一般是1

variance_epsilon:為了避免分母是0的情況,給分母加一個(gè)極小值。

要使用這個(gè)函數(shù),還需要另外的一個(gè)函數(shù)的配合:tf.nn.moments(),由此函數(shù)來(lái)計(jì)算均值和方差,然后就可以使用BN了,給函數(shù)的定義如下:

tf.nn.moments(x, axes, name, keep_dims=False),axes指定那個(gè)軸求均值和方差。

為了更好的效果,我們使用平滑指數(shù)衰減的方法來(lái)優(yōu)化每次的均值和方差,這里可以使用

tf.train.ExponentialMovingAverage()函數(shù),它的作用是讓上一次的值對(duì)本次的值有一個(gè)衰減后的影響,從而使的每次的值連起來(lái)后會(huì)相對(duì)平滑一下。

批量歸一化的簡(jiǎn)單用法

下面介紹具體的用法,在使用的時(shí)候需要引入頭文件。

from tensorflow.contrib.layers.python.layers import batch_norm

函數(shù)的定義如下:

batch_norm(inputs,
      decay,
      center,
      scale,
      epsilon,
      activation_fn,
      param_initializers=None,
      param_regularizers=None,
      updates_collections=ops.GraphKeys.UPDATE_OPS,
      is_training=True,
      reuse=None,
      variables_collections=None,
      outputs_collections=None,
      trainable=True,
      batch_weights=None,
      fused=False,
      data_format=DATA_FORMAT_NHWC,
      zero_debias_moving_mean=False,
      scope=None,
      renorm=False,
      renorm_clipping=None,
      renorm_decay=0.99)

各參數(shù)的具體含義如下:

inputs:輸入

decay:移動(dòng)平均值的衰減速度,使用的是平滑指數(shù)衰減的方法更新均值方差,一般會(huì)設(shè)置0.9,值太小會(huì)導(dǎo)致更新太快,值太大會(huì)導(dǎo)致幾乎沒(méi)有衰減,容易出現(xiàn)過(guò)擬合。

scale:是否進(jìn)行變換,通過(guò)乘以一個(gè)gamma值進(jìn)行縮放,我們常習(xí)慣在BN后面接一個(gè)線性變化,如relu。

epsilon:為了避免分母為0,給分母加上一個(gè)極小值,一般默認(rèn)。

is_training:當(dāng)為T(mén)rue時(shí),代表訓(xùn)練過(guò)程,這時(shí)會(huì)不斷更新樣本集的均值和方差,當(dāng)測(cè)試時(shí),要設(shè)置為False,這樣就會(huì)使用訓(xùn)練樣本的均值和方差。

updates_collections:在訓(xùn)練時(shí),提供一種內(nèi)置的均值方差更新機(jī)制,即通過(guò)圖中的tf.GraphKeys.UPDATE_OPS變量來(lái)更新。但它是在每次當(dāng)前批次訓(xùn)練完成后才更新均值和方差,這樣導(dǎo)致當(dāng)前數(shù)據(jù)總是使用前一次的均值和方差,沒(méi)有得到最新的值,所以一般設(shè)置為None,讓均值和方差及時(shí)更新,但在性能上稍慢。

reuse:支持變量共享。

具體的代碼如下:

x = tf.placeholder(dtype=tf.float32, shape=[None, 32, 32, 3])
y = tf.placeholder(dtype=tf.float32, shape=[None, 10])
train = tf.Variable(tf.constant(False))

x_images = tf.reshape(x, [-1, 32, 32, 3])


def batch_norm_layer(value, train=False, name='batch_norm'):
  if train is not False:
    return batch_norm(value, decay=0.9, updates_collections=None, is_training=True)
  else:
    return batch_norm(value, decay=0.9, updates_collections=None, is_training=False)


w_conv1 = init_cnn.weight_variable([3, 3, 3, 64]) # [-1, 32, 32, 3]
b_conv1 = init_cnn.bias_variable([64])
h_conv1 = tf.nn.relu(batch_norm_layer((init_cnn.conv2d(x_images, w_conv1) + b_conv1), train))
h_pool1 = init_cnn.max_pool_2x2(h_conv1)


w_conv2 = init_cnn.weight_variable([3, 3, 64, 64]) # [-1, 16, 16, 64]
b_conv2 = init_cnn.bias_variable([64])
h_conv2 = tf.nn.relu(batch_norm_layer((init_cnn.conv2d(h_pool1, w_conv2) + b_conv2), train))
h_pool2 = init_cnn.max_pool_2x2(h_conv2)


w_conv3 = init_cnn.weight_variable([3, 3, 64, 32]) # [-1, 18, 8, 32]
b_conv3 = init_cnn.bias_variable([32])
h_conv3 = tf.nn.relu(batch_norm_layer((init_cnn.conv2d(h_pool2, w_conv3) + b_conv3), train))
h_pool3 = init_cnn.max_pool_2x2(h_conv3)

w_conv4 = init_cnn.weight_variable([3, 3, 32, 16]) # [-1, 18, 8, 32]
b_conv4 = init_cnn.bias_variable([16])
h_conv4 = tf.nn.relu(batch_norm_layer((init_cnn.conv2d(h_pool3, w_conv4) + b_conv4), train))
h_pool4 = init_cnn.max_pool_2x2(h_conv4)


w_conv5 = init_cnn.weight_variable([3, 3, 16, 10]) # [-1, 4, 4, 16]
b_conv5 = init_cnn.bias_variable([10])
h_conv5 = tf.nn.relu(batch_norm_layer((init_cnn.conv2d(h_pool4, w_conv5) + b_conv5), train))
h_pool5 = init_cnn.avg_pool_4x4(h_conv5)         # [-1, 4, 4, 10]

y_pool = tf.reshape(h_pool5, shape=[-1, 10])


cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_pool))

optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)

加上了BN層之后,識(shí)別的準(zhǔn)確率顯著的得到了提升,并且計(jì)算速度也是飛起。

到此這篇關(guān)于TensorFlow實(shí)現(xiàn)批量歸一化操作的示例的文章就介紹到這了,更多相關(guān)TensorFlow 批量歸一化操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

邢台市| 吉林市| 美姑县| 溆浦县| 威宁| 闽侯县| 东方市| 沧州市| 小金县| 会东县| 武功县| 泾川县| 江华| 民丰县| 平利县| 攀枝花市| 黔西| 沾益县| 金阳县| 舞阳县| 贡觉县| 塔城市| 安顺市| 上犹县| 泰兴市| 老河口市| 宜兰县| 南宁市| 华蓥市| 高青县| 高邑县| 嘉兴市| 镇坪县| 靖远县| 彰武县| 广东省| 道真| 寿光市| 楚雄市| 凌源市| 武冈市|