pytorch随机采样操作SubsetRandomSampler()


Posted in Python onJuly 07, 2020

这篇文章记录一个采样器都随机地从原始的数据集中抽样数据。抽样数据采用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线程数

以上这篇pytorch随机采样操作SubsetRandomSampler()就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
Collatz 序列、逗号代码、字符图网格实例
Jun 22 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
Sep 18 Python
import的本质解析
Oct 30 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
Python3.6.0+opencv3.3.0人脸检测示例
May 25 Python
tensorflow 输出权重到csv或txt的实例
Jun 14 Python
python3解析库BeautifulSoup4的安装配置与基本用法
Jun 26 Python
Python装饰器简单用法实例小结
Dec 03 Python
Python玩转PDF的各种骚操作
May 06 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
python collections模块的使用
Oct 16 Python
pytorch加载自己的图像数据集实例
Jul 07 #Python
keras实现VGG16 CIFAR10数据集方式
Jul 07 #Python
使用darknet框架的imagenet数据分类预训练操作
Jul 07 #Python
Python调用C语言程序方法解析
Jul 07 #Python
keras实现VGG16方式(预测一张图片)
Jul 07 #Python
通过实例解析Python RPC实现原理及方法
Jul 07 #Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 #Python
You might like
长波知识介绍
2021/03/01 无线电
php结合飞信 免费天气预报短信
2009/05/07 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
jQuery EasyUI API 中文文档 - NumberBox数字框
2011/10/13 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
2014/10/29 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
AngularJS基础 ng-focus 指令简单示例
2016/08/01 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
python生成指定长度的随机数密码
2014/01/23 Python
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
使用Python对Excel进行读写操作
2017/03/30 Python
多版本Python共存的配置方法
2017/05/22 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
python多线程实现代码(模拟银行服务操作流程)
2020/01/13 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
工作说明书范文
2014/05/07 职场文书
关于环保的标语
2014/06/13 职场文书
财务务虚会发言材料
2014/10/20 职场文书
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python
docker 制作mysql镜像并自动安装
2022/05/20 Servers
python数字图像处理:图像简单滤波
2022/06/28 Python