当前位置:   article > 正文

pytorch学习笔记1-Dataset类代码实战_python dataset

python dataset

本人在b站上学习PyTorch深度学习快速入门教程以及python学习中所做的笔记,教程链接在末尾。

dataset数据集中主要获得数据(比如图片)、标签等,还有数据集总数。

准备工作:

蜜蜂蚂蚁数据集:

https://download.pytorch.org/tutorial/hymenoptera_data.zip

把要制作的数据集移动到当前项目中:

右键点击图片,选择复制路径,上面的absolute是绝对路径,下面path from content root是相对路径。在一个工程文件中最好使用相对路径,部署和移植不容易出错。

注意使用转义字符,或者直接在引号前加r。

复制相对路径的话是正斜杠/,就不需要前面防转义了。

(复制绝对路径时因为原字符串中有\会使发生转义,所以要防止转义,可以用r""防止转义也可以用两个\\,如下图所示。)

写一个类用来获取图片的地址和label:

  1. from torch.utils.data import Dataset
  2. from PIL import Image
  3. import os
  4. class MyData(Dataset):
  5. def __init__(self, root_dir, label_dir):
  6. self.root_dir = root_dir # "dataset/train",用self方法相当于创建全局变量
  7. self.label_dir = label_dir # "ants"
  8. self.path = os.path.join(root_dir, label_dir) # 把地址拼接起来,"dataset/train\\ants"
  9. self.img_path = os.listdir(self.path) # 获得所选路径所有的label,储存在列表里,这里是所有图片名称
  10. def __getitem__(self, idx):
  11. img_name = self.img_path[idx]
  12. img_item_path = os.path.join(self.root_dir, self.label_dir, img_name) # 每个图片对应的相对路径
  13. img = Image.open(img_item_path) # 只是保持文件打开,在对图像进行操作之前不会读取图像数据
  14. label = self.label_dir
  15. return img, label
  16. def __len__(self):
  17. return len(self.img_path)
  18. root_dir = "dataset/train"
  19. ants_label_dir = "ants_image"
  20. bees_label_dir = "bees_image"
  21. ants_dataset = MyData(root_dir, ants_label_dir)
  22. bees_dataset = MyData(root_dir, bees_label_dir)
  23. train_dataset = ants_dataset + bees_dataset
  24. img, label = train_dataset[0]
  25. img.show()

两个需要注意的地方:

  • ___getitem___:可以使用[]索引,如上面代码块中的第31行,在对这个类进行索引时就调用了这个函数,该方法的作用是使这个类可以作为迭代对象访问。

  • __len__:定义该方法后可以直接使用len(实例化对象的类名)输出长度,如果不定义该方法,只能使用len(对象.方法)输出长度。

采用python中的文件操作,给每张图片打标签,存到ants_label和bees_label文件夹中,文件名为对应图片的文件名,后缀为“txt”,内容为ants/bees。

  1. import os
  2. # 创建ants的label
  3. root_dir = "dataset/train"
  4. ants_dir = "ants_image"
  5. ants_img_path = os.listdir(os.path.join(root_dir, ants_dir))
  6. ants_label = ants_dir.split("_")[0]
  7. ants_out_dir = "ants_label"
  8. for i in ants_img_path:
  9. file_name = i.split(".jpg")[0]
  10. # 使用with … as…结构读写文件,就不用使用close关闭文件对象
  11. with open(os.path.join(root_dir, ants_out_dir, "{}.txt".format(file_name)), "w") as f:
  12. #(.write(s)向文件写入一个字符串或字节流(b模式下),不能直接写入数字)
  13. f.write(ants_label)
  14. # 创建bees的label文件
  15. bees_dir = "bees_image"
  16. bees_img_path = os.listdir(os.path.join(root_dir, bees_dir))
  17. bees_label = bees_dir.split("_")[0]
  18. bees_out_dir = "bees_label"
  19. for i in bees_img_path:
  20. bees_file_name = i.split(".jpg")[0]
  21. # 覆盖写模式,文件不存在则创建,存在则完全覆盖源文件。
  22. fo = open(os.path.join(root_dir, bees_out_dir, "{}.txt".format(bees_file_name)), "w")
  23. fo.write(bees_label)
  24. fo.close()

结果:

知识总结:

活用两个函数:dir()和help()

dir()函数的参数是你传入的对象,它会返回对象的属性和方法。比如字符串,当你不记得某个方法的拼写就可以用该函数查询字符串的所有方法。

help()函数可以查看某函数的帮助文档,当你不知道某个函数是干啥的时候可用。

显示帮助文档的方法:

1.打开jupyter notebook(可以在pycharm下面的终端打开jupyter notebook。)

2.pycharm中将光标放在要查看文档的函数上,按住Ctrl+b(或Ctrl+点击),就会打开这个函数。

python中class中的方法

__init__

__init__(self)是类的初始化方法,在实例化后,会自动调用,而不用手动调用,所以一般把属性设置在__init__()里。

__getitem__

凡是在类中定义了这个__getitem__ 方法,那么它的实例对象(假定为p),可以像这样p[key] 取值,当实例对象做p[key] 运算时,会调用类中的方法__getitem__。一般如果想使用索引访问元素时,就可以在类中定义这个方法(__getitem__(self, key) )。

上面第一个代码中img, label = train_dataset[0]就是实例对象train_dataset做索引,这样就调用了类方法中的__getitem__,并返回return值。

PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】:

https://www.bilibili.com/video/BV1hE411t7RN?p=7&vd_source=759a4e59a9e315c4575a2b4d97dfae44

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/455093
推荐阅读
相关标签
  

闽ICP备14008679号