一,常用工具
dir():解析目录结构
help():说明使用方法
尝试解析torch
- 使用dir解析torch目录结构
- 下拉发现torch中有一个cuda,可以尝试再解析cuda
- cuda中有一个is_available,继续进行解析
- 当解析到全是双下划线的内容时,即代表这是一个方法,可以使用help查看使用方式
- 从返回内容可知,该函数返回一个bool类型,表示cuda是否可用。
二,Pycharm与Jupyter对比
- Pycharm中的python文件是一次性运行所有代码
- Pycharm中的python console是每一行运行一次
- Jupyter是以自主分块为单位进行运行的
综上而言:
python文件是一个通用的方式,适用于大型项目。
python控制台可以一行一行的调试,可以显示每个变量的属性。
而Jupyter可以分块进行调试,代码阅读性相对较高。
三,PyTorch加载数据
Dataset:提供方式获取数据及其label,即将可用数据从一堆杂乱数据中提取出来
Dataloader:为后面的网络提供不同的数据形式,打包
1. Dataset
主要功能:
- 获取每一个数据及其label
__getitem__
- 计算总共有多少数据
__len__
使用:
首先查看Dataset的使用方法:
help(Dataset)
An abstract class representing a :class:`Dataset`.
|
| All datasets that represent a map from keys to data samples should subclass
| it. All subclasses should overwrite :meth:`__getitem__`, supporting fetching a
| data sample for a given key. Subclasses could also optionally overwrite
| :meth:`__len__`, which is expected to return the size of the dataset by many
| :class:`~torch.utils.data.Sampler` implementations and the default options
| of :class:`~torch.utils.data.DataLoader`.
由上可知,Dataset是一个抽象类,需要继承才能使用,且有两个需要实现的方法 ‘__getitem__
‘和’__len__
’
了解了使用方法,就去实践一下
首先自己建立一个dataset
from torch.utils.data import Dataset
from PIL import Image #进行图片操作:显示图片
import os #此处用于拼接路径
class MyData(Dataset): #继承Dataset类
# 初始化函数,主要为后面的函数提供一些全局变量,就是相当于java的构造方法,通过这个方式创建了实例之后,就可以直接使用创建实例时传入的方法
def __init__(self,root_dir,label_dir):# 传递数据路径,由于继承了Dataset类,故可以自动生成数据集
# self可以将函数里的变量变为全局变量,方便全局调用
self.root_dir = root_dir
self.label_dir = label_dir
self.path = os.path.join(self.root_dir,self.label_dir) # 拼接某个类的数据路径
self.dataset_img = os.listdir(self.path)# 获取图片列表,listdir的功能是将参数对应路径上的所有数据返回,形成数据集
def __getitem__(self, item): # 获取任意样本对(x:y),参数item会作为样本的编号
img_name = self.dataset_img[item] # 根据item编号来获取图片列表中的任意样本名字
img_item_path = os.path.join(self.path,img_name) # 将路径和名称拼接
img = Image.open(img_item_path) # x,获取图片
label = self.label_dir # y,label为图片的类别ants
return img,label # 返回样本对x,y
def __len__(self): #返回数据集的长度
return len(self.dataset_img)
注意一下,上面这个类的目的,就是为了将某一堆数据,转化为一个你想要的数据集而已,__init__
的作用是为后面的函数提供要用到的变量,__getitem__
的作用就是获取数据集的样本对,__len__
的作用就是获取数据集的长度
再测试一下dataset是否创建成功
# 定义数据集路径
root_dir = "dataset\train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir,ants_label_dir) #创建实例
bees_dataset = MyData(root_dir,bees_label_dir)
train_dataset = ants_dataset + bees_dataset # 拼接两个数据集
image,label = ants_dataset.__getitem__(34) ##取第34个样本对
# 上面的写法可以写作:image,label = ants_dataset[34]
image.show() #显示图片
图片显示成功,dataset实现成功
声明:本人初学,文章仅供回看用,若有语义错误,请友善评论。