国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

TensorFlow和Keras解決大數據量內存溢出問題

存儲 存儲軟件
解決思路其實說來也簡單,打破思維定式就好了,不是把所有圖片讀到內存中,而是只把所有圖片的路徑一次性讀到內存中。

以前做的練手小項目導致新手產生一個慣性思維——讀取訓練集圖片的時候把所有圖讀到內存中,然后分批訓練。

其實這是有問題的,很容易導致OOM。現在內存一般16G,而訓練集圖片通常是上萬張,而且RGB圖,還很大,VGG16的圖片一般是224x224x3,上萬張圖片,16G內存根本不夠用。這時候又會想起——設置batch,但是那個batch的輸入參數卻又是圖片,它只是把傳進去的圖片分批送到顯卡,而我OOM的地方恰是那個“傳進去”的圖片,怎么辦?

解決思路其實說來也簡單,打破思維定式就好了,不是把所有圖片讀到內存中,而是只把所有圖片的路徑一次性讀到內存中。

[[229304]]

大致的解決思路為:

將上萬張圖片的路徑一次性讀到內存中,自己實現一個分批讀取函數,在該函數中根據自己的內存情況設置讀取圖片,只把這一批圖片讀入內存中,然后交給模型,模型再對這一批圖片進行分批訓練,因為內存一般大于等于顯存,所以內存的批次大小和顯存的批次大小通常不相同。

下面代碼分別介紹Tensorflow和Keras分批將數據讀到內存中的關鍵函數。Tensorflow對初學者不太友好,所以我個人現階段更習慣用它的高層API Keras來做相關項目,下面的TF實現是之前不會用Keras分批讀時候參考的一些列資料,在模型訓練上仍使用Keras,只有分批讀取用了TF的API。

TensorFlow

在input.py里寫get_batch函數。

  1. def get_batch(X_train, y_train, img_w, img_h, color_type, batch_size, capacity): 
  2.    ''
  3.    Args: 
  4.        X_train: train img path list 
  5.        y_train: train labels list 
  6.        img_w: image width 
  7.        img_h: image height 
  8.        batch_size: batch size 
  9.        capacity: the maximum elements in queue 
  10.    Returns
  11.        X_train_batch: 4D tensor [batch_size, width, height, chanel],\ 
  12.                        dtype=tf.float32 
  13.        y_train_batch: 1D tensor [batch_size], dtype=int32 
  14.    ''
  15.    X_train = tf.cast(X_train, tf.string) 
  16.  
  17.    y_train = tf.cast(y_train, tf.int32)     
  18.    # make an input queue 
  19.    input_queue = tf.train.slice_input_producer([X_train, y_train]) 
  20.  
  21.    y_train = input_queue[1] 
  22.    X_train_contents = tf.read_file(input_queue[0]) 
  23.    X_train = tf.image.decode_jpeg(X_train_contents, channels=color_type) 
  24.  
  25.    X_train = tf.image.resize_images(X_train, [img_h, img_w],  
  26.                                     tf.image.ResizeMethod.NEAREST_NEIGHBOR) 
  27.  
  28.    X_train_batch, y_train_batch = tf.train.batch([X_train, y_train], 
  29.                                                  batch_size=batch_size, 
  30.                                                  num_threads=64, 
  31.                                                  capacity=capacity) 
  32.    y_train_batch = tf.one_hot(y_train_batch, 10)    return X_train_batch, y_train_batch 

在train.py文件中訓練(下面不是純TF代碼,model.fit是Keras的擬合,用純TF的替換就好了)。

  1. X_train_batch, y_train_batch = inp.get_batch(X_train, y_train,  
  2.                                             img_w, img_h, color_type,  
  3.                                             train_batch_size, capacity) 
  4. X_valid_batch, y_valid_batch = inp.get_batch(X_valid, y_valid,  
  5.                                             img_w, img_h, color_type,  
  6.                                             valid_batch_size, capacity)with tf.Session() as sess: 
  7.  
  8.    coord = tf.train.Coordinator() 
  9.    threads = tf.train.start_queue_runners(coord=coord)    
  10.  try:        
  11.  for step in np.arange(max_step):             
  12. if coord.should_stop() :                 
  13. break 
  14.            X_train, y_train = sess.run([X_train_batch,  
  15.                                             y_train_batch]) 
  16.            X_valid, y_valid = sess.run([X_valid_batch, 
  17.                                             y_valid_batch]) 
  18.               
  19.            ckpt_path = 'log/weights-{val_loss:.4f}.hdf5' 
  20.            ckpt = tf.keras.callbacks.ModelCheckpoint(ckpt_path,  
  21.                                                      monitor='val_loss',  
  22.                                                      verbose=1,  
  23.                                                      save_best_only=True,  
  24.                                                      mode='min'
  25.            model.fit(X_train, y_train, batch_size=64,  
  26.                          epochs=50, verbose=1, 
  27.                          validation_data=(X_valid, y_valid), 
  28.                          callbacks=[ckpt])             
  29.            del X_train, y_train, X_valid, y_valid     
  30. except tf.errors.OutOfRangeError: 
  31.        print('done!')    finally: 
  32.        coord.request_stop() 
  33.    coord.join(threads) 
  34.    sess.close() 

Keras

keras文檔中對fit、predict、evaluate這些函數都有一個generator,這個generator就是解決分批問題的。

關鍵函數:fit_generator

  1. # 讀取圖片函數 
  2. def get_im_cv2(paths, img_rows, img_cols, color_type=1, normalize=True): 
  3.    ''
  4.    參數: 
  5.        paths:要讀取的圖片路徑列表 
  6.        img_rows:圖片行 
  7.        img_cols:圖片列 
  8.        color_type:圖片顏色通道 
  9.    返回:  
  10.        imgs: 圖片數組 
  11.    ''
  12.    # Load as grayscale 
  13.    imgs = []    for path in paths:         
  14. if color_type == 1: 
  15.            img = cv2.imread(path, 0)         
  16. elif color_type == 3: 
  17.            img = cv2.imread(path)         
  18. # Reduce size 
  19.        resized = cv2.resize(img, (img_cols, img_rows))        
  20.  if normalize: 
  21.            resized = resized.astype('float32'
  22.            resized /= 127.5 
  23.            resized -= 1.  
  24.         
  25.        imgs.append(resized)         
  26.    return np.array(imgs).reshape(len(paths), img_rows, img_cols, color_type) 

獲取批次函數,其實就是一個generator

  1. def get_train_batch(X_train, y_train, batch_size, img_w, img_h, color_type, is_argumentation): 
  2.    ''
  3.    參數: 
  4.        X_train:所有圖片路徑列表 
  5.        y_train: 所有圖片對應的標簽列表 
  6.        batch_size:批次 
  7.        img_w:圖片寬 
  8.        img_h:圖片高 
  9.        color_type:圖片類型 
  10.        is_argumentation:是否需要數據增強 
  11.    返回:  
  12.        一個generator, 
  13. x: 獲取的批次圖片  
  14. y: 獲取的圖片對應的標簽 
  15.    ''
  16.    while 1:         
  17. for i in range(0, len(X_train), batch_size): 
  18.            x = get_im_cv2(X_train[i:i+batch_size], img_w, img_h, color_type) 
  19.            y = y_train[i:i+batch_size]             
  20. if is_argumentation:                 
  21. # 數據增強 
  22.                x, y = img_augmentation(x, y)             
  23. # 最重要的就是這個yield,它代表返回,返回以后循環還是會繼續,然后再返回。就比如有一個機器一直在作累加運算,但是會把每次累加中間結果告訴你一樣,直到把所有數加完 
  24.            yield({'input': x}, {'output': y}) 

訓練函數

  1. result = model.fit_generator(generator=get_train_batch(X_train, y_train, train_batch_size, img_w, img_h, color_type, True),  
  2.          steps_per_epoch=1351,  
  3.          epochs=50, verbose=1, 
  4.          validation_data=get_train_batch(X_valid, y_valid, valid_batch_size,img_w, img_h, color_type, False), 
  5.          validation_steps=52, 
  6.          callbacks=[ckpt, early_stop], 
  7.          max_queue_size=capacity, 
  8.          workers=1) 

就是這么簡單。但是當初從0到1的過程很難熬,每天都沒有進展,沒有頭緒,急躁占據了思維的大部,熬過了這個階段,就會一切順利,不是運氣,而是踩過的從0到1的每個腳印累積的靈感的爆發,從0到1的腳印越多,后面的路越順利。

責任編輯:武曉燕 來源: 人工智能LeadAI
相關推薦

2021-03-06 10:25:19

內存Java代碼

2021-02-03 15:12:08

java內存溢出

2010-09-26 15:53:25

JVM內存溢出

2011-08-25 10:50:32

SQL Server數Performance

2009-12-08 15:19:58

WCF大數據量

2024-04-25 10:06:03

內存泄漏

2011-08-16 09:21:30

MySQL大數據量快速語句優化

2011-04-18 11:13:41

bcp數據導入導出

2023-08-29 11:38:27

Java內存

2024-01-31 10:11:41

Redis內存

2022-03-25 09:01:16

CSS溢出屬性

2024-01-29 08:45:38

MySQL大數據分頁

2010-07-29 13:30:54

Hibari

2018-04-02 15:37:33

數據庫MySQL翻頁

2010-12-01 09:18:19

數據庫優化

2018-09-06 16:46:33

數據庫MySQL分頁查詢

2010-05-05 10:30:46

MongoDBNoSQL

2024-07-30 15:56:42

2012-12-26 09:23:56

數據庫優化

2017-11-22 15:33:56

MySQL快速插入語句優化
點贊
收藏

51CTO技術棧公眾號

欧美成年网站| 久久蜜桃资源一区二区老牛| 午夜精品国产更新| 日本黄色播放器| 色悠久久久久综合先锋影音下载| 桥本有菜av在线| 免费一区二区| 亚洲男人天堂九九视频| 中文字幕一区二区三区免费视频| 国产成人日日夜夜| 久久综合伊人77777麻豆| 久久99青青| 这里只有精品在线播放| 国产剧情在线| 亚洲成av人片在线观看| 日本成人在线免费视频| 精品一区二区三区的国产在线播放| 99re6热在线精品视频播放速度| 精品国产导航| 久久久精品视频在线观看| av中文字幕在线看| 欧美日韩国产区一| 国产黄色在线播放| 色综合久久天天| 性欧美孕妇孕交| 亚洲444eee在线观看| 国产福利图片| 亚洲精品国偷自产在线99热| 久久97超碰色| 欧美插天视频在线播放| 韩国亚洲精品| 欧美视频一区在线观看| 美女的尿口免费视频| 成人漫画网站免费| 狠狠久久伊人中文字幕| 精品在线观看国产| 在线观看小视频| 欧美日韩成人高清| 国产特黄在线| 91久久国产综合久久| 外国精品视频在线观看| 精品女厕一区二区三区| 在线观看中文字幕| 日韩欧美在线观看| 成人精品一区二区三区校园激情| 色婷婷一区二区| 午夜在线视频| 日韩精品一区在线| 97在线视频免费观看完整版| 亚洲成人黄色网| 亚洲少妇视频| 久久精品99久久久久久久久 | 一区二区三区四区激情| 国产a级片免费观看| 国产日韩欧美精品一区| 男女无套免费视频网站动漫| 亚洲男同1069视频| 视频一区二区三区国产| 欧美一级二级三级乱码| 国产在线天堂www网在线观看| 尤物yw午夜国产精品视频| 日本高清久久| 国产精品视频区| 日韩网站在线| 妞干网视频在线观看| 国产精品乱码一区二三区小蝌蚪| 国产一二三视频| 日本久久电影网| av丝袜在线| 久久精品国产电影| 日韩一区欧美| 亚洲bbw性色大片| 国产欧美日韩在线看| 性色视频在线观看| 亚洲精品久久久久久下一站| 亚洲国产中文在线| 国产成人精品日本亚洲11| 国产伦精一区二区三区| 免费一级网站| 91久色porny| www在线观看播放免费视频日本| 国产精品入口尤物| 欧美精选在线| 中文字幕一区二区三区四区五区人| 91免费视频网| 欧美偷拍视频| 人人视频精品| 日韩一区二区三区视频在线| 免费高清视频在线一区| 国产精品国产三级国产aⅴ9色| 一区二区自拍| 国产极品尤物在线| 精品久久久视频| 欧美特黄aaaaaaaa大片| 国产精品一二三在线| 老司机精品视频一区二区三区| 99热com| 日韩欧美一二三四区| 久久97精品| 亚洲欧洲国产精品久久| 夜夜爽夜夜爽精品视频| 天堂中文在线播放| 国产精品一区二区久久国产| 韩国一区二区三区| 亚洲人成小说| www.xxxx欧美| 1000部精品久久久久久久久| 久久婷婷五月综合色国产香蕉| 欧美制服丝袜第一页| 国产一区二区三区黄网站| 鲁丝片一区二区三区| 亚洲丝袜制服诱惑| 午夜av成人| 美女视频久久| 亚洲国产美国国产综合一区二区| 久久爱.com| 日韩欧美第二区在线观看| 亚洲综合一区二区三区| yiren22亚洲综合| 日本亚洲导航| 日本高清不卡在线观看| 伊人久久大香线蕉av不卡| 欧美日韩一道本| 亚洲乱码久久| 国产精品久久久一区二区| sm久久捆绑调教精品一区| 成人av婷婷| 欧美理论一区二区| 亚洲综合图片区| 电影中文字幕一区二区| 在线免费观看一区二区三区| 一本大道av伊人久久综合| 欧美三级午夜理伦三级小说| 国产在线播放观看| 精品国产123| 国产日韩欧美一区二区三区在线观看| 色网址在线观看| 国产91在线视频| 国产精品初高中害羞小美女文| 欧美三级电影网址| 4444在线观看| 欧美videossexotv100| 最新成人av网站| 在线免费观看h| 国产精品视频大全| 亚洲午夜三级在线| 国产91精品对白在线播放| 色www免费视频| 性欧美xxxx| 国产精品精品国产色婷婷| 亚洲国产精品免费视频| 激情网站五月天| 欧美成人免费网| 国产午夜一区二区三区| 日韩第一区第二区| 欧美人成在线观看ccc36| 亚洲蜜臀av乱码久久精品蜜桃| 日韩三级视频在线观看| 欧美午夜精品久久久久久超碰 | 国产精品69毛片高清亚洲| 你懂的在线播放| 国产精品亚洲综合天堂夜夜| 亚洲三级电影全部在线观看高清| 91麻豆精品激情在线观看最新| 欧美伦理片在线看| 久久久久久久久91| 日韩毛片精品高清免费| 欧美色女视频| 天堂av在线资源| 久久久久se| 亚洲精品福利免费在线观看| 国产成人免费高清| 538任你躁精品视频网免费| 免费福利片在线观看| 国产精品夜间视频香蕉| 欧美性xxxxxxxx| 秋霞影院一区二区| 女生影院久久| 五月婷婷狠狠操| 国产精品日韩欧美| 欧美精品自拍偷拍动漫精品| 奇米综合一区二区三区精品视频| av激情成人网| 免费男女羞羞的视频网站中文字幕| 国产精品亚发布| 欧美精品乱码久久久久久按摩| 国内精品在线播放| 999精品视频在这里| 日本ー区在线视频| 亚洲欧洲日韩综合二区| 色多多国产成人永久免费网站| 国产精品久久久久四虎| 97国产精品| a级片在线免费| 老熟妇仑乱视频一区二区| 国产99在线|中文| 欧美一区二区三区四区在线观看| 国产电影精品久久禁18| 欧美激情在线精品一区二区三区| 91蜜桃在线视频|