当前位置:   article > 正文

[pytorch]小土堆课程笔记P6-P7:_img_item_path = os.path.join(self.root_dir, self.l

img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)

这两节课的题目分别是:

P6:PyTorch加载数据初认识

P7:Dataset类代码实战

首先放上课程代码:

main.py

  1. """
  2. @Author : 时礼
  3. @Contact : 15538193274@163.com
  4. @Software : pycharm
  5. @File : MyData.py
  6. @Desc : 小土堆课程P6的笔记
  7. """
  8. from torch.utils.data import Dataset
  9. from PIL import Image
  10. #python中关于系统的一个库
  11. import os
  12. class MyData():
  13. #注意:这里定义的初始化函数是init不是int
  14. def __init__(self,root_dir,label_dir):
  15. #使用self相当于创建了一个类中的全局变量
  16. #存储根目录地址
  17. self.root_dir=root_dir
  18. #存储存图片的文件夹的名称
  19. self.label_dir=label_dir
  20. #可以将两个路径合并
  21. #得到图片的实际
  22. self.path=os.path.join(self.root_dir,self.label_dir)
  23. #获得指定路径下的文件列表(文件及其下标)
  24. self.img_path=os.listdir(self.path)
  25. def __getitem__(self, idx):
  26. img_name=self.img_path[idx]
  27. img_item_path=os.path.join(self.path,img_name)
  28. img=Image.open(img_item_path)
  29. label=self.label_dir
  30. #所以这个return是返回了一个图片和存储图片的文件夹的名称?
  31. return img,label
  32. def __len__(self):
  33. return len(self.img_path)
  34. #注意,在服务器里复制到的路径还需要在前面加上一个/
  35. root_dir = "/mnt/pycharmWorkspace1/pyCharmProject1/dataSet/train"
  36. ants_label_dir = "ants_image"
  37. #antsDataset = MyData(root_dir, ants_label_dir)
  38. """
  39. root_dir="/mnt/pycharmWorkspace1/pyCharmProject1/dataSet/train"
  40. ants_label_dir="ants_image"
  41. /mnt/pycharmWorkspace1/pyCharmProject1/dataSet/train/ants_image
  42. antsDataset=MyData(root_dir,ants_label_dir)
  43. bees_laber_dir = "bees"
  44. #可以将几个小的数据集进行拼接
  45. trainDataset=antsDataset+beesDataset
  46. #pycharm中整行复制的快捷键:ctrl+d
  47. beesDataset=MyData(root_dir,ants_label_dir)
  48. #查询数据长度的两种方式(起码在console里可以使用)
  49. len(antsDataset)
  50. antsDataset.__len__()位置
  51. """

博主没有学过python,但毕竟是面向对象的语言,本节课的主要内容就相当于是定义了一个class,然后实例化(创建对象)。

注意:

1、上文中没有注释的是定义的class,注释的是利用这个class来进行数据读取的代码,其中用到的数据集为:https://download.pytorch.org/tutorial/hymenoptera_data.zip 

2、小土堆的在定义class的时候用的是:

class MyData(Dataset):

这样写的话在python console里可以运行,但如果直接写到main.py然后运行的话就会报错:

MyData is not found 我是上网上找了一个简单的不会报错的test.py文件,然后一点一点的将MyData里的代码放到这个test文件中,终于发现了如果将class的定义改成:

class MyData():

就不会再报错了。

3、这里讲一下我的实现方法,我将这个class代码单独放到了MyData.py中,然后通过main.py import MyData。这里又发生了一些问题(其实本质问题还是没有系统学过python,对python的一些操作不熟悉)。引用的时候报了TypeError: ‘module’ object is not callable的错。

为了解决这个问题,我又尝试了添加如下两行代码:

  1. import sys
  2. sys.path.append('./')

依然报错。而后看了一个文章说可能是因为class名称和python文件名一样,所以造成了报错。更改后还是报错。

最后发现是引用的格式不对,正确格式为:

from dataTest_test import dataTest

 总结一下第三点遇到的情况:

添加的那两行代码应用的情况可能是当编写class的python文件不在工程文件中。并且我发现pycharm有一个比较方便的功能,那就是如果在main.py中引用成功了一个python文件中的class文件,如果将python文件重命名则main中的引用会自动改名,如上一个代码段中的代码更改完python文件名后的代码自动变为:

from dataTest import dataTest

4、创建class时需要注意的事:

(1)在定义init函数的时候注意不要打成int(我刚创建的时候报错了,半天没找到原因)

(2)在创建方法时使用的self相当于是一个整个类中的全局变量,如果在一个方法中使用self.变量名的方法给变量赋值,则这个变量可以在别的方法中读取。

5、当需要读取工程文件的地址时,可以使用FTP工具,不过在读取之后需要在前面加一个/表示从根目录开始。

6、使用到的技巧(如数据拼接,一会删)

(1)当需要将两个地址拼接时可以使用

 self.path=os.path.join(self.root_dir,self.label_dir)

注意:当使用这个方法时需要引入os,代码如下:

import os

(2)如果使用了MyData方法创建了两个dataset,可以直接使用+将两个dataset拼接到一起

  1. antsDataset=MyData(root_dir,ants_label_dir)
  2. antsDataset=MyData(root_dir,bees_label_dir)
  3. trainDataset=antsDataset+beesDataset

(3)查询一个dataset的数据长度的两种方式

        1)

len(antsDataset)

        2)

antsDataset.__len__()

7、本次使用到的pycharm快捷键(mac版)

(1)将一行代码整行复制:command + d

(2)将一行代码整行上下移动:command + shift + 上下键

接下来放下一段代码,用来创建image对应的label:

labelMake.py

  1. """
  2. @Author : rosyForever
  3. @Contact : 15538193274@163.com
  4. @Software : pycharm
  5. @File : labelMake.py
  6. @Desc : 用来生成图片对应的标签文件
  7. """
  8. import os
  9. root_dir = "/mnt/pyCharmProject1/dataSet/train"
  10. target_dir = "bees_image"
  11. #获得图片的文件列表
  12. img_path = os.listdir(os.path.join(root_dir,target_dir))
  13. label = target_dir.split('_')[0]
  14. out_dir = "bees_label"
  15. for i in img_path:
  16. file_name=i.split('.jpg')[0]
  17. with open(os.path.join(root_dir,out_dir,"{}.txt".format(file_name)),'w')as f:
  18. f.write(label)

注意:

刚看到这段代码的时候不知道

label = target_dir.split('_')[0]

为什么最后要加一个[],于是写了一个test代码专门来测试这个方法

  1. """
  2. @Author : rosyForever
  3. @Contact : 15538193274@163.com
  4. @Software : pycharm
  5. @File : labelMake.py
  6. @Time : 2022/10/19 21:22
  7. @Desc : 用来测试split函数的使用以及为什么其后面要加一个[0]。
  8. 得出结论:slip是将字符串以输入到slipt函数中的字符串为分隔符进行分隔,生成
  9. 一个['','']格式的数组,使用[num]可以得到数组其中的一个值。注:如果分隔符
  10. 出现在最后一个,则会在数组最后一个值为空。
  11. """
  12. file_name1="test1.jpg"
  13. file_name2=file_name1.split('.jpg')
  14. file_name3=file_name1.split('.jpg')[0]
  15. print(file_name2)
  16. print(file_name3)
  17. """
  18. 如果不使用[]则得到的是['test1', ''],如果使用[]则得到的时test1
  19. """
  20. file_name4=file_name1.split('.')[0]
  21. file_name5=file_name1.split('.')[1]
  22. file_name6=file_name1.split('.')
  23. print(file_name4)
  24. print(file_name5)
  25. print(file_name6)
  26. """
  27. file_name4的内容是test1
  28. file_name5的内容是jpg
  29. file_name6的内容是['test1', 'jpg']
  30. """

得出结论:slip是将字符串以输入到slipt函数中的字符串为分隔符进行分隔,生成 一个['','']格式的数组,使用[num]可以得到数组其中的一个值。注:如果分隔符 出现在最后一个,则会在数组最后一个值为空。

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

闽ICP备14008679号