- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章解决pytorch读取自制数据集出现过的问题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
问题描述:
TypeError: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'PIL.Image.Image'> 。
解决方式 。
数据格式不对, 把image转成tensor,参数transform进行如下设置就可以了:transform=transform.ToTensor()。注意检测一下transform 。
问题描述:
TypeError: append() takes exactly one argument (2 given) 。
出现问题的地方 。
imgs.append(words[0], int(words[1]))
解决方式 。
加括号,如下 。
imgs.append((words[0], int(words[1])))
问题描述 。
RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same 。
解决方式 。
数据和模型不在同一设备上,应该要么都在GPU运行,要么都在CPU 。
问题描述 。
RuntimeError: Given groups=1, weight of size [64, 1, 3, 3], expected input[1, 3, 512, 512] to have 1 channels, but got 3 channels instead 。
解决方式 。
图像竟然是RGB,但我的训练图像是一通道的灰度图,所以得想办法把 mode 转换成灰度图L 。
补充:神经网络 pytorch 数据集读取(自动读取数据集,手动读取自己的数据) 。
对于pytorch,我们有现成的包装好的数据集可以使用,也可以自己创建自己的数据集,大致来说有三种方法,这其中用到的两个包是datasets和DataLoader 。
datasets:用于将数据和标签打包成数据集 。
DataLoader:用于对数据集的高级处理,比如分组,打乱,处理等,在训练和测试中可以直接使用DataLoader进行处理 。
第一种 现成的打包数据集 。
这种比较简答,只需要现成的几行代码和一个路径就可以完成,但是一般都是常用比如cifar-10 。
对于常用数据集,可以使用torchvision.datasets直接进行读取,这是对其常用的处理,该类也是继承于torch.utils.data.Dataset.
#是第一次运行的话会下载数据集 现成的话可以使用root参数指定数据集位置# 存放的格式如下图 # 根据接口读取默认的CIFAR10数据 进行训练和测试#预处理transform = transform.Compose([transform.ToTensor(), transform.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])#读取数据集trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=False, transform=transform)#打包成DataLoadertrainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=1) #同上testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=False, transform=transform)testloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=False, num_workers=1)classes = (1,2,3,4,5,6,7,8,9,10) #类别定义 #使用 for epoch in range(3): running_loss = 0.0 #清空loss for i, data in enumerate(trainloader, 0): # get the inputs inputs, labels = data #trainloader返回:id,image,labels # 将inputs与labels装进Variable中 inputs, labels = Variable(inputs), Variable(labels) #使用print代替输出 print("epoch:", epoch, "的第", i, "个inputs", inputs.data.size(), "labels", labels.data.size())
这也是一个方便的做法,在pytorch中提供了torchvision.datasets.ImageFolder让我们训练自己的图像.
要求:创建train和test文件夹,每个文件夹下按照类别名字存储图像就可以实现dataloader 。
这里还是拿上个举例子吧,实际上也可以是我们的数据集 。
每个下面的布局是这样的 。
# 预处理transform = transform.Compose([transform.ToTensor(), transform.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) #使用torchvision.datasets.ImageFolder读取数据集 指定train 和 test文件夹img_data = torchvision.datasets.ImageFolder('data/cifar-10/train/', transform=transform)data_loader = torch.utils.data.DataLoader(img_data, batch_size=4, shuffle=True, num_workers=1) testset = torchvision.datasets.ImageFolder('data/cifar-10/test/', transform=transform)testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=True, num_workers=1) for epoch in range(3): for i, data in enumerate(trainloader, 0): # get the inputs inputs, labels = data #trainloader返回:id,image,labels # 将inputs与labels装进Variable中 inputs, labels = Variable(inputs), Variable(labels) #使用print代替输出 print("epoch:", epoch, "的第", i, "个inputs", inputs.data.size(), "labels", labels.data.size())
这个是比较尴尬的,首先我们 。
假设将数存储到txt等文件中,先把他读取出来,读取的部分就不仔细说了,读到一个列表里就可以 。
常用的可以是列表等,举例子 。
trainlist = [] # 保存特征的列表 targetpath = 'a/b/b'filelist = os.listdir(targetpath) #列出文件夹下所有的目录与文件filecount = len(filelist)# 根据根路径 读取所有文件名 循环读取文件内容 添加到listfor i in range(filecount): filepath = os.path.join(targetpath, filelist[j]) with open(filepath, 'r') as f: line = f.readline() # 例如存储格式为 1,2,3,4,5,6 数字之间以逗号隔开 templist = list(map(int, line.split(','))) trainlist.append(templist) # 数据读取完毕 现在为维度为filecount的列表 我们需要转换格式和类型# 将数据转换为Tensor # 假如我们的两类数据分别存在list0 和 list1中split = len(list0) # 用于记录标签的分界 #使用numpy.array 和 torch.from_numpy 连续将其转换为tensor 使用torch.cat拼接train0_numpy = numpy.array(list0)train1_numpy = numpy.array(list1)train_tensor = torch.cat([torch.from_numpy(train0_numpy), torch.from_numpytrain1_numpy)], 0)#现在的尺寸是【样本数,长度】 然而在使用神 经网络处理一维数据要求【样本数,维度,长度】# 这个维度指的像一个图像实际上是一个二维矩阵 但是有三个RGB通道 实际就为【3,行,列】 那么需要处理三个矩阵# 我们需要在我们的数据中加上这个维度信息# 注意类型要一样 可以转换shaper = train_tensor.shape #获取维度 【样本数,长度】aa = torch.ones((shaper[0], 1, shaper[1])) # 生成目标矩阵for i in range(shaper[0]): # 将所有样本复制到新矩阵· aa[i][0][:] = train_tensor[i][:]train_tensor = aa # 完成了数据集的转换 【样本数,维度,长度】 # 注 意 如果是读取的图像 我们需要的目标维度是【样本数,维度,size_w,size_h】# 卷积接受的输入是这样的四维度 最后的两个是图像的尺寸 维度表示是通道数量 # 下面是生成标签 标签注意类别之间的分界 split已经在上文计算出来# 训练标签的total = len(list0) + len(list1)train_label = numpy.zeros(total)train_label[split+1:total] = 1train_label_tensor = torch.from_numpy(train_label).int()# print(train_tensor.size(),train_label_tensor.size()) # 搭建dataloader完毕train_dataset = TensorDataset(train_tensor, train_label_tensor)train_loader = DataLoader(dataset=train_dataset, batch_size=4, shuffle=True) for epoch in range(3): for i, data in enumerate(trainloader, 0): # get the inputs inputs, labels = data #trainloader返回:id,image,labels # 将inputs与labels装进Variable中 inputs, labels = Variable(inputs), Variable(labels) #使用print代替输出 print("epoch:", epoch, "的第", i, "个inputs", inputs.data.size(), "labels", labels.data.size())
该方法需要略微的麻烦一些,首先你有一个txt,保存了文件名和对应的标签,大概是这个意思 。
然后我们在程序中,根据给定的根目录找到文件,并将标签对应保存 。
class Dataset(object):"""An abstract class representing a Dataset.All other datasets should subclass it. All subclasses should override``__len__``, that provides the size of the dataset, and ``__getitem__``,supporting integer indexing in range from 0 to len(self) exclusive."""def __getitem__(self, index): raise NotImplementedErrordef __len__(self): raise NotImplementedErrordef __add__(self, other): return ConcatDataset([self, other])
这是dataset的原本内容,getitem就是获取元素的部分,用于返回对应index的数据和标签。那么大概需要做的是我们将txt的内容读取进来,使用程序处理标签和数据 。
# coding: utf-8from PIL import Imagefrom torch.utils.data import Datasetclass MyDataset(Dataset):# 初始化读取txt 可以设定变换def __init__(self, txt_path, transform = None, target_transform = None): fh = open(txt_path, 'r') imgs = [] for line in fh: line = line.rstrip() words = line.split() # 保存列表 其中有图像的数据 和标签 imgs.append((words[0], int(words[1]))) self.imgs = imgs self.transform = transform self.target_transform = target_transformdef __getitem__(self, index): fn, label = self.imgs[index] img = Image.open(fn).convert('RGB') if self.transform is not None: img = self.transform(img) # 返回图像和标签 return img, labeldef __len__(self): return len(self.imgs) # 当然也可以创建myImageFloder 其txt格式在下图显示 import osimport torchimport torch.utils.data as datafrom PIL import Image def default_loader(path): return Image.open(path).convert('RGB') class myImageFloder(data.Dataset): def __init__(self, root, label, transform = None, target_transform=None, loader=default_loader): fh = open(label) #打开label文件 c=0 imgs=[] # 保存图像的列表 class_names=[] for line in fh.readlines(): #读取每一行数据 if c==0: class_names=[n.strip() for n in line.rstrip().split(' ')] else: cls = line.split() #分割为列表 fn = cls.pop(0) #弹出最上的一个 if os.path.isfile(os.path.join(root, fn)): # 组合路径名 读取图像 imgs.append((fn, tuple([float(v) for v in cls]))) #添加到列表 c=c+1 # 设置信息 self.root = root self.imgs = imgs self.classes = class_names self.transform = transform self.target_transform = target_transform self.loader = loader def __getitem__(self, index): # 获取图像 给定序号 fn, label = self.imgs[index] #读取图像的内容和对应的label img = self.loader(os.path.join(self.root, fn)) if self.transform is not None: # 是否变换 img = self.transform(img) return img, torch.Tensor(label) # 返回图像和label def __len__(self): return len(self.imgs) def getName(self): return self.classes#
# 而后使用的时候就可以正常的使用trainset = MyDataset(txt_path=pathFile,transform = None, target_transform = None)# trainset = torch.utils.data.DataLoader(myFloder.myImageFloder(root = "../data/testImages/images", label = "../data/testImages/test_images.txt", transform = mytransform ), batch_size= 2, shuffle= False, num_workers= 2)trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True, num_workers=8)
它的要点是,继承dataset,在初始化中处理txt文本数据,保存对应的数据,并实现对应的功能.
这其中的原理就是如此,但是注意可能有些许略微不恰当的地方,可能就需要到时候现场调试了.
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/qq_35407318/article/details/107327370 。
最后此篇关于解决pytorch读取自制数据集出现过的问题的文章就讲到这里了,如果你想了解更多关于解决pytorch读取自制数据集出现过的问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!