1. 程式人生 > >keras系列︱利用fit_generator最小化視訊記憶體佔用比率/資料Batch化

keras系列︱利用fit_generator最小化視訊記憶體佔用比率/資料Batch化

執行機器學習演算法時,很多人一開始都會有意無意將資料集預設直接裝進顯示卡視訊記憶體中,如果處理大型資料集(例如圖片尺寸很大)或是網路很深且隱藏層很寬,也可能造成視訊記憶體不足。

這個情況隨著工作的深入會經常碰到,解決方法其實很多人知道,就是分塊裝入。以keras為例,預設情況下用fit方法載資料,就是全部載入。換用fit_generator方法就會以自己手寫的方法用yield逐塊裝入。這裡稍微深入講一下fit_generator方法。
.

— fit_generator原始碼

def fit_generator(self, generator, samples_per_epoch, nb_epoch,
                      verbose=1
, callbacks=[], validation_data=None, nb_val_samples=None, class_weight=None, max_q_size=10, **kwargs)
:

.

— generator 該怎麼寫?

其中generator引數傳入的是一個方法,validation_data引數既可以傳入一個方法也可以直接傳入驗證資料集,通常我們都可以傳入方法。這個方法需要我們自己手寫,虛擬碼如下:

def generate_batch_data_random(x, y, batch_size)
:
"""逐步提取batch資料到視訊記憶體,降低對視訊記憶體的佔用""" ylen = len(y) loopcount = ylen // batch_size while (True): i = randint(0,loopcount) yield x[i * batch_size:(i + 1) * batch_size], y[i * batch_size:(i + 1) * batch_size]

.
為什麼推薦在自己寫的方法中用隨機呢?

  • 因為fit方法預設shuffle引數也是True,fit_generator需要我們自己隨機打亂資料。
  • 另外,在方法中需要用while寫成死迴圈,因為每個epoch不會重新呼叫方法,這個是新手通常會碰到的問題。

當然,如果原始資料已經隨機打亂過,那麼可以不在這裡做隨機處理。否則還是建議加上隨機取數邏輯(如果資料集比較大則可以保證基本亂序輸出)。深度學習中隨機打亂資料是非常重要的,具體參見《深度學習Deep Learning》一書的8.1.3節:《Batch and Minibatch Algorithm》。(2017年5月25日補充說明)
.

呼叫示例:

model.fit_generator(self.generate_batch_data_random(x_train, y_train, batch_size),                                                      
    samples_per_epoch=len(y_train)//batch_size*batch_size,
    nb_epoch=epoch, 
    validation_data=self.generate_valid_data(x_valid, y_valid,batch_size),
    nb_val_samples=(len(y_valid)//batch_size*batch_size), 
    verbose=verbose,
    callbacks=[early_stopping])

這樣就可以將對視訊記憶體的佔用壓低了,配合第一部分的方法可以方便同時執行多程式。

'''
gen_matrix實現從分詞後的list來輸出訓練樣本
gen_target實現將輸出序列轉換為one hot形式的目標
超過maxlen則截斷,不足補0
'''
gen_matrix = lambda z: np.vstack((word2vec[z[:maxlen]], np.zeros((maxlen-len(z[:maxlen]), word_size))))
gen_target = lambda z: np_utils.to_categorical(np.array(z[:maxlen] + [0]*(maxlen-len(z[:maxlen]))), 5)

#從節省記憶體的角度,通過生成器的方式來訓練
def data_generator(data, targets, batch_size): 
    idx = np.arange(len(data))
    np.random.shuffle(idx)
    batches = [idx[range(batch_size*i, min(len(data), batch_size*(i+1)))] for i in range(len(data)/batch_size+1)]
    while True:
        for i in batches:
            xx, yy = np.array(map(gen_matrix, data[i])), np.array(map(gen_target, targets[i]))
            yield (xx, yy)


batch_size = 1024
history = model.fit_generator(data_generator(d['words'], d['label'], batch_size), samples_per_epoch=len(d), nb_epoch=200)
model.save_weights('words_seq2seq_final_1.model')
def generator(array, batch_size):
  """Generate batch with respect to array's first axis."""
  start = 0  # pointer to where we are in iteration
  while True:
    stop = start + batch_size
    diff = stop - array.shape[0]
    if diff <= 0:
      batch = array[start:stop]
      start += batch_size
    else:
      batch = np.concatenate((array[start:], array[:diff]))
      start = diff
    yield batch

To use it, simply write

from observations import cifar10
(x_train, y_train), (x_test, y_test) = cifar10("~/data")
x_train_data = generator(x_train, 256)
公眾號“素質雲筆記”定期更新部落格內容:

這裡寫圖片描述

相關推薦

keras系列利用fit_generator視訊記憶體佔用比率/資料Batch

執行機器學習演算法時,很多人一開始都會有意無意將資料集預設直接裝進顯示卡視訊記憶體中,如果處理大型資料集(例如圖片尺寸很大)或是網路很深且隱藏層很寬,也可能造成視訊記憶體不足。 這個情況隨著工作的深入會經常碰到,解決方法其實很多人知道,就是分塊裝入。以ke

掌握這25條貼士,快速提升資料視覺能力!

視覺化不是單純的資料展示,其真正價值是設計出可以被讀者輕鬆理解的資料展示。設計過程中的每一個選擇,最終都應落地於讀者的體驗,而非設計者個人。 本文提到了一些常見錯誤,也是我們團隊總結出的一些技巧。這25條小貼士能夠快速提升和鞏固你的資料視覺化設計。一起來看看! 一、原則 1. 選擇可以講故事的圖表

求陣列中的k個數以及海量資料大堆、multiset解決方案

【題目】 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 【方案一】 主要有兩種方案。第一是利用我們熟知的 partition 演算法,它是快速排序的核心,相信每個人都會。它可以用來求取陣列的任

如何獲取顯示卡的GPU佔用率和視訊記憶體佔用情況

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

NN模型設定--減小訓練時的記憶體/視訊記憶體佔用

1)kennel_stride   一種技術是使用較大的步幅來進行卷積核心,也就是說,我們應用不是每個畫素的平鋪卷積,而是每兩個或四個畫素(stride為2或4),以便產生較少的輸出資料。   這通常用於輸入層,因為這些使用大部分記憶體。   當然,大stride通常是配合大的kenel

資料視覺』基於Python的資料視覺工具

劉宇宙,現在一家創業型公司做技術總負責,做爬蟲和資料處理相關工作,曾從事過卡系統研發、金融雲端計算服務系統研發,物聯網方向大資料研發,著書一本,《Python3.5從零開始學》 如何做Python 的資料視覺化? pyecharts 是一個用於

Linux 無程序視訊記憶體佔用問題

在linux命令列中鍵入nvidia-smi,顯示沒有程序但是GPU視訊記憶體卻使用很多 在命令列中輸入fuser -v /dev/nvidia*會顯示如下top不會顯示的程序 這些是我之前用kill+程序號殺死的程序殘留,然而還存在,可能是當時使用了多程序加速的方法,

淺談深度學習:如何計算模型以及中間變數的視訊記憶體佔用大小

# 前言 親,視訊記憶體炸了,你的顯示卡快冒煙了! ```python torch.FatalError: cuda runtime error (2) : out of memory at /opt/conda/conda-bld/pytorch_1524590031827/work/aten/src/TH

(五)建築物多邊形系列——外接矩形的獲取

最小外接矩形問題是在給出一個多邊形(或一群點),求出面積最小且外接多邊形的矩形的問題。這個問題看起來並不難,但是具體實現並不簡單。除了呼叫現有的公開庫之外,這裡給出一種簡單且易理解的方法。   演算法的主要思想是: (1)先實現多邊形的簡單外接矩形的演算法。簡單外接矩形是指邊平

C# WinForm開發系列之自定義無邊框窗體(最大化,,關閉,拉伸和移動的相關知識)

        ////重寫系統WndProc函式,使無邊框窗體可移動         protected override void WndProc(ref Message m)         {             switch (m.Msg)             {              

TTCN3新執行器系列-如何類的成員函式(對拷貝構造和賦值操作函式的反思)

2009年4月份,我們的TTCN3新執行器大體功能已經完成了,於是找了幾個專案來試點應用。 應用效果不太理想,特別是對於5萬行以上的指令碼工程,且包括大asn檔案的情況。 新執行器轉換出來的C++程式碼量很大,特別是由於asn型別很多,導致hpp檔案程式碼量大的編譯速度下降嚴

JavaEE開發Linux系列之《一、虛擬機器中centos 6.5minimal安裝與ip網路配置》

前方高能:本帖子儘量保證過程完全並圖文並茂,按照帖子步驟可以正確安裝。有的時候看帖子挺心酸,決定把自己學習的過程詳細的記錄下來。方便自己回憶的同時,分享給大家。 安裝centos minimal的目的

NSIS隱藏窗體標題欄自帶的button(最大化,,關閉X)

簡單 ini tex call 定義 ongui col 分享 http 這個問題實在八月份逛csdn論壇的時候偶然遇到的,當時比較好奇樓主為啥要隱藏關閉button。就順口問了下,結果樓主已經棄樓。未給出原因,猜著可能是為了做自己定義頁面美化,無法改變按紐外觀之類的,

托盤的實現方法

fyi typedef hand delet odi 功能 content call not 在書上看到的,認為實用,記下了。 首先,最小化托盤的基本原理是,將應用程序的主窗口隱藏,然後在托盤中繪制應用程序的圖標。然後再為托盤圖標加入一些事件處理。 核心函數是Shell

CentOS 7安裝後找不到‘ifconfig’命令——修復提示

rep blank running %20 route car 最小化 -a style 就像我們所知道的,“ifconfig”命令用於配置GNU/Linux系統的網絡接口。它顯示網絡接口卡的詳細信息,包括IP地址,MAC地址,以及網絡接口卡狀態之類。但是,該命令已經過時

ASP.NET Core Web API 項目

asp新建項目打開VS2017 新建一個ASP.NET Core 應用程序 (.NET Core)項目,命名為miniwebapi。確定後選擇Web API 模板,並將“身份驗證”設置為“不進行身份驗證”。然後確定就創建好了項目,默認項目的csproj 文件內容如下:<Project Sdk="Micr

CentOS7源碼安裝LAMP-步驟詳解

apache httpd mysql CentOS7最小化源碼安裝LAMP-步驟詳解系統:CentOS 7.3.1611(最小化安裝)軟件:httpd-2.4.27 mysql-5.7.18 php-5.6.3一、配置系統環境1.1. 查看系統版本# cat /etc/cent

從輸入的值中獲取大值和值,輸入0後結束(利用do_while boolean isRight來標識用戶輸入)

bool out 用戶 system efault 最大 pub string void mport java.util.Scanner; public class DoWhile2 {public static void main(String[] args) { int

CentOS 7 - 安裝後,無法使用yum命令!!

修改 進行 習慣 配置文件 net ins 賬號 nbsp sys 剛剛最小化方式安裝了CentOS 7 後,說實話,真不習慣也不喜歡純shell方式工作,使用root賬號登入後,馬上想安裝GNOME,但是發現yum不能正常工作!!! 一,輸入安裝X Window命令,安裝

CentOS7安裝配置IP

centos配置ipCentOS7配置IP:因為是我們安裝的CentOS操作系統是最小化安裝的,所以沒有圖形界面和一些軟件或插件的。IP也是沒有配置的我們需要手動配置IP,然後使用遠程終端通過這個IP去連接操作系統,在終端上操作要比在虛擬機裏操作方便。因為在虛擬機裏不能夠用鼠標復制粘貼或者用滾軸上下滑動界面,