在訓練人臉資料集ms1m時,採用pytorch的imagefolder
對原始的影象進行的讀取。由於人臉資料小,且量大,導致gpu很快訓練完成,但是io卻很慢,從而拖垮了整個訓練時間。
以上問題的根本原因在於pytorch沒有自己的資料格式,像tf的tfrecorde,mx的rec檔案以及caffe使用lmdb,都有自己的格式。因此,我們可以採用其他框架的格式做資料讀取,pytorch來做訓練。
影象資料夾如下形式:imgs
首先生成.lst檔案,該檔案包含了影象的所有路徑。執行**
python img2rec.py train_data imgs -
-list
--recursive -
-num-thread=
10
然後根據生成的.lst檔案生成rec檔案執行**
python img2rec train_data images -
-num-thread=
10
正式的**部分
import mxnet as mx
from mxnet.gluon.data.vision import imagerecorddataset
from mxnet.gluon.data import dataloader
import torch
import numpy as np
from pil import image
defload_mx_rec()
: data = imagerecorddataset(
'f:/mxnet/train_data.rec'
) train_loader = dataloader(data, batch_size=
4, shuffle=
false
) train_transform = transforms.compose(
[transforms.resize(
[int
(128
*128
/112),
int(
128*
128/
112)])
, transforms.randomcrop(
[128
,128])
, transforms.randomhorizontalflip(
), transforms.totensor()]
)for
input
, label in
iter
(train_loader)
: inputs =
input
.asnumpy(
) nb = torch.rand(4,
3,128,
128)
for i in
range(4
):image = image.fromarray(inputs[i,:,
:,:]
) image = train_transform(image)
nb[i,:,
:,:]
= image
labels = label.asnumpy(
) labels = torch.from_numpy(labels)
.long()
# load_mx_rec()
import mxnet as mx
from mxnet.gluon.data.vision import imagerecorddataset
from mxnet.gluon.data import dataloader
import torch
import numpy as np
import cv2
defload_mx_rec_2()
: data = imagerecorddataset(
'f:/mxnet/train_data.rec'
) data1 = datasets.imagefolder(
'f:/mxnet/images'
) train_loader = dataloader(data, batch_size=
4, shuffle=
false
)# train_transform = transforms.compose([transforms.resize([int(128 * 128 / 112)
# , int(128 * 128 / 112)]), transforms.randomcrop([128, 128])
# , transforms.randomhorizontalflip(), transforms.totensor()])
forinput
, label in
iter
(train_loader)
: inputs =
input
.asnumpy(
) nb = torch.rand(4,
3,128,
128)
for i in
range(4
):image = cv2.cvtcolor(inputs[i,:,
:,:]
, cv2.color_rgb2bgr)
size =
(int
(128
*128
/112),
int(
128*
128/
112)
) image = cv2.resize(image, size)
x = np.random.randint(0,
int(
128*
128/
112)
-128
) y = np.random.randint(0,
int(
128*
128/
112)
-128
) image = image[x:x+
128, y:y+
128]
if random.choice([0
,1])
>0:
cv2.flip(image,
1, image)
image = cv2.cvtcolor(image, cv2.color_bgr2rgb)
image = image.transpose(3,
1,2)
.astype(np.float32)
/255
image[0,
:,:]
=(image[0,
:,:]
-0.5)/
0.5 image[1,
:,:]
=(image[1,
:,:]
-0.5)/
0.5 image[2,
:,:]
=(image[2,
:,:]
-0.5)/
0.5 image = torch.from_numpy(image)
nb[i,:,
:,:]
= image
labels = label.asnumpy(
) labels = torch.from_numpy(labels)
.long()
load_mx_rec_2(
)
訓練過程 GPU訓練
為什麼y2b的8m,8張普通tt為啥要跑幾個月?因為gpu其實有60 的時間都是在等待資料填充完成,簡直蠢。1 換個固態硬碟試試?沒用。問題出在系統匯流排上,一幀的資料量入視訊記憶體後有1.58g 當前最優的分布式訓練方式是通過引數伺服器 parameter server 執行的同步隨機梯度下降演算...
的訓練過程 模型訓練過程中累計auc
在平時計算auc的時候,大都是使用 sklearn.metrics.roc auc score 來計算。一般操作是將每個batch 出來的結果 拼接起來,然後扔到該函式中計算。但是如果測試集量級過大 比如 10億量級 每個樣本的 結果拼接起來之後至少需要 3g記憶體。這個開銷顯然不是我們想要的。有什...
Tensorflow訓練過程中validation
tensorflow因為靜態圖的原因,邊train邊validation的過程相較於pytorch來說複雜一些。分別獲取訓練集和驗證集的資料。我這裡使用的是從tfrecoed讀入資料。training data img name batch train,img batch train,gtboxes...