日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习:dropout和BN的实现

發布時間:2024/9/15 pytorch 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习:dropout和BN的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • dropout
  • BN

dropout

dropout可以看成是正則化,也可以看成是ensemble

class Dropout(SubLayer):# self._prob:訓練過程中每個神經元被“留下”的概率def __init__(self, parent, shape, drop_prob=0.5):if drop_prob < 0 or drop_prob >= 1:raise ValueError("(Dropout) Probability of Dropout should be a positive float smaller than 1")SubLayer.__init__(self, parent, shape)# 被“留下”的概率自然是1-被Drop的概率self._prob = tf.constant(1-drop_prob, dtype=tf.float32)self.description = "(Drop prob: {})".format(drop_prob)def _activate(self, x, predict):# 如果是在訓練過程,那么就按照設定的、被“留下”的概率進行Dropoutif not predict:return tf.nn.dropout(x, self._prop) # 如果是在預測過程,那么直接返回輸入值即可return x

BN

簡單地將每層得到的數據進行上述歸一化操作顯然是不可行的、因為這樣會破壞掉每層自身學到的數據特征。為了使得中心化之后不破壞 Layer 本身學到的特征、BN 采取了一個簡單卻十分有效的方法:引入兩個可以學習的“重構參數”以期望能夠從中心化的數據重構出 Layer 本身學到的特征。

class Normalize(SubLayer):"""初始化結構self._eps:記錄增強數值穩定性所用的小值的屬性self._activation:記錄自身的激活函數的屬性,主要是為了兼容圖7.17 A的情況self.tf_rm、self.tf_rv:記錄μ_run、σ_run^2的屬性self.tf_gamma、self.tf_beta:記錄γ、β的屬性self._momentum:記錄動量值m的屬性"""def __init__(self, parent, shape, activation="Identical", eps=1e-8, momentum=0.9):SubLayer.__init__(self, parent, shape)self._eps = epsself._activation = activationself.tf_rm = self.tf_rv = Noneself.tf_gamma = tf.Variable(tf.ones(self.shape[1]), name="norm_scale")self.tf_beta = tf.Variable(tf.zeros(self.shape[1]), name="norm_beta")self._momentum = momentumself.description = "(eps:{}, momentum:{})".format(eps, momentum)def _activate(self, x, predict):if self.tf_rm is None or self.tf_rv is None:shape = x.get_shape()[-1]self.tf_rm = tf.Variable(tf.zeros(shape), trainable=False, name="norm_mean")self.tf_rv = tf.Variable(tf.ones(shape), trainable=False, name="norm_var")if not predict:# tf.nn.moments獲取原始的均值和誤差_sm, _sv = tf.nn.moments(x, list(range(len(x.get_shape())-1)))# 定義操作,方便控制依賴_rm = tf.assign(self.tf_rm, self._momentum*self.tf_rm + (1-self._momentum)*_sm)_rv = tf.assign(self.tf_rv, self._momentum*self.tf_rv + (1-self._momentum)*_sv)with tf.control_dependencies([_rm, _rv]):# 按照算法描述,momentum版本應該必須使用動量更新后的均值和誤差 # _norm = tf.nn.batch_normalization(x, _sm, _sv, self.tf_beta, self.tf_gamma, self._eps)_norm = tf.nn.batch_normalization(x, self.tf_rm, self.tf_rv, self.tf_beta, self.tf_gamma, self._eps)else:_norm = tf.nn.batch_normalization(x, self.tf_rm, self.tf_rv, self.tf_beta, self.tf_gamma, self._eps)# 如果指定了激活函數、就再用相應激活函數作用在BN結果上以得到最終結果# 這里只定義了ReLU和Sigmoid兩種,如有需要可以很方便地進行拓展if self._activation == "ReLU":return tf.nn.relu(_norm)if self._activation == "Sigmoid":return tf.nn.sigmoid(_norm)return _norm

總結

以上是生活随笔為你收集整理的深度学习:dropout和BN的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。