keras實現(xiàn)多GPU或指定GPU的使用介紹
1. keras新版本中加入多GPU并行使用的函數(shù)
下面程序段即可實現(xiàn)一個或多個GPU加速:
注意:使用多GPU加速時,Keras版本必須是Keras2.0.9以上版本
from keras.utils.training_utils import multi_gpu_model #導入keras多GPU函數(shù) import VGG19 #導入已經(jīng)寫好的函數(shù)模型,例如VGG19 if G <= 1: print("[INFO] training with 1 GPU...") model = VGG19() # otherwise, we are compiling using multiple GPUs else: print("[INFO] training with {} GPUs...".format(G)) # we'll store a copy of the model on *every* GPU and then combine # the results from the gradient updates on the CPU with tf.device("/cpu:0"): # initialize the model model1 = VGG19() # make the model parallel(if you have more than 2 GPU) model = multi_gpu_model(model1, gpus=G)
2.指定使用某個GPU
首先在終端查看主機中GPU編號:
watch -n -9 nvidia-smi
查詢結(jié)果如下所示:
顯示主機中只有一塊GPU,編號為0
2.1 下面方法是直接在終端運行時加入相關(guān)語句實現(xiàn)指定GPU的使用
export CUDA_VISIBLE_DEVICES=0 python test.py # 表示運行test.py文件時,使用編號為0的GPU卡 export CUDA_VISIBLE_DEVICES=0,2 python test.py # 表示運行test.py文件時,使用編號為0和2的GPU卡
2.2 下面方法是在Python程序中添加
import os # 使用第一張與第三張GPU卡 os.environ["CUDA_VISIBLE_DEVICES"] = "0, 2"
補充知識:踩坑記----large batch_size cause low var_acc
有時候,我們在訓練模型前期,會出現(xiàn)很高的train_acc(訓練準確率),但var_acc(驗證準確率)卻很低。這往往是因為我們模型在訓練過程中已經(jīng)進入局部最優(yōu),或者出現(xiàn)過擬合的現(xiàn)象。造成這種情況有多種原因,我只提出以下幾點,有補充的可以在下面留言,我補充。
(1).訓練數(shù)據(jù)分布不均勻,可能你的訓練數(shù)據(jù)某一類別占據(jù)了大多數(shù),比如95%的數(shù)據(jù)為蘋果,5%的數(shù)據(jù)為其他類別,那么模型為了擬合訓練數(shù)據(jù),則模型會偏袒于把識別結(jié)果歸屬于蘋果,而驗證集的數(shù)據(jù)是正常的,那么便會出現(xiàn)高train_acc,低val_acc。
(2).訓練數(shù)據(jù)沒有shuffle,那么整個batch里面將會是同一個類別數(shù)據(jù),比如都為蘋果的圖片,那么訓練一個batch,那么模型輸出將會往這一類別靠攏,會形成一個很高的acc的假象,但這個模型泛化能力卻很低,因為這個模型都只會為了擬合這批同類的數(shù)據(jù)。
(3).訓練集跟驗證集的預處理不一致,這個是細節(jié)問題,輸入的圖片分布不一致,那么必然會影響到驗證結(jié)果。
(4).模型過于復雜,造成過擬合現(xiàn)象,特別是在于訓練數(shù)據(jù)集不多的情況下,更容易出現(xiàn)過擬合。
(5).這個也是最難發(fā)現(xiàn)的,就是過大的batch_size,造成訓練前期,模型還未收斂,出現(xiàn)很高的train_acc,卻有很低的val_acc,親測,在120個類別,參數(shù)只有七萬的分類模型中,在batch-size等于64的情況下,在第二個epoch時,train_acc達到80%,val_acc卻只有6%,train_loss跟val_loss也是相差很大,而在batch_size在等于8的情況下,在第二個epoch,train_acc跟val_acc皆能達到60%,且還有上升的趨勢。至于為什么,個人認為,模型在大的batch_size的情況下,模型泛化能力下降,且更難擬合,每個epoch所包含的step也更少,且在adam的優(yōu)化算法,前期的學習率較高,模型出現(xiàn)了振蕩,一直在局部最優(yōu)值徘徊,具體原因不知。
接下來分析下,batc_size對模型的影響:
large batch_size:
好處:訓練的更快,每一step都包含更多的訓練集,模型準確率會更高,不容易受到噪聲的影響,穩(wěn)定性更好。
small batch_size:
好處:不容易陷入局部最優(yōu),泛化能力更強。
總結(jié):
(1).large batch_size,雖然訓練模型的訓練誤差會更低,但往往在execute的時候,效果卻不盡人意。
(2).在時間允許的情況下,建議batch_size在32或以下。
以上這篇keras實現(xiàn)多GPU或指定GPU的使用介紹就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于循環(huán)神經(jīng)網(wǎng)絡(RNN)實現(xiàn)影評情感分類
這篇文章主要為大家詳細介紹了基于循環(huán)神經(jīng)網(wǎng)絡(RNN)實現(xiàn)影評情感分類,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03Python Numpy中數(shù)據(jù)的常用保存與讀取方法
這篇文章主要介紹了Python Numpy中數(shù)據(jù)的常用保存與讀取方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04Scrapy基于selenium結(jié)合爬取淘寶的實例講解
今天小編就為大家分享一篇Scrapy基于selenium結(jié)合爬取淘寶的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06