pytorch随机采样操作SubsetRandomSampler()
作者:tsz danger 发布时间:2021-05-22 18:00:46
这篇文章记录一个采样器都随机地从原始的数据集中抽样数据。抽样数据采用permutation。 生成任意一个下标重排,从而利用下标来提取dataset中的数据的方法
需要的库
import torch
使用方法
这里以MNIST举例
train_dataset = dsets.MNIST(root='./data', #文件存放路径
train=True, #提取训练集
transform=transforms.ToTensor(), #将图像转化为Tensor
download=True)
sample_size = len(train_dataset)
sampler1 = torch.utils.data.sampler.SubsetRandomSampler(
np.random.choice(range(len(train_dataset)), sample_size))
代码详解
np.random.choice()
#numpy.random.choice(a, size=None, replace=True, p=None)
#从a(只要是ndarray都可以,但必须是一维的)中随机抽取数字,并组成指定大小(size)的数组
#replace:True表示可以取相同数字,False表示不可以取相同数字
#数组p:与数组a相对应,表示取数组a中每个元素的概率,默认为选取每个元素的概率相同。
那么这里就相当于抽取了一个全排列
torch.utils.data.sampler.SubsetRandomSampler
# 会根据后面给的列表从数据集中按照下标取元素
# class torch.utils.data.SubsetRandomSampler(indices):无放回地按照给定的索引列表采样样本元素。
所以就可以了。
补充知识:Pytorch学习之torch----随机抽样、序列化、并行化
1. torch.manual_seed(seed)
说明:设置生成随机数的种子,返回一个torch._C.Generator对象。使用随机数种子之后,生成的随机数是相同的。
参数:
seed(int or long) -- 种子
>>> import torch
>>> torch.manual_seed(1)
<torch._C.Generator object at 0x0000019684586350>
>>> a = torch.rand(2, 3)
>>> a
tensor([[0.7576, 0.2793, 0.4031],
[0.7347, 0.0293, 0.7999]])
>>> torch.manual_seed(1)
<torch._C.Generator object at 0x0000019684586350>
>>> b = torch.rand(2, 3)
>>> b
tensor([[0.7576, 0.2793, 0.4031],
[0.7347, 0.0293, 0.7999]])
>>> a == b
tensor([[1, 1, 1],
[1, 1, 1]], dtype=torch.uint8)
2. torch.initial_seed()
说明:返回生成随机数的原始种子值
>>> torch.manual_seed(4)
<torch._C.Generator object at 0x0000019684586350>
>>> torch.initial_seed()
4
3. torch.get_rng_state()
说明:返回随机生成器状态(ByteTensor)
>>> torch.initial_seed()
4
>>> torch.get_rng_state()
tensor([4, 0, 0, ..., 0, 0, 0], dtype=torch.uint8)
4. torch.set_rng_state()
说明:设定随机生成器状态
参数:
new_state(ByteTensor) -- 期望的状态
5. torch.default_generator
说明:默认的随机生成器。等于<torch._C.Generator object>
6. torch.bernoulli(input, out=None)
说明:从伯努利分布中抽取二元随机数(0或1)。输入张量包含用于抽取二元值的概率。因此,输入中的所有值都必须在[0,1]区间内。输出张量的第i个元素值,将会以输入张量的第i个概率值等于1。返回值将会是与输入相同大小的张量,每个值为0或者1.
参数:
input(Tensor) -- 输入为伯努利分布的概率值
out(Tensor,可选) -- 输出张量
>>> a = torch.Tensor(3, 3).uniform_(0, 1)
>>> a
tensor([[0.5596, 0.5591, 0.0915],
[0.2100, 0.0072, 0.0390],
[0.9929, 0.9131, 0.6186]])
>>> torch.bernoulli(a)
tensor([[0., 1., 0.],
[0., 0., 0.],
[1., 1., 1.]])
7. torch.multinomial(input, num_samples, replacement=False, out=None)
说明:返回一个张量,每行包含从input相应行中定义的多项分布中抽取的num_samples个样本。要求输入input每行的值不需要总和为1,但是必须非负且总和不能为0。当抽取样本时,依次从左到右排列(第一个样本对应第一列)。如果输入input是一个向量,输出out也是一个相同长度num_samples的向量。如果输入input是m行的矩阵,输出out是形如m x n的矩阵。并且如果参数replacement为True,则样本抽取可以重复。否则,一个样本在每行不能被重复。
参数:
input(Tensor) -- 包含概率的张量
num_samples(int) -- 抽取的样本数
replacement(bool) -- 布尔值,决定是否能重复抽取
out(Tensor) -- 结果张量
>>> weights = torch.Tensor([0, 10, 3, 0])
>>> weights
tensor([ 0., 10., 3., 0.])
>>> torch.multinomial(weights, 4, replacement=True)
tensor([1, 1, 1, 1])
8. torch.normal(means, std, out=None)
说明:返回一个张量,包含从给定参数means,std的离散正态分布中抽取随机数。均值means是一个张量,包含每个输出元素相关的正态分布的均值。std是一个张量。包含每个输出元素相关的正态分布的标准差。均值和标准差的形状不须匹配,但每个张量的元素个数必须想听。
参数:
means(Tensor) -- 均值
std(Tensor) -- 标准差
out(Tensor) -- 输出张量
>>> n_data = torch.ones(5, 2)
>>> n_data
tensor([[1., 1.],
[1., 1.],
[1., 1.],
[1., 1.],
[1., 1.]])
>>> x0 = torch.normal(2 * n_data, 1)
>>> x0
tensor([[1.6544, 0.9805],
[2.1114, 2.7113],
[1.0646, 1.9675],
[2.7652, 3.2138],
[1.1204, 2.0293]])
9. torch.save(obj, f, pickle_module=<module 'pickle' from '/home/lzjs/...)
说明:保存一个对象到一个硬盘文件上。
参数:
obj -- 保存对象
f -- 类文件对象或一个保存文件名的字符串
pickle_module -- 用于pickling源数据和对象的模块
pickle_protocol -- 指定pickle protocal可以覆盖默认参数
10. torch.load(f, map_location=None, pickle_module=<module 'pickle' from '/home/lzjs/...)
说明:从磁盘文件中读取一个通过torch.save()保存的对象。torch.load()可通过参数map_location动态地进行内存重映射,使其能从不动设备中读取文件。一般调用时,需两个参数:storage和location tag。返回不同地址中的storage,或者返回None。如果这个参数是字典的话,意味着从文件的地址标记到当前系统的地址标记的映射。
参数:
f -- l类文件对象或一个保存文件名的字符串
map_location -- 一个函数或字典规定如何remap存储位置
pickle_module -- 用于unpickling元数据和对象的模块
torch.load('tensors.pt')
# 加载所有的张量到CPU
torch.load('tensor.pt', map_location=lambda storage, loc:storage)
# 加载张量到GPU
torch.load('tensors.pt', map_location={'cuda:1':'cuda:0'})
11. torch.get_num_threads()
说明:获得用于并行化CPU操作的OpenMP线程数
12. torch.set_num_threads()
说明:设定用于并行化CPU操作的OpenMP线程数
来源:https://blog.csdn.net/weixin_43914889/article/details/104607114


猜你喜欢
- 优化前后新老代码如下:from git_tools.git_tool import get_collect_projects, QQNews
- 这里说的“相对路径”是相对于“主调文件”所在的文件夹。#include file #include file后面跟的是文件的“相对路径”,不
- 最近有朋友问js 如何打印预览,今天就来讲解一下,首先了解一下打印原理,其实局部打印页面很简单。就是把你需要打印的部分做一个起始标记,至于标
- 本文实例讲述了Python实现可获取网易页面所有文本信息的网易网络爬虫功能。分享给大家供大家参考,具体如下:#coding=utf-8#--
- 一、前言提到 limit 优化,大多数 MySQL DBA 都不会陌生,能想到各种应对策略,比如延迟关联,书签式查询等等,之前我也写过一篇优
- 任何一个交互过程的操作,对于用户来说都有学习成本,谁也不能保证所有人都可以准确无误地走完一个流程。交互设计师在设计时应该考虑适时地给用户相应
- 一、基本类型和引用类型基本的数据类型有5个:undefined,boolean,number,string,nulltypeof null;
- 代码很简单,这里就不多BB了,小伙伴们直接看示例吧<!DOCTYPE html PUBLIC "-//W3C//DTD XH
- 前言:现在写爬虫,入门已经不是一件门槛很高的事情了,网上教程一大把,但很多爬虫新手在爬取数据的过程中依旧会遇到这样那样的问题。今天整理了部分
- 如何在ADO中使用SQL函数?代码见下:<%Set conn1 = Server.CreateObjec
- 目的封装轮播图组件,直接使用,具体内容如下大致步骤准备my-carousel组件基础布局,全局注册准备home-banner组件,使用my-
- 因为python是动态语言,变量类型是可变的,所以不管pycharm还是sublime都做不到准确的类型推断。一个比较取巧的做法是asser
- 本文实例主要实现的是使用urllib和BeautifulSoup爬取 * 的词条,具体如下。简洁代码:#引入开发包from urllib.
- 题目描述:给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数样例:给出链表1->2->3->4-&g
- 废话不多说了,直接给大家贴代码了。编写setup.py后$ python setup.py register$ python setup.p
- 引言接口测试就是数据的测试,在测试之前,需要准备好测试数据,而测试数据可以用数据库、excel、txt和csv方式,当然还有一种方式,那就是
- 情感分析(sentiment analysis)是2018年公布的计算机科学技术名词。它可以根据文本内容判断出所代表的含义是积极的还是负面的
- MYSQL TIMESTAMP字段进行时间加减运算在数据分析过程中,想当然地对TIMESTAMP字段进行运算,导致结果谬之千里计算公式如下-
- 我要一大群的类都具有一 * 点,我怎么给他们加上呢?模板模板吗,我从这个模板创建一群类不就OK了?那就需要元类了。霍霍》 定义一个元类(就所一
- windows server 2019安装了SQL2016,启动sql agent代理时候,提示“尚未定义空闲cpu条件 onidle作业计