为了账号安全,请及时绑定邮箱和手机立即绑定

带有PyTorch的多标签,多类别图像分类器(ConvNet)

带有PyTorch的多标签,多类别图像分类器(ConvNet)

慕雪6442864 2021-03-30 08:11:22
我正在尝试使用PyTorch实现图像分类器(CNN / ConvNet),在这里我想从csv文件中读取标签。我有4个不同的类别,一张图片可能属于多个类别。我已经阅读了PyTorch教程,本斯坦福教程以及本教程,但都没有涉及我的具体情况。我设法建立了torch.utils.data.Dataset该类的自定义函数,该函数对于从csv文件中读取标签(仅适用于二进制分类器)的效果很好。这是torch.utils.data.Dataset我到目前为止所使用的类的代码(与上面链接的第三个教程稍作修改):import torchimport torchvision.transforms as transformsimport torch.utils.data as datafrom PIL import Imageimport numpy as npimport pandas as pdclass MyCustomDataset(data.Dataset):# __init__ function is where the initial logic happens like reading a csv,# assigning transforms etc.def __init__(self, csv_path):    # Transforms    self.random_crop = transforms.RandomCrop(800)    self.to_tensor = transforms.ToTensor()    # Read the csv file    self.data_info = pd.read_csv(csv_path, header=None)    # First column contains the image paths    self.image_arr = np.asarray(self.data_info.iloc[:, 0])    # Second column is the labels    self.label_arr = np.asarray(self.data_info.iloc[:, 1])    # Calculate len    self.data_len = len(self.data_info.index)# __getitem__ function returns the data and labels. This function is# called from dataloader like thisdef __getitem__(self, index):    # Get image name from the pandas df    single_image_name = self.image_arr[index]    # Open image    img_as_img = Image.open(single_image_name)    img_cropped = self.random_crop(img_as_img)    img_as_tensor = self.to_tensor(img_cropped)    # Get label(class) of the image based on the cropped pandas column    single_image_label = self.label_arr[index]    return (img_as_tensor, single_image_label)def __len__(self):    return self.data_len具体来说,我正在尝试从具有以下结构的文件中读取标签:我的具体问题是,我无法弄清楚如何在Dataset班级中实现这一点。我想我在csv中的标签的(手动)分配与PyTorch如何读取它们之间缺少联系,因为我对框架不是很熟悉。我非常感谢您提供有关如何使其正常工作的帮助,或者,如果确实有涉及此方面的示例,那么也将非常感谢您提供链接!
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

也许我失去了一些东西,但如果你想你的列转换1..NN = 4这里)成标签载体或形状(N,)(例如给您的数据。例如,label(img1) = [0, 0, 0, 1]label(img3) = [1, 0, 1, 0],...),为什么不:

  1. 将所有标签列读入self.label_arr

    self.label_arr = np.asarray(self.data_info.iloc[:, 1:]) # columns 1 to N
  2. 相应地返回中的标签__getitem__()(此处不变):

    single_image_label = self.label_arr[index]

为了训练您的分类器,您可以计算例如(N,)预测和目标标签之间的交叉熵。


查看完整回答
反对 回复 2021-04-13
  • 1 回答
  • 0 关注
  • 1116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信