一,常用工具

dir():解析目录结构
help():说明使用方法

尝试解析torch

  1. 使用dir解析torch目录结构
  2. 下拉发现torch中有一个cuda,可以尝试再解析cuda
  3. cuda中有一个is_available,继续进行解析
  4. 当解析到全是双下划线的内容时,即代表这是一个方法,可以使用help查看使用方式
  5. 从返回内容可知,该函数返回一个bool类型,表示cuda是否可用。

二,Pycharm与Jupyter对比

  1. Pycharm中的python文件是一次性运行所有代码
  2. Pycharm中的python console是每一行运行一次
  3. Jupyter是以自主分块为单位进行运行的
    综上而言:
    python文件是一个通用的方式,适用于大型项目。
    python控制台可以一行一行的调试,可以显示每个变量的属性。
    而Jupyter可以分块进行调试,代码阅读性相对较高。

三,PyTorch加载数据

Dataset:提供方式获取数据及其label,即将可用数据从一堆杂乱数据中提取出来
Dataloader:为后面的网络提供不同的数据形式,打包

1. Dataset

主要功能:

  1. 获取每一个数据及其label __getitem__
  2. 计算总共有多少数据 __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() #显示图片

jupyter性能比python性能差吗_深度学习


图片显示成功,dataset实现成功

声明:本人初学,文章仅供回看用,若有语义错误,请友善评论。