Up主作爲CV窮人代表,這一次想要觸碰一下 papers 裏最爲活躍卻又以 “Huge” 令窮人望而生畏的超級數據集: ImageNet 中的 ILSVRC2012.
還記得依靠氪金 “霸道總裁式” 碾壓一切 “noise 2 image” 的 BigGAN 嗎?
來不及時間解釋了,快上車!
## 下載可憐窮人的 BigGAN-4~8 gpus version
>> git clone https://github.com/ajbrock/BigGAN-PyTorch.git
準備數據集及其預處理
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tar http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_val.tar http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train.tar http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_devkit_t12.tar http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_bbox_train_v2.tar
這一步是重點,講述了UP主如何下載整個數據集。
- 首先是通過迅雷下載一些輔助信息(BBox等)和較小的測試集與驗證集數據(建議租一個一天會員)(直接複製上面的幾個鏈接);
- 但是到了訓練集的 137 個 GB 的時候就不行了,因爲用的是內網,強行被限制了網速,所以只好找到一個熱心網友的網盤上分享的資源,每個類別對應一個壓縮包,共1000個,
## 原來的資源找不到了,這裏有個也是一樣的 https://pan.baidu.com/s/1hsDmdNI
下載完後就是解壓了,花了幾個小時,寫了個腳本(對1000個 .tar 壓縮包進行解壓縮),
import tarfile import os from tqdm import tqdm if __name__ == '__main__': src_pth = 'xxxxxx/ILSVRC2012_img_train' des_pth = 'xxxxxx/SuperDatasets/Image-Net/ILSVRC2012_img_train' for i in tqdm(range(1000)): dir_name = '%04d' % (i+1) if os.path.exists(os.path.join(des_pth, dir_name)) is not True: os.mkdir(os.path.join(des_pth, dir_name)) tar_file = os.path.join(src_pth, dir_name+'.tar') dir_file = os.path.join(des_pth, dir_name) tar_fh = tarfile.open(tar_file) for f_name in tar_fh.getnames(): tar_fh.extract(f_name, path=dir_file) # 解壓到指定文件夾
最後得到
好吧確實有點感動♪(^∀^●)ノ
這裏的每個子文件夾下都是同一個類別的圖像,1000個類別的中英文信息參照這位老哥的博客:imagenet數據集類別標籤和對應的英文中文對照表
但實際上我們並不在意具體每一類別指的是什麼,只要用0,1,2,…去指代即可。
訓練階段我們只需要在工程目錄下新建
data
目錄,裏邊再新建ImageNet
目錄,裏邊再新建I128
目錄,即data/ImageNet/I128
。這之後將 train 的1000個子目錄移動過去。
Anyway,收集完數據後,下面就是預處理了。
- 執行
python make_hdf5.py --dataset I128 --batch_size 128 --data_root data
hdf5 是爲了將數據處理成更利於快速 I /O 的格式,類似於在上一篇博客 EDVR-lmdb ;但與 lmdb 不同的是,lmdb 純碎是存儲一個巨大的 dict,而 hdf5 還附帶了控制 batch 的功能,簡直就是專門爲 dataset 而設計的Σ( ° △ °|||)︴- 其中,
這裏的 batch_size 就是 overall 的;作者說,16GB 的單個 VRAM 支持 batch_size_per_gpu 可以是256,所以作者說原始的 BigGAN設置是:
- 本窮UP好不容易借到 4 張 1080ti,那就是假設是 8GB ✖ 4, 所以
,想想還是算了,就按他給的 256 的一半 128 來吧。
下面我們來看看這樣的設置下發生了什麼?
經由代碼文件
make_hdf5.py, utils.py, datasets.py
我們可以推斷出數據集應該這樣準備:
'''
/data/ImageNet
├I128 # ImageNet 128x128
│ ├dog
│ │ ├xxx.jpg
│ │ ├xxy.jpg
│ │ ...
│ │ └zzz.jpg
│ ├cat
│ │ ├xxx.jpg
│ │ ...
│ │ ├xxy.jpg
│ │ ...
│ │ └zzz.jpg
│ ...
│ └class_n
│ ├xxx.jpg
│ ...
│ ├xxy.jpg
│ ...
│ └zzz.jpg
├I256 # ImageNet 256x256
...
└XXXX
'''
完了後我們應該會得到一個:
data/ImageNet/ILSVRC128.hdf5
TIP
我們發現代碼裏並沒有一定要求1000個類別的圖像都參與訓練,所以我們可以只取其中的一部分類別。那就前 25 類吧,剛好到貓頭鷹先生那裏,一共也有 32500 張圖像。處理就很快了,一分鐘不到,生成文件大小是 1.4 GB。
- 執行
python calculate_inception_moments.py --dataset I128_hdf5 --data_root data
這裏是爲了使用torchvision.models.inception
的預訓練模型去計算 IS 分數( 和 )
開始訓練
python train.py \ --dataset I128_hdf5 \ # which Dataset to train on, out of I128, I256, C10, C100; --parallel --shuffle --num_workers 8 --batch_size 128 \ # for data loader settings --num_G_accumulations 2 --num_D_accumulations 2 \ --num_D_steps 1 --G_lr 1e-4 --D_lr 4e-4 --D_B2 0.999 --G_B2 0.999 \ --G_attn 64 --D_attn 64 \ --G_nl relu --D_nl relu \ --SN_eps 1e-8 --BN_eps 1e-5 --adam_eps 1e-8 \ --G_ortho 0.0 \ --G_init xavier --D_init xavier \ --ema --use_ema --ema_start 2000 --G_eval_mode \ --test_every 2000 --save_every 1000 --num_best_copies 5 --num_save_copies 2 --seed 0 \ --name_suffix SAGAN_ema \
UP主的成功設置
UP主後來變成只有兩張卡,那就再試試咯,把 設置成32,最終暫且在兩張卡上跑了起來。
CUDA_VISIBLE_DEVICES=0,1 python train.py --dataset I128_hdf5 --parallel --shuffle --num_workers 8 --batch_size 32 --num_G_accumulations 1 --num_D_accumulations 1 --num_D_steps 1 --G_lr 1e-4 --D_lr 4e-4 --D_B2 0.999 --G_B2 0.999 --G_attn 64 --D_attn 64 --G_nl relu --D_nl relu --SN_eps 1e-8 --BN_eps 1e-5 --adam_eps 1e-8 --G_ortho 0.0 --G_init xavier --D_init xavier --ema --use_ema --ema_start 2000 --G_eval_mode --test_every 2000 --save_every 1000 --num_best_copies 5 --num_save_copies 2 --seed 0 --name_suffix SAGAN_ema