pytorch 數(shù)據(jù)加載性能對比分析
傳統(tǒng)方式需要10s,dat方式需要0.6s
import os
import time
import torch
import random
from common.coco_dataset import COCODataset
def gen_data(batch_size,data_path,target_path):
os.makedirs(target_path,exist_ok=True)
dataloader = torch.utils.data.DataLoader(COCODataset(data_path,
(352, 352),
is_training=False, is_scene=True),
batch_size=batch_size,
shuffle=False, num_workers=0, pin_memory=False,
drop_last=True) # DataLoader
start = time.time()
for step, samples in enumerate(dataloader):
images, labels, image_paths = samples["image"], samples["label"], samples["img_path"]
print("time", images.size(0), time.time() - start)
start = time.time()
# torch.save(samples,target_path+ '/' + str(step) + '.dat')
print(step)
def cat_100(target_path,batch_size=100):
paths = os.listdir(target_path)
li = [i for i in range(len(paths))]
random.shuffle(li)
images = []
labels = []
image_paths = []
start = time.time()
for i in range(len(paths)):
samples = torch.load(target_path + str(li[i]) + ".dat")
image, label, image_path = samples["image"], samples["label"], samples["img_path"]
images.append(image.cuda())
labels.append(label.cuda())
image_paths.append(image_path)
if i % batch_size == batch_size - 1:
images = torch.cat((images), 0)
print("time", images.size(0), time.time() - start)
images = []
labels = []
image_paths = []
start = time.time()
i += 1
if __name__ == '__main__':
os.environ["CUDA_VISIBLE_DEVICES"] = '3'
batch_size=320
# target_path='d:/test_1000/'
target_path='d:\img_2/'
data_path = r'D:\dataset\origin_all_datas\_2train'
gen_data(batch_size,data_path,target_path)
# get_data(target_path,batch_size)
# cat_100(target_path,batch_size)
這個讀取數(shù)據(jù)也比較快:320 batch_size 450ms
def cat_100(target_path,batch_size=100):
paths = os.listdir(target_path)
li = [i for i in range(len(paths))]
random.shuffle(li)
images = []
labels = []
image_paths = []
start = time.time()
for i in range(len(paths)):
samples = torch.load(target_path + str(li[i]) + ".dat")
image, label, image_path = samples["image"], samples["label"], samples["img_path"]
images.append(image)#.cuda())
labels.append(label)#.cuda())
image_paths.append(image_path)
if i % batch_size < batch_size - 1:
i += 1
continue
i += 1
images = torch.cat(([image.cuda() for image in images]), 0)
print("time", images.size(0), time.time() - start)
images = []
labels = []
image_paths = []
start = time.time()
補充:pytorch數(shù)據(jù)加載和處理問題解決方案
最近跟著pytorch中文文檔學(xué)習(xí)遇到一些小問題,已經(jīng)解決,在此對這些錯誤進行記錄:
在讀取數(shù)據(jù)集時報錯:
AttributeError: 'Series' object has no attribute 'as_matrix'
在顯示圖片是時報錯:
ValueError: Masked arrays must be 1-D
顯示單張圖片時figure一閃而過
在顯示多張散點圖的時候報錯:
TypeError: show_landmarks() got an unexpected keyword argument 'image'
解決方案
主要問題在這一行: 最終目的是將Series轉(zhuǎn)為Matrix,即調(diào)用np.mat即可完成。
修改前
landmarks =landmarks_frame.iloc[n, 1:].as_matrix()
修改后
landmarks =np.mat(landmarks_frame.iloc[n, 1:])
打散點的x和y坐標(biāo)應(yīng)該均為向量或列表,故將landmarks后使用tolist()方法即可
修改前
plt.scatter(landmarks[:,0],landmarks[:,1],s=10,marker='.',c='r')
修改后
plt.scatter(landmarks[:,0].tolist(),landmarks[:,1].tolist(),s=10,marker='.',c='r')
前面使用plt.ion()打開交互模式,則后面在plt.show()之前一定要加上plt.ioff()。這里直接加到函數(shù)里面,避免每次plt.show()之前都用plt.ioff()
修改前
def show_landmarks(imgs,landmarks): '''顯示帶有地標(biāo)的圖片''' plt.imshow(imgs) plt.scatter(landmarks[:,0].tolist(),landmarks[:,1].tolist(),s=10,marker='.',c='r')#打上紅色散點 plt.pause(1)#繪圖窗口延時
修改后
def show_landmarks(imgs,landmarks): '''顯示帶有地標(biāo)的圖片''' plt.imshow(imgs) plt.scatter(landmarks[:,0].tolist(),landmarks[:,1].tolist(),s=10,marker='.',c='r')#打上紅色散點 plt.pause(1)#繪圖窗口延時 plt.ioff()
網(wǎng)上說對于字典類型的sample可通過 **sample的方式獲取每個鍵下的值,但是會報錯,于是把輸入寫的詳細一點,就成功了。
修改前
show_landmarks(**sample)
修改后
show_landmarks(sample['image'],sample['landmarks'])
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
python數(shù)據(jù)解析BeautifulSoup爬取三國演義章節(jié)示例
這篇文章主要介紹了python數(shù)據(jù)解析BeautifulSoup爬取三國演義章節(jié)示例,文中附含詳細示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09
簡單了解Python下用于監(jiān)視文件系統(tǒng)的pyinotify包
這篇文章主要介紹了Python下用于監(jiān)視文件系統(tǒng)的pyinotify包,pyinotify基于inotify事件驅(qū)動機制,需要的朋友可以參考下2015-11-11
python3.6實現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細介紹了python3.6實現(xiàn)學(xué)生信息管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-02-02
Python 圖片轉(zhuǎn)數(shù)組,二進制互轉(zhuǎn)操作
這篇文章主要介紹了Python 圖片轉(zhuǎn)數(shù)組,二進制互轉(zhuǎn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
python數(shù)據(jù)庫PooledDB連接池初始化使用示例
這篇文章主要為大家介紹了python數(shù)據(jù)庫PooledDB連接池初始化使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08

