实验环境:pytorch1.5 利用pytorch加载自定义数据集时,可利用pytorch自带的Dataset类进行。 只需要继承Dataset类,并实现其中的两个方法即可。
import torch from torch.utils.data import Dataset, DataLoader class MyDataSet(Dataset): def __init__(self): super(MyDataSet, self).__init__() #创建数据集 注意数据集需要tenso格式 self.train_x = [] self.train_y = [] def __getitem__(self, idx): return self.train_x[idx], self.train_y[idx] def __len__(self): return len(self.train_x)然后通过DataLoader类进行迭代即可。 DataLoader支持通过参数batch_size、drop_last和batch_sampler将单个获取的数据样本自动整理成批。
my_dataset = MyDataSet() myloader = DataLoader(my_dataset, batch_size=32,shuffle=True) for e in tqdm(range(epoch)): for x,y in myloader: #对于x,y的shape把控一定要确定,否则会导致广播发生计算错误。 ....pytorch的自动微分: pytorch的自动求导(在此只考虑标量结果值对参数变量求导),默认只会保存叶子结点(通过is_leaf属性判断)的梯度(grad),如果想保存计算图中的中间结点梯度,需要调用相应变量的retain_grad()方法。
叶子结点是由用户直接创建出来的tensor变量,不是依赖其它操作生成的变量(如加减乘除、view等操作)
一个tensor变量的属性requires_grad属性为True时才会计算其导数。此属性需人为指定为True,默认为False。此属性具有传递性,可传递给依赖于它的变量。
注: 分清计算梯度和保存计算的梯度区别。只有计算了才有可能保存。
detach()和data区别: 同: 都是将变量从计算图中分离出来,即操作后的新变量requires_grad值都为False,且都和原始输出共享内存
不同: 一个是方法,一个是属性。detach()是安全的,data不安全,逐渐别废弃。
参考: 在pytorch中对非叶节点的变量计算梯度 Tensor的创建与复制