創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買(mǎi)多久送多久,劃算不套路!
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括嵊州網(wǎng)站建設(shè)、嵊州網(wǎng)站制作、嵊州網(wǎng)頁(yè)制作以及嵊州網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,嵊州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到嵊州省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!這篇文章主要介紹TensorFlow和Keras大數(shù)據(jù)量?jī)?nèi)存溢出怎么辦,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
內(nèi)存溢出問(wèn)題是參加kaggle比賽或者做大數(shù)據(jù)量實(shí)驗(yàn)的第一個(gè)攔路虎。
以前做的練手小項(xiàng)目導(dǎo)致新手產(chǎn)生一個(gè)慣性思維——讀取訓(xùn)練集圖片的時(shí)候把所有圖讀到內(nèi)存中,然后分批訓(xùn)練。
其實(shí)這是有問(wèn)題的,很容易導(dǎo)致OOM?,F(xiàn)在內(nèi)存一般16G,而訓(xùn)練集圖片通常是上萬(wàn)張,而且RGB圖,還很大,VGG16的圖片一般是224x224x3,上萬(wàn)張圖片,16G內(nèi)存根本不夠用。這時(shí)候又會(huì)想起——設(shè)置batch,但是那個(gè)batch的輸入?yún)?shù)卻又是圖片,它只是把傳進(jìn)去的圖片分批送到顯卡,而我OOM的地方恰是那個(gè)“傳進(jìn)去”的圖片,怎么辦?
解決思路其實(shí)說(shuō)來(lái)也簡(jiǎn)單,打破思維定式就好了,不是把所有圖片讀到內(nèi)存中,而是只把所有圖片的路徑一次性讀到內(nèi)存中。
大致的解決思路為:
將上萬(wàn)張圖片的路徑一次性讀到內(nèi)存中,自己實(shí)現(xiàn)一個(gè)分批讀取函數(shù),在該函數(shù)中根據(jù)自己的內(nèi)存情況設(shè)置讀取圖片,只把這一批圖片讀入內(nèi)存中,然后交給模型,模型再對(duì)這一批圖片進(jìn)行分批訓(xùn)練,因?yàn)閮?nèi)存一般大于等于顯存,所以內(nèi)存的批次大小和顯存的批次大小通常不相同。
下面代碼分別介紹Tensorflow和Keras分批將數(shù)據(jù)讀到內(nèi)存中的關(guān)鍵函數(shù)。Tensorflow對(duì)初學(xué)者不太友好,所以我個(gè)人現(xiàn)階段更習(xí)慣用它的高層API Keras來(lái)做相關(guān)項(xiàng)目,下面的TF實(shí)現(xiàn)是之前不會(huì)用Keras分批讀時(shí)候參考的一些列資料,在模型訓(xùn)練上仍使用Keras,只有分批讀取用了TF的API。
Tensorlow
在input.py里寫(xiě)get_batch函數(shù)。
def get_batch(X_train, y_train, img_w, img_h, color_type, batch_size, capacity): ''' Args: X_train: train img path list y_train: train labels list img_w: image width img_h: image height batch_size: batch size capacity: the maximum elements in queue Returns: X_train_batch: 4D tensor [batch_size, width, height, chanel],\ dtype=tf.float32 y_train_batch: 1D tensor [batch_size], dtype=int32 ''' X_train = tf.cast(X_train, tf.string) y_train = tf.cast(y_train, tf.int32) # make an input queue input_queue = tf.train.slice_input_producer([X_train, y_train]) y_train = input_queue[1] X_train_contents = tf.read_file(input_queue[0]) X_train = tf.image.decode_jpeg(X_train_contents, channels=color_type) X_train = tf.image.resize_images(X_train, [img_h, img_w], tf.image.ResizeMethod.NEAREST_NEIGHBOR) X_train_batch, y_train_batch = tf.train.batch([X_train, y_train], batch_size=batch_size, num_threads=64, capacity=capacity) y_train_batch = tf.one_hot(y_train_batch, 10) return X_train_batch, y_train_batch