20天吃pytorch 1-2 图片数据建模流程遇到问题及分析

学习内容:

1-2 图片数据建模流程

如下
1、 datasets.ImageFolder图片数据加载,然后送入Dataloader做一个数据管道
2、 nn.Module基类构建自定义模型
3、 模型训练步骤
4、 模型训练评估


遇到问题与解决方案:

  1. 实例化datasets.ImageFolder类后,为什么可以对其进行遍历,对其遍历的结果为什么是img和label?

因为它继承了DatasetFolder,这个父类中__getitem__方法返回结果是 (sample, target) where target is class_index of the target class.。因此可以直接遍历,对于给定传入的数据,sample是图像数据,target就是它的标签

  1. 把一个[3,32,32]的图像送入模型,产生错误Expected 4-dimensional input for 4-dimensional weight [32, 3, 3, 3], but got 3-dimensional input of size [3, 32, 32] instead

是因为缺少了batch_size这个维度,conv2d中必须要加入batchsize这个维度,才可以正常进行卷积操作。出现这个失误是因为没看清示例代码,忘了把ImageFolder实例化后的数据送到DataLoader中,所以没有batchsize这个维度。解决方法就是把开始处理的数据接着送入DataLoader中即可。

  1. ValueError: Only one class present in y_true. ROC AUC score is not defined in that case.
self.metric_func = lambda y_pred,y_true: roc_auc_score(y_true.data.numpy(), y_pred.data.numpy())

在这里y_true.data的类别只有一个。原因有2点

  1. 在取数据的时候,batchsize=1,模型前向传播得到了一个数,这个标签也是一个数,因此就造成了类别只有1个的现象。解决方法,在Dataloader中增大Batchsize。
  2. 数据分布有问题,数据集排列的很有规律,前面很多数据的标签的标签是1,后边很多数据的标签是0。因此要在Dataloader中进行修改shuffle=True,将数据打乱
    DataLoader(dl_valid,batch_size=batchsize,shuffle=True,num_workers=0)
  3. 修改了batchsize仍然报错,那就再加大batchsize
  4. 还报错,就try…一下,处理异常
  1. 下面的代码有问题
model.optimizer = torch.optim.SGD(model.parameters(),lr = 0.01)
model.loss_func = torch.nn.BCELoss()
model.metric_func = lambda y_pred,y_true: roc_auc_score(y_true.data.numpy(),y_pred.data.numpy())
model.metric_name = "auc"

这几个属性没在模型中定义,应在model所属的类中定义这些属性,而不是实例化后这样定义属性


你可能感兴趣的:(深度学习,pytorch,学习,深度学习)