? ? ? ? 最近,在數(shù)據(jù)集處理并載入DataLoader進行訓練的時候出現(xiàn)了問題:
RuntimeError: stack expects each tensor to be equal size,
but got [3, 200, 200] at entry 0 and [1, 200, 200] at entry 1
? ? ? ? 我看了一下,大意就是維度也就是通道數(shù)不匹配,所以我覺得應該是數(shù)據(jù)集圖片出現(xiàn)了問題。以下是我的普通數(shù)據(jù)集處理代碼:
import torch
import torchvision.transforms as transforms
from torch.utils.data import Dataset, DataLoader
import os
from PIL import Image
transform = transforms.Compose([
transforms.RandomCrop((200, 200)), #需要進行同意大小,不然會報錯
transforms.ToTensor(),
])
class PreprocessDataset(Dataset):
"""預處理數(shù)據(jù)集類"""
def __init__(self, HRPath):
"""初始化預處理數(shù)據(jù)集類"""
img_names = os.listdir(HRPath)
self.HR_imgs = [HRPath + "/" + img_name for img_name in img_names]
def __len__(self):
"""獲取數(shù)據(jù)長度"""
return len(self.HR_imgs)
def __getitem__(self, index):
"""獲取數(shù)據(jù)"""
HR_img = self.HR_imgs[index]
HR_img = Image.open(HR_img)
HR_img = transform(HR_img)
return HR_img
if __name__ == '__main__':
HRPath = r"D:\datasets\ImageNet\train"
datasets = PreprocessDataset(HRPath)
trainData = DataLoader(datasets, batch_size=1, shuffle=False)
for i, HR_img in enumerate(trainData):
print(i, HR_img.shape)
? ? ? ? ? 我一張一張圖片放入DataLoader,然后按順序一張一張的查看它們的維度,然后出現(xiàn)如下錯誤:
'''結(jié)果'''
146 torch.Size([1, 3, 200, 200])
147 torch.Size([1, 3, 200, 200])
ValueError: empty range for randrange() (0,-55, -55)
? ? ? ? 我找到出錯前按順序查到了第149(從0開始)張圖片的維度,點開發(fā)現(xiàn)這張圖片的最短邊小于200,不能進行隨機裁剪transforms.RandomCrop((200, 200)),所以我進行了transforms.Resize(400),把圖片最短邊放大到400。
transform = transforms.Compose([
transforms.Resize(400),
transforms.RandomCrop((200, 200)), #需要進行同意大小,不然會報錯
transforms.ToTensor(),
])
? ? ? ? 在次運行并不發(fā)生錯誤,但這是在DataLoader的batch_size=1張圖片的情況下。所以把batch_size改成多張圖片再次運行:
if __name__ == '__main__':
HRPath = r"D:\datasets\ImageNet\train"
# os.listdir(HRPath)
datasets = PreprocessDataset(HRPath)
a = datasets[89]
print(a.shape)
trainData = DataLoader(datasets, batch_size=16, shuffle=False)
for i, HR_img in enumerate(trainData):
print(i, HR_img.shape)
? ? ? ? 發(fā)生錯誤:
'''結(jié)果'''
0 torch.Size([16, 3, 200, 200])
1 torch.Size([16, 3, 200, 200])
2 torch.Size([16, 3, 200, 200])
3 torch.Size([16, 3, 200, 200])
4 torch.Size([16, 3, 200, 200])
RuntimeError: stack expects each tensor to be equal size,
but got [3, 200, 200] at entry 0 and [1, 200, 200] at entry 9
? ? ? ? 從不出錯的結(jié)果上看,定位圖片問題所在的索引應該在80-96之間,那么縮小問題圖片的方位,把batch_size=2:
if __name__ == '__main__':
HRPath = r"D:\datasets\ImageNet\train"
# os.listdir(HRPath)
datasets = PreprocessDataset(HRPath)
a = datasets[89]
print(a.shape)
trainData = DataLoader(datasets, batch_size=2, shuffle=False)
for i, HR_img in enumerate(trainData):
print(i, HR_img.shape)
? ? ? ? 錯誤定位到第89或者第90張圖片:
'''結(jié)果'''
0 torch.Size([2, 3, 200, 200])
...
...
43 torch.Size([2, 3, 200, 200])
RuntimeError: stack expects each tensor to be equal size, but got [3, 200, 200] at entry 0 and [1, 200, 200] at entry 1
? ? ? ? 輸出第89張圖片的維度:
if __name__ == '__main__':
HRPath = r"D:\datasets\ImageNet\train"
# os.listdir(HRPath)
datasets = PreprocessDataset(HRPath)
a = datasets[89]
print(a.shape)
? ? ? ? 結(jié)果:
torch.Size([1, 200, 200])
? ? ? ? 真的是通道數(shù)不統(tǒng)一,醉了啊!
? ? ? ? 解決方法,在圖片預處理的時候,將所有圖片都轉(zhuǎn)成"RGB"三通道的模式:
HR_img = Image.open(HR_img).convert('RGB') #全部以三通道形式打開
? ? ? ? 解決完成?。。?!
?文章來源地址http://www.zghlxwxcb.cn/news/detail-424711.html文章來源:http://www.zghlxwxcb.cn/news/detail-424711.html
?
到了這里,關(guān)于DataLoader問題解決:RuntimeError: stack expects each tensor to be equal size, but got [3, 200, 200]entry1的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!