Pytorch框架之one_hot编码函数解读

 更新时间:2023年02月01日 09:28:42   作者:NULL not error  
这篇文章主要介绍了Pytorch框架之one_hot编码函数解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Pytorch one_hot编码函数解读

one_hot编码定义

在一个给定的向量中,按照设定的最值–可以是向量中包含的最大值(作为最高分类数),有也可以是自定义的最大值,设计one_hot编码的长度:最大值+1【详见举的例子吧】。

然后按照最大值创建一个1*(最大值+1)的维度大小的全零零向量:[0, 0, 0, …] => 共最大值+1对应的个数

接着按照向量中的值,从第0位开始索引,将向量中值对应的位置设置为1,其他保持为0.

eg:

假设设定one_hot长度为4(最大值) –

且当前向量中值为1对应的one_hot编码:

[0, 1, 0, 0]

当前向量中值为2对应的one_hot编码:

[0, 0, 1, 0]

eg:

假设设定one_hot长度为6(等价最大值+1) –

且当前向量中值为4对应的one_hot编码:

[0, 0, 0, 0, 1, 0]

当前向量中值为2对应的one_hot编码:

[0, 0, 1, 0, 0, 0]

eg:

targets = [4, 1, 0, 3] => max_value=4=>one_hot的长度为(4+1)

假设设定one_hot长度为5(最大值) –

且当前向量中值为4对应的one_hot编码:

[0, 0, 0, 0, 1]

当前向量中值为1对应的one_hot编码:

[0, 1, 0, 0, 0]

Pytorch中one_hot转换

import torch

targets = torch.tensor([5, 3, 2, 1])

targets_to_one_hot = torch.nn.functional.one_hot(targets)   # 默认按照targets其中的最大值+1作为one_hot编码的长度
# result: 
# tensor(
# [0, 0, 0, 0, 0, 1],
# [0, 0, 0, 1, 0, 0],
# [0, 0, 1, 0, 0, 0],
# [0, 1, 0, 0, 0, 0]
#)

targets_to_one_hot = torch.nn.functional.one_hot(targets, num_classes=7)  3# 指定one_hot编码长度为7
# result: 
# tensor(
# [0, 0, 0, 0, 0, 1, 0],
# [0, 0, 0, 1, 0, 0, 0],
# [0, 0, 1, 0, 0, 0, 0],
# [0, 1, 0, 0, 0, 0, 0]
#)

总结:one_hot编码主要用于分类时,作为一个类别的编码–方便判别与相关计算;

1. 如同类别数统计,只需要将one_hot编码相加得到一个一维向量就知道了一批数据中所有类别的预测或真实的分布情况;

2. 相比于预测出具体的类别数–43等,用向量可以使用向量相关的算法进行时间上的优化等等

Pytorch变量类型转换及one_hot编码表示

生成张量

y = torch.empty(3, dtype=torch.long).random_(5)

y = torch.Tensor(2,3).random_(10)

y = torch.randn(3,4).random_(10)

查看类型

y.type
y.dtype

类型转化

tensor.long()/int()/float()
long(),int(),float() 实现类型的转化

One_hot编码表示

def one_hot(y):
    '''
    y: (N)的一维tensor,值为每个样本的类别
    out:
        y_onehot: 转换为one_hot 编码格式
    '''
    y = y.view(-1, 1)
    # y_onehot = torch.FloatTensor(3, 5)
    # y_onehot.zero_()

    y_onehot = torch.zeros(3,5)  # 等价于上面
    y_onehot.scatter_(1, y, 1)
    return y_onehot

y = torch.empty(3, dtype=torch.long).random_(5) #标签

res = one_hot(y)  # 转化为One_hot类型

# One_hot类型标签转化为整数型列表的两种方法

h = torch.argmax(res,dim=1)
_,h1 = res.max(dim=1)

expand()函数

这个函数的作用就是对指定的维度进行数值大小的改变。只能改变维大小为1的维,否则就会报错。不改变的维可以传入-1或者原来的数值。

a=torch.randn(1,1,3,768)

print(a.shape) #torch.Size([1, 1, 3, 768])
b=a.expand(2,-1,-1,-1)

print(b.shape) #torch.Size([2, 1, 3, 768])

c=a.expand(2,1,3,768)
print(c.shape) #torch.Size([2, 1, 3, 768])

repeat()函数

沿着指定的维度,对原来的tensor进行数据复制。这个函数和expand()还是有点区别的。expand()只能对维度为1的维进行扩大,而repeat()对所有的维度可以随意操作。

a=torch.randn(2,1,768)
print(a)
print(a.shape) #torch.Size([2, 1, 768])
b=a.repeat(1,2,1)
print(b)
print(b.shape) #torch.Size([2, 2, 768])
c=a.repeat(3,3,3)
print(c)
print(c.shape) #torch.Size([6, 3, 2304])

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Python中文件路径

    详解Python中文件路径

    绝对路径就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件,这篇文章主要介绍了Python中文件路径,需要的朋友可以参考下
    2023-02-02
  • 如何用pandas处理hdf5文件

    如何用pandas处理hdf5文件

    这篇文章主要介绍了如何用pandas处理hdf5文件,帮助大家更好的理解和学习使用python进行数据处理,感兴趣的朋友可以了解下
    2021-03-03
  • Pytorch出现错误Attribute Error:module ‘torch‘ has no attribute '_six'解决

    Pytorch出现错误Attribute Error:module ‘torch‘ has no attrib

    这篇文章主要给大家介绍了关于Pytorch出现错误Attribute Error:module ‘torch‘ has no attribute '_six'解决的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Python实现的自定义多线程多进程类示例

    Python实现的自定义多线程多进程类示例

    这篇文章主要介绍了Python实现的自定义多线程多进程类,结合实例形式分析了Python多线程多进程的相关调用与使用操作技巧,需要的朋友可以参考下
    2018-03-03
  • 完美解决Python 2.7不能正常使用pip install的问题

    完美解决Python 2.7不能正常使用pip install的问题

    今天小编就为大家分享一篇完美解决Python 2.7不能正常使用pip install的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python实现学生信息管理系统源码

    python实现学生信息管理系统源码

    这篇文章主要为大家详细介绍了python实现学生信息管理系统源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • python subprocess.run()、subprocess.Popen()、subprocess.check_output()

    python subprocess.run()、subprocess.Popen()、subprocess.check

    Python的subprocess模块是用于创建和管理子进程的模块,本文主要介绍了python subprocess.run()、subprocess.Popen()、subprocess.check_output(),具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • python中子类继承父类的__init__方法实例

    python中子类继承父类的__init__方法实例

    这篇文章主要给大家详细介绍了python中子类如何继承父类的__init__方法,文中给出了详细的示例代码,相信对大家的理解和学习具有一定参考价值,有需要的朋友们下面来跟着小编一起学习学习吧。
    2016-12-12
  • python中的zip模块

    python中的zip模块

    这篇文章主要介绍了zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile类来操作zip文件,感兴趣的朋友参考如下
    2021-08-08
  • 使用Python开发游戏运行脚本实现模拟点击

    使用Python开发游戏运行脚本实现模拟点击

    这篇文章主要介绍了使用Python开发游戏运行脚本实现模拟点击,这样我们要想实现手游脚本开发的第一步,就是下载Android模拟器,然后在对安卓模拟器进行鼠标和键盘的模拟,以此来实现自动化游戏脚本,需要的朋友可以参考下
    2021-11-11

最新评论