1. 程式人生 > >關於tensorflow中的Batch normalizition實現多GPU同步

關於tensorflow中的Batch normalizition實現多GPU同步

tensorflow中Batch normalization實現多GPU同步(未完成)

  • 在tensorflow框架中,對於BN層的定義在tf.layers.batch_normalization()中,從上面文章中可以看出,BN層需要一個可更新的均值和方差,如果是多GPU訓練過程中,原理上各個GPU之間的均值和方差應當保持一致,實時進行同步更新,但是我的指導老師說,他們之間關於這個引數在訓練的過程中並沒有保持同步更新,也就是說,在訓練的過程中這幾個引數會有不一致的情況,所以在使用這個方法進行BN操作的時候,就會造成不同GPU上有差異的現象。由此,需要自己手動實現一個BN的方法,從而使得多個GPU在沒個batch訓練完保持同步。
  • 具體程式碼實現如下(參照別人的工程照搬過來的,沒特別仔細看,應該是實現這個目的,並且沒啥毛病。):
def batch_norm(inputs, phase_train, decay=0.9, eps=1e-5,name=''):
    """Batch Normalization

       Args:
           inputs: input data(Batch size) from last layer
           phase_train: when you test, please set phase_train "None"
       Returns:
           output for next layer
    """
with tf.variable_scope('BN'+name): gamma = tf.get_variable("gamma", shape=inputs.get_shape()[-1], dtype=tf.float32, initializer=tf.constant_initializer(1.0)) beta = tf.get_variable("beta", shape=inputs.get_shape()[-1], dtype=tf.float32, initializer=tf.constant_initializer(0.0)) pop_mean =
tf.get_variable("pop_mean", trainable=False, shape=inputs.get_shape()[-1], dtype=tf.float32, initializer=tf.constant_initializer(0.0)) pop_var = tf.get_variable("pop_var", trainable=False, shape=inputs.get_shape()[-1], dtype=tf.float32, initializer=tf.constant_initializer(1.0)) axes = list(range(len(inputs.get_shape()) - 1)) ####這裡往下是重點: if phase_train != None: #TODO:這裡的mean和var應該從每塊GPU中取出來合併計算之後再使用,但是不會。。心賽 batch_mean, batch_var = tf.nn.moments(inputs, axes) train_mean = tf.assign(pop_mean, pop_mean * decay + batch_mean*(1 - decay)) train_var = tf.assign(pop_var, pop_var * decay + batch_var * (1 - decay)) with tf.control_dependencies([train_mean, train_var]): return tf.nn.batch_normalization(inputs, batch_mean, batch_var, beta, gamma, eps) else: return tf.nn.batch_normalization(inputs, pop_mean, pop_var, beta, gamma, eps)

以上。

相關推薦

關於tensorflowBatch normalizition實現GPU同步

tensorflow中Batch normalization實現多GPU同步(未完成) 在tensorflow框架中,對於BN層的定義在tf.layers.batch_normalization()中,從上面文章中可以看出,BN層需要一個可更新的均值和方差,

C#執行緒通過lock實現執行緒同步

Lock定義 lock關鍵字用來確保程式碼塊執行完成,而不會被其他執行緒中斷。它可以把一段程式碼定義為互斥段(critical section),互斥段在一個時刻只允許一個執行緒進入執行,而其他執行緒必須等待。這是通過在程式碼執行期間為給定物件獲取互斥鎖來實

tensorflowBatch Normalization的實現

tensorflow版本1.4 tensorflow目前還沒實現完全封裝好的Batch Normalization的實現,這裡主要試著實現一下。 關於理論可參見《 解讀Batch Normalization》 對於TensorFlow下的BN的實現,首先我

【ASP.NET】UCenter實現站點同步註冊

res login oct bst center 實現 log conf https 問題描述 上一篇文章寫了【ASP.Net】UCenter實現多站點同步登錄退出 在整合論壇的時候,同步註冊也是相當必要的一個功能:將論壇註冊的用戶同步到自己的網站,自己網站註冊

Selenium怎麽實現個窗口之間的切換?

Selenium切換窗口 Selenium利用句柄切換窗口 Selenium窗口之間的切換 Selenium怎麽操作其他的窗口 Selenium 多窗口(多Tab)之前的切換 多窗口的切換的目的是為了讓selenium改變操作的窗口。在selenium中假如不切換窗口,一旦遇到一個鏈接跳轉到另

進程的Manager(),實現進程的數據共享與傳遞

結果 RoCE ger 數據 ict lis {} for multi __author__ = "Alex Li"from multiprocessing import Process, Managerimport osdef f(d, l): d[os.getpi

python 用threadingevent來實現執行緒同步

import threading import time event = threading.Event() #event.clear():將event的標誌設定為False,呼叫wait方法的所有執行緒將被阻塞; event.clear() def synchro_fun():

在SSM框架使用AJAX實現檔案上傳

今天來學習一下在SSM框架中使用ajax實現檔案的上傳。 1.首先我們需要一個搭建好的SSM框架專案,這個在這篇文章裡不是重點,自行先搭建好需要的專案。 這裡我是用的jsp頁面來和後臺介面關聯,在jsp檔案中我們需要一個form表單,請求方法為POST,enctype="mu

bootstrap利用Tag實現個div的上下頁切換

func acc tex oot trap www. active cli ane 添加 nav 和 nav-tabs 類到 ul 中,將會應用 Bootstrap 標簽樣式,添加 nav 和 nav-pills 類到 ul 中,將會應用 Bootstrap 膠囊式樣式 &

MessageBox按鈕如何實現語言

如何正確輸出Byte?瀏覽器程式碼中如何插入廣告過濾規則如何正確輸出Byte?瀏覽器程式碼中如何插入廣告過濾規則 C#呼叫C++DLL的難題C#字元常量的表示C#呼叫C++DLL的難題C#字元常量的表示 C#呼叫C++DLLC++DLL向C#發訊息。GridView出現重複的

java在jvm虛擬機器是如何實現型的?

原文地址:https://blog.csdn.net/huangrunqing/article/details/51996424 眾所周知,多型是面向物件程式語言的重要特性,它允許基類的指標或引用指向派生類的物件,而在具體訪問時實現方法的動態繫

CaffeLMDB介面實現標籤資料準備及訓練

有不少部落格講Caffe多標籤輸入的問題,但總覺得講的不夠透徹,在實踐角度上沒有給出詳細的指導,所以本文力求能給出詳細的實踐過程和說明。 Caffe多標籤輸入常用的的方法有以下幾種: 1. 修改Caffe原始碼使其支援多標籤輸入,參考CSDN部落格《

python&Keras實現GPU或指定GPU的使用

1. keras新版本中加入多GPU並行使用的函式 下面程式段即可實現一個或多個GPU加速:  注意:使用多GPU加速時,Keras版本必須是Keras2.0.9以上版本 from keras.utils.training_utils import multi_gpu_model &n

OpenCVCascadeClassifier類實現尺度檢測原始碼解析

級聯分類器檢測類CascadeClassifier,在2.4.5版本中使用Adaboost的方法+LBP、HOG、HAAR進行目標檢測,載入的是使用traincascade進行訓練的分類器 class CV_EXPORTS_W CascadeClassifier { pu

在C++類使用pthread實現執行緒

現在pthread的api已經相當完善,使用其實現多執行緒難度不大,但是值得注意的一點是當想在類中使用pthread,呼叫pthread_create函式時,傳入的執行函式,也就是下面這個原型的第三個引數void * ( * start_routine) (vo

在LUA使用GETTEXT實現語言支援

在Lua中使用gettext實現多語言支援 GNU gettext 是一套優秀的國際化工具。在 linux 中被大量採用。wordpress 也使用 gettext 實現多語言支援。 本文介紹如何在 quick-cocos2d-x 中使用 gettext 做多語言支

C#的介面實現

我們都知道虛方法實現多型,抽象方法實現多型等,我們今天來看看如何使用介面實現多型 1.首先我們先要來了解了解什麼是介面,它存在的意識     01.介面就是為了約束方法的格式(引數和返回值型別)而存在的     02.介面可以實現多繼承,彌補單繼承的缺陷。   03.介面可以看成是一個特殊的抽象類,通過反編

SpringAOP方式實現資料來源切換

spring動態配置多資料來源,即在大型應用中對資料進行切分,並且採用多個資料庫例項進行管理,這樣可以有效提高系統的水平伸縮性。而這樣的方案就會不同於常見的單一資料例項的方案,這就要程式在執行時根據當時的請求及系統狀態來動態的決定將資料儲存在哪個資料庫例項中,以及從

Arcgis實現視窗同步功能

本功能通過arcgis javascript api 實現多視窗地圖範圍大小同步! 效果圖如下: 具體程式碼有: dojo.connect(map, "onLoad", function () { dojo.connect

JAVA基於UDP實現執行緒通訊

伺服器端程式,利用DatagramSocket負責監聽埠,當客戶端發過來訊息時,伺服器端就會響應,並將訊息內容儲存到Datagrampacket物件中,並且!每一次while迴圈必須重新建立DatagramPacket物件用於儲存訊息資料。並將socket,pa