网易首页 > 网易号 > 正文 申请入驻

在PyTorch上加载自定义数据集

0
分享至

动机

当你想建立一个机器学习模型时,你首先要做的就是准备数据集。当数据是表格格式时则很容易准备,但如果是像图像这样的数据呢?

图像与表格数据的格式不同。这种格式有很多数据表示。

有些人根据图像对应的类将其放入一个文件夹,而有些人则以表格格式创建元数据,以描述图像文件名及其标签。

当数据集采用第一种格式时,我们可以使用torch.data.utils库里一个名为ImageFolder的类来加载数据集。

但大多数情况下,图像数据集有第二种格式,其中包含元数据和图像文件夹。因此,我们需要自行准备数据集。

例如,你希望使用深度学习构建一个图像分类器,它由如下所示的元数据组成:

正如你看到的,数据集由图像id和标签组成。在本例中,图像id还标示.jpg格式的文件名,标签采用one-hot编码格式。

如何加载数据集以便模型可以读取图像及其标签?

在本文中,我将向你展示如何使用PyTorch加载包含元数据的图像数据集。我们将使用来自Kaggle竞赛的一个名为“植物病理学2020-FGVC7”的数据集,可以在这里访问这些数据:https://www.kaggle.com/c/plant-pathology-2020-fgvc7 。

预处理元数据

我们首先要做的就是对元数据进行预处理。从上图中可以看到,数据集不包含图像文件名。而且,标签仍然是one-hot格式。

但是值得庆幸的是,图像id还通过在id中添加.jpg来表示图像文件名。生成图像文件名的代码如下所示:

importpandasaspd#假设你在KAGGLE笔记本上运行代码path='/kaggle/input/plant-pathology-2020-fgvc7/'img_path=path+'images'#加载数据集train_df=pd.read_csv(path+'train.csv')test_df=pd.read_csv(path+'test.csv')sample=pd.read_csv(path+'sample_submission.csv')#获取图像文件名train_df['img_path']=train_df['image_id']+'.jpg'test_df['img_path']=test_df['image_id']+'.jpg'train_df.head()

结果是这样的:

在我们获得图像文件名之后,现在我们可以使标签成为一个单独的列。代码如下:

#拆开和融合train_label=train_df.melt(id_vars=['image_id','img_path'])#过滤数据train_label=train_label[train_label['value']==1]#获取图像ID号train_label['id']=[int(i[1])foriintrain_label['image_id'].str.split('_')]#重置索引train_label=train_label.sort_values('id').reset_index()#将标签添加到数据集train_df['label']=train_label['variable']#重新格式化数据集train_df=train_df[train_df.columns[[0,5,1,2,3,4,6]]]print(train_label.shape)train_df.head()

结果:

由于机器学习模型只能读取数字,所以我们必须将标签编码为数字。代码如下:

fromsklearn.preprocessingimportLabelEncoder#对标签进行编码le=LabelEncoder()label_encoded=le.fit_transform(train_df['label'])train_df['label_encoded']=label_encoded#取类名label_names=label_encoded.classes_train_df.head()

结果:

在对元数据进行预处理之后,可以进入下一步。

使用Dataset类生成图像容器

下一步是为图像和标签构建一个容器对象。需要构建该对象的原因是为了使我们将数据加载到深度学习模型的任务变得更容易。因此,我们可以使用索引来访问图像及其标签。

为了创建对象,我们可以使用torch.utils.data库里一个名为Dataset的类。这个类是一个抽象类,因为它由尚未实现的函数或方法组成。因此,我们可以根据自己的需要来实现这些功能。

我们需要实现的函数是:

  • __init__函数,
  • __len__函数
  • __getitem__ 函数.

函数将从类初始化一个对象,并从用户那里收集参数。函数将返回数据集的长度。最后,最重要的函数是使用索引返回数据。

通过理解类及其相应的函数,现在我们可以实现代码了。在本例中,我将使用名为PathologyPlantsDataset的类名,它将从Dataset类继承函数。代码如下:

classPathologyPlantsDataset(Dataset):"""该类将充当数据集的容器。"""def__init__(self,data_frame,root_dir,transform=None):self.data_frame=data_frameself.root_dir=root_dirself.transform=transformdef__len__(self):#返回数据集的长度returnlen(self.data_frame)def__getitem__(self,idx):#根据索引返回结果.例如,dataset[0]将返回数据集中的第一个元素,在本例中是图像和标签。iftorch.is_tensor(idx):idx=idx.tolist()img_name=os.path.join(self.root_dir,self.data_frame.iloc[idx,1])image=Image.open(img_name)label=self.data_frame.iloc[idx,-1]ifself.transform:image=self.transform(image)return(image,label)

创建了类之后,现在可以构建对象了。创建对象时,我们将设置由数据集、根目录和转换函数组成的参数。代码如下:

#实例化对象pathology_train=PathologyPlantsDataset(data_frame=train_part,root_dir=path+'images',transform=transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])]))

现在,我们可以使用对象提取图像及其标签。如上所述,为了从数据中获取观察值,我们可以使用索引。

例如,当我们要访问数据集的第三行(索引为2)时,可以使用pathology_train[2]来访问它。

向你展示如何使用pathology_train变量可视化结果。代码如下:

temp_img,temp_lab=pathology_train[2]plt.imshow(temp_img.numpy().transpose((1,2,0)))plt.title(label_names[temp_lab])plt.axis('off')plt.show()

结果:

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
科普:女人“羞羞”时,可以承受多粗的“武器”?

科普:女人“羞羞”时,可以承受多粗的“武器”?

喜马拉雅主播暮霭
2024-06-20 08:55:00
原省委书记编段子妄议中央反腐,最后怎么处理的?

原省委书记编段子妄议中央反腐,最后怎么处理的?

我是娱有理
2024-06-21 07:18:21
带枪却没敢开火,被海警缴枪的菲特种兵,为何连肢体反抗都不敢?

带枪却没敢开火,被海警缴枪的菲特种兵,为何连肢体反抗都不敢?

看度时政观望
2024-06-19 16:39:43
宁波顶薪太诱人,辽宁核心挡不住,要走了

宁波顶薪太诱人,辽宁核心挡不住,要走了

体育篮球弟
2024-06-21 06:00:02
黄一鸣还原细节,王思聪对怀孕不知情,希望女儿继承王思聪财产

黄一鸣还原细节,王思聪对怀孕不知情,希望女儿继承王思聪财产

萌神木木
2024-06-19 17:50:47
《玫瑰的故事》:酒精中毒之后,方协文为什么突然同意离婚了?

《玫瑰的故事》:酒精中毒之后,方协文为什么突然同意离婚了?

烟花五月下苏州
2024-06-20 23:47:42
人民币兑俄罗斯卢布大跌,市场担忧人民币受西方制裁

人民币兑俄罗斯卢布大跌,市场担忧人民币受西方制裁

蓝色海边
2024-06-20 21:36:41
男人“羞羞”为什么冲刺几下特别重?完事还要顶两下

男人“羞羞”为什么冲刺几下特别重?完事还要顶两下

水白头
2024-06-17 00:15:02
叫嚣有“外交豁免权”的大妈,掀开了特权阶层的底裤

叫嚣有“外交豁免权”的大妈,掀开了特权阶层的底裤

观风者
2024-06-19 08:44:32
雷霆换来卡鲁索获评高分A!亚历山大明年冲冠更有底气了?

雷霆换来卡鲁索获评高分A!亚历山大明年冲冠更有底气了?

罗说NBA
2024-06-21 10:35:35
笑死了!方协文太讨厌,赵丽颖出手怒怼林更新,网友笑到肚子疼!

笑死了!方协文太讨厌,赵丽颖出手怒怼林更新,网友笑到肚子疼!

皖声微言
2024-06-20 15:51:42
2134名女性,0感染!艾滋病预防药传出大消息,只需半年注射一次,药厂股价应声暴涨

2134名女性,0感染!艾滋病预防药传出大消息,只需半年注射一次,药厂股价应声暴涨

每日经济新闻
2024-06-21 07:48:04
国际足联正式上诉!预计国足18强对手将在重赛中存变数!

国际足联正式上诉!预计国足18强对手将在重赛中存变数!

人生趣事悟语
2024-06-20 15:49:39
99.99%认为姜萍成绩是假的?还有幕后主使?达摩院回应

99.99%认为姜萍成绩是假的?还有幕后主使?达摩院回应

三月柳
2024-06-20 22:45:18
揭底!余琦身世背景不容小觑,网友:怪不得连道歉都有底气

揭底!余琦身世背景不容小觑,网友:怪不得连道歉都有底气

记录生活日常阿蜴
2024-06-20 10:43:38
7万人见证!梅球王美洲杯揭幕战,球票狂赚1880万,卫冕并不难

7万人见证!梅球王美洲杯揭幕战,球票狂赚1880万,卫冕并不难

祥谈体育
2024-06-20 10:52:34
超级读秒绝平!约维奇拯救塞尔维亚,破580天球荒,英格兰或受益

超级读秒绝平!约维奇拯救塞尔维亚,破580天球荒,英格兰或受益

奥拜尔
2024-06-20 23:05:51
医生提醒:过了65岁的人,宁愿一周不洗澡,也不要随便做这4事

医生提醒:过了65岁的人,宁愿一周不洗澡,也不要随便做这4事

今日养生之道
2024-06-19 19:50:37
雷军骑单车上班引热议:英国品牌Brmopton!网友:本来还想整个雷总同款呢,一看“小布”卖1.5万

雷军骑单车上班引热议:英国品牌Brmopton!网友:本来还想整个雷总同款呢,一看“小布”卖1.5万

和讯网
2024-06-20 14:49:00
离谱!复旦大学毕业生打老师后续:本人直言打错人了,已申请退学

离谱!复旦大学毕业生打老师后续:本人直言打错人了,已申请退学

180°视角
2024-06-20 11:52:52
2024-06-21 11:04:49
科技常识
科技常识
享受创造的过程,体会更高技术
353文章数 104990关注度
往期回顾 全部

科技要闻

美媒:苹果正与百度阿里百川等谈AI合作

头条要闻

环球:欧盟若对华抡起贸易大棒 中国不会被动挨打

头条要闻

环球:欧盟若对华抡起贸易大棒 中国不会被动挨打

体育要闻

1-0"吊打"意大利 西班牙这就叫冠军相?

娱乐要闻

陈晓惹争议!被曝婚变离家出走冷暴力

财经要闻

普华永道,引火烧身

汽车要闻

售价11.79-14.39万元 新一代哈弗H6正式上市

态度原创

数码
教育
艺术
健康
公开课

数码要闻

全球VR头显市场表现疲软 苹果Vision Pro都带不动

教育要闻

一手拿画笔,一手带娃,当画画成为全职妈妈的“出口”

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

晚餐不吃or吃七分饱,哪种更减肥?

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版