pytorch随机采样操作SubsetRandomSampler()

这篇文章记录一个采样器都随机地从原始的数据集中抽样数据。抽样数据采用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()就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 使用pytorch 筛选出一定范围的值

    我就废话不多说了,大家还是直接看代码吧~ import torch input_tensor = torch.tensor([1,2,3,4,5]) print(input_tensor>3) mask = (input_tensor>3).nonzero() print(mask) print(input_tensor.index_select(0,mask)) tensor([0, 0, 0, 1, 1], dtype=torch.uint8) tensor([3, 4]) tensor(

  • 在Pytorch中使用样本权重(sample_weight)的正确方法

    step: 1.将标签转换为one-hot形式. 2.将每一个one-hot标签中的1改为预设样本权重的值 即可在Pytorch中使用样本权重. eg: 对于单个样本:loss = - Q * log(P),如下: P = [0.1,0.2,0.4,0.3] Q = [0,0,1,0] loss = -Q * np.log(P) 增加样本权重则为loss = - Q * log(P) *sample_weight P = [0.1,0.2,0.4,0.3] Q = [0,0,sample_wei

  • pytorch进行上采样的种类实例

    1.其中再语义分割比较常用的上采样: 其实现方法为: def upconv2x2(in_channels, out_channels, mode='transpose'): if mode == 'transpose': # 这个上采用需要设置其输入通道,输出通道.其中kernel_size.stride # 大小要跟对应下采样设置的值一样大小.这样才可恢复到相同的wh.这里时反卷积操作. return nn.ConvTranspose2d( in_channels, out_channels,

  • pytorch sampler对数据进行采样的实现

    PyTorch中还单独提供了一个sampler模块,用来对数据进行采样.常用的有随机采样器:RandomSampler,当dataloader的shuffle参数为True时,系统会自动调用这个采样器,实现打乱数据.默认的是采用SequentialSampler,它会按顺序一个一个进行采样.这里介绍另外一个很有用的采样方法: WeightedRandomSampler,它会根据每个样本的权重选取数据,在样本比例不均衡的问题中,可用它来进行重采样. 构建WeightedRandomSampler时

  • pytorch随机采样操作SubsetRandomSampler()

    这篇文章记录一个采样器都随机地从原始的数据集中抽样数据.抽样数据采用permutation. 生成任意一个下标重排,从而利用下标来提取dataset中的数据的方法 需要的库 import torch 使用方法 这里以MNIST举例 train_dataset = dsets.MNIST(root='./data', #文件存放路径 train=True, #提取训练集 transform=transforms.ToTensor(), #将图像转化为Tensor download=True) sa

  • Pytorch上下采样函数之F.interpolate数组采样操作详解

    目录 什么是上采样 F.interpolate——数组采样操作 输入: 注意: 补充: 代码案例 一般用法 size与scale_factor的区别:输入序列时 size与scale_factor的区别:输入整数时 align_corners=True与False的区别 扩展: 总结 什么是上采样 上采样,在深度学习框架中,可以简单的理解为任何可以让你的图像变成更高分辨率的技术. 最简单的方式是重采样和插值:将输入图片input image进行rescale到一个想要的尺寸,而且计算每个点的像素

  • Pytorch上下采样函数--interpolate用法

    最近用到了上采样下采样操作,pytorch中使用interpolate可以很轻松的完成 def interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None): r""" 根据给定 size 或 scale_factor,上采样或下采样输入数据input. 当前支持 temporal, spatial 和 volumetric 输入数据的上采样,其shape 分别为:3-

  • Python基于随机采样一至性实现拟合椭圆

    检测这些圆,先找轮廓后通过轮廓点拟合椭圆 import cv2 import numpy as np import matplotlib.pyplot as plt import math from Ransac_Process import RANSAC def lj_img(img): wlj, hlj = img.shape[1], img.shape[0] lj_dis = 7 # 连接白色区域的判定距离 for ilj in range(wlj): for jlj in range(h

  • 使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

    本文介绍了如何在pytorch下搭建AlexNet,使用了两种方法,一种是直接加载预训练模型,并根据自己的需要微调(将最后一层全连接层输出由1000改为10),另一种是手动搭建. 构建模型类的时候需要继承自torch.nn.Module类,要自己重写__ \_\___init__ \_\___方法和正向传递时的forward方法,这里我自己的理解是,搭建网络写在__ \_\___init__ \_\___中,每次正向传递需要计算的部分写在forward中,例如把矩阵压平之类的. 加载预训练ale

  • 简述python&pytorch 随机种子的实现

    随机数广泛应用在科学研究, 但是计算机无法产生真正的随机数, 一般成为伪随机数. 它的产生过程: 给定一个随机种子(一个正整数), 根据随机算法和种子产生随机序列. 给定相同的随机种子, 计算机产生的随机数列是一样的(这也许是伪随机的原因). 随机种子是什么? 随机种子是针对随机方法而言的. 随机方法:常见的随机方法有 生成随机数,以及其他的像 随机排序 之类的,后者本质上也是基于生成随机数来实现的.在深度学习中,比较常用的随机方法的应用有:网络的随机初始化,训练集的随机打乱等. 随机种子的取值

  • 浅析Python中的随机采样和概率分布

    目录 1. random.choice 2. random.choices(有放回) 3. numpy.sample(无放回) 4.rng.choices 和 rng.sample 5. numpy.random.choices 参考文献  Python(包括其包Numpy)中包含了了许多概率算法,包括基础的随机采样以及许多经典的概率分布生成.我们这个系列介绍几个在机器学习中常用的概率函数.先来看最基础的功能--随机采样. 1. random.choice 如果我们只需要从序列里采一个样本(所有

  • Python实现从概率分布中随机采样

    目录 1. 二项(binomial)/伯努利(Bernoulli)分布 2. 多项(multinomial)分布 3.均匀(uniform)分布 4. 狄利克雷(Dirichlet)分布 参考文献 在上一篇博文<Python中的随机采样和概率分布(一)>中,我们介绍了Python中最简单的随机采样函数.接下来我们更进一步,来看看如何从一个概率分布中采样,我们以几个机器学习中最常用的概率分布为例. 1. 二项(binomial)/伯努利(Bernoulli)分布 1.1 概率质量函数(pmf)

  • Python随机采样及概率分布(二)

    目录 1. 二项(binomial)/伯努利(Bernoulli)分布 1.1 概率质量函数(pmf) 1.2 函数原型 1.3 使用样例 2. 多项(multinomial)分布 2.1 概率质量函数(pmf) 2.2 函数原型 2.3 使用样例 3.均匀(uniform)分布 3.1 概率密度函数(pdf) 3.2 函数原型 3.3 使用样例 4. 狄利克雷(Dirichlet)分布 4.1 概率密度函数(pdf) 4.2 函数原型 4.3 使用样例 前言: 之前的<Python中的随机采样

  • Python基于随机采样一至性实现拟合椭圆(优化版)

    上次版本如果在没有找到轮廓或轮廓的点集数很小无法拟合椭圆或在RANSAC中寻找最优解时会死循环中,优化后的代码 import cv2 import os import numpy as np import matplotlib.pyplot as plt import math from Ransac_Process import RANSAC def cul_area(x_mask, y_mask, r_circle, mask): mask_label = mask.copy() num_a

随机推荐