pytorch自定义Dataset
admin
2024-01-17 12:47:54
0

因为需要读取大量数据到神经网络里进行训练,之前一直使用的keras.fit不管用了,后来发现pytorch自带的Dataset和Dataloader能很好的解决这个问题。如果使用tensorflow的话,需要使用tf.data.Dataset.from_tensor_slices().map()方法或者使用队列来解决这个问题,
tensorflow自定义Dataset教程链接:
http://www.51zixue.net/TensorFlow/765.html

在网上找了一些教程,只写了一些基础的代码,没有讲清楚为啥这么写,有些bug也没有提示。
这里写一下我自己的理解:
首先自定义Dataset必须要写一个继承from torch.utils.data import Dataset的类,其中除了init方法以外还有两个方法,__getitem__()和__len__(),可以这么理解:在使用pytorch自带的Dataloader把Dataset包裹起来调用的时候,会认为这个Dataset一共有的数据量就是__len__()的返回值,比如Dataloader的batch参数为8,即一次读取8个数据,它就会产生8个不同的数值,把这些数值作为__getitem__()的参数输入进去调用,然后把返回的每次返回的数据,共8个,打包好来给用户。

其中,get_item()的返回值也没要必须是(一个数据+一个label)的形式,只要有返回值就可以,只不过相对应的,在遍历Dataloader,其实也就是在遍历这些返回值,只要做好相应处理即可

其中我遇到了两个报错是和这部分有关的

ValueError: num_samples should be a positive integer value, but got num_samples=0

这个原因比较简单,就是 __len__(self)返回值是0,导致程序认为不存在样本数量,关注修改这部分即可

第二个:
UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program.

这个报错的原因比较复杂,主要原因就是报错里说的,The given NumPy array is not writeable。我在本地测试正常,但是把程序部署到gpu算力平台上时出现了这个问题,解决方法是在

__getitem__(self, index)

这个函数的返回值里,把原来返回的feature用np.array()包裹,注意feature原本就是numpy数组,这里再调用一次np.array是为了达到copy的效果,从而解决这个问题。

下面附上整段的代码

# 准备pytorch的数据
from torch.utils.data import Dataset, DataLoader
from OSutils import get_data_path, load_jsondata
from ByteSequencesFeature import byte_sequences_feature
from torch.utils.data import DataLoader
import numpy as np
import torchdef data_loader_multilabel(file_path='', label_dict={}):# 用于读取多标签的情况file_md5 = file_path.split('/')[-1]return byte_sequences_feature(file_path), label_dict.get(file_md5)def data_loader(file_path='', label_dict={}):# 用于读取单标签的情况file_md5 = file_path.split('/')[-1]if file_md5 in label_dict:return byte_sequences_feature(file_path), 1else:return byte_sequences_feature(file_path), 0class MalconvDataSet(Dataset):def __init__(self, black_samples_dir="black_samples/", white_samples_dir='white_samples/',label_dict_path='label_dict.json', label_type="single", valid=False, valid_size=0.2, seed=207):self.file_list = get_data_path(black_samples_dir)self.loader = data_loader_multilabelif label_type == "single":self.loader = data_loaderself.file_list += get_data_path(white_samples_dir)if label_type == "predict":self.label_dict = {}self.loader = data_loaderelse:self.label_dict = load_jsondata(label_dict_path)np.random.seed(seed)np.random.shuffle(self.file_list)# 如果是需要测试集,就在原来的基础上分割# 因为设定了随机种子,所以分割的结果是一样的valid_cut = int((1 - valid_size) * len(self.file_list))if valid:self.file_list = self.file_list[valid_cut:]else:self.file_list = self.file_list[:valid_cut]def __getitem__(self, index):file_path = self.file_list[index]feature, label = self.loader(file_path, self.label_dict)return np.array(feature), labeldef __len__(self):return len(self.file_list)

相关内容

热门资讯

专业师傅教你“奔富棋牌到底有挂... 专业师傅教你“奔富棋牌到底有挂吗?其实是有挂(揭秘手机上必赢技巧)是一款可以让一直输的玩家,快速成为...
专业师傅教你“雀神麻将到底有挂... 专业师傅教你“雀神麻将到底有挂吗?其实是有挂(揭秘手机上必赢技巧)一、雀神麻将AI软件牌型概率发牌机...
专业师傅教你“欢乐四喜到底有挂... 您好,欢乐四喜这款游戏可以开挂的,确实是有挂的,需要了解{请加QQ群客服咨询:1075075785}...
热点推荐“红洞王牌到底有没有透... 您好:红洞王牌确实真的有挂,软件请加QQ群客服咨询:1075075785确实是有挂的,很多玩家在这款...
热点推荐“姚记扯旋到底有没有透... 热点推荐“姚记扯旋到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能...
热点推荐“哥哥斗地主到底有没有... 热点推荐“哥哥斗地主到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的...
热点推荐“功夫小熊到底有没有透... 您好:功夫小熊确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发...
热点推荐“相约麻将十三水到底有... 热点推荐“相约麻将十三水到底有没有透视挂吗”原来真的有挂一、相约麻将十三水AI软件牌型概率发牌机制”...
热点推荐“色猫到底有没有透视挂... 您好,色猫这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打牌都...
热点推荐“山西棋牌到底有没有透... 您好:山西棋牌确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发...
热点推荐“神赚棋牌到底有没有透... 亲,神赚棋牌这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,神赚棋牌的开挂软件,名...
热点推荐“盛世娱乐到底有没有透... 热点推荐“盛世娱乐到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7198902获取...
热点推荐“丰城比奖到底有没有透... 热点推荐“丰城比奖到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能...
热点推荐“逍遥阁到底有没有透视... 热点推荐“逍遥阁到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能够...
热点推荐“非非互娱到底有没有透... 热点推荐“非非互娱到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能...
热点推荐“丫丫古诗到底有没有透... 热点推荐“丫丫古诗到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能...
热点推荐“朋友圈到底有没有透视... 热点推荐“朋友圈到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能够...
热点推荐“祥运斗地主到底有没有... 热点推荐“祥运斗地主到底有没有透视挂吗”原来真的有挂一、祥运斗地主AI软件牌型概率发牌机制”必胜“技...
热点推荐“比奇堡到底有没有透视... 您好,比奇堡这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打牌...
热点推荐“四方麻将到底有没有透... 热点推荐“四方麻将到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就能...