python label与one-hot之间的互相转换方式
label与one-hot之间的互相转换
有时候需要label,比如强化学习的离散动作空间,输出动作索引;有时候需要one-hot,比如训练数据或者输入上一个状态的动作,简单的互相转换还是重要的。
label 转 one-hot
通过 np.eye(action_dims)[actions] 快速生成:
>>> import numpy as np >>> label = [1,2,2,3] >>> np.eye(4)[label] array([[0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]])
one-hot 转label
numpy可以通过 np.argmax(onehot, 1) 实现,pytorch 可以通过 torch.topk(one_hot, 1)[1].squeeze(1) 实现:
>>> import torch >>> onehot array([[0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]]) >>> np.argmax(onehot,1) array([1, 2, 2, 3], dtype=int64) >>> torch.topk(torch.tensor(onehot), 1)[1].squeeze(1) tensor([1, 2, 2, 3])
label:one-hot 与 标量转化
标量 转化为 one-hot 向量
from keras.utils import to_categorical
data = [1, 3, 2, 0, 3, 2, 2, 1, 0, 1]
encoded = to_categorical(data)
print("encoded:", encoded)输出:
encoded: [[0. 1. 0. 0.]
[0. 0. 0. 1.]
[0. 0. 1. 0.]
[1. 0. 0. 0.]
[0. 0. 0. 1.]
[0. 0. 1. 0.]
[0. 0. 1. 0.]
[0. 1. 0. 0.]
[1. 0. 0. 0.]
[0. 1. 0. 0.]]
one-hot向量 转化为 标量
因为一个热向量是一个包含0和1的向量,所以可以这样做:
encoded = np.array([[0, 1, 0, 0],
[0, 0, 0, 1],
[0, 0, 1, 0],
[1, 0, 0, 0],
[0, 0, 0, 1],
[0, 0, 1, 0],
[0, 0, 1, 0],
[0, 1, 0, 0],
[1, 0, 0, 0],
[0, 1, 0, 0]])
data = [np.where(r == 1)[0][0] for r in encoded]
print("data:", data)
输出:
data: [1, 3, 2, 0, 3, 2, 2, 1, 0, 1]
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
python pycharm最新版本激活码(永久有效)附python安装教程
PyCharm是一个多功能的集成开发环境,只需要在pycharm中创建python file就运行python,并且pycharm内置完备的功能,这篇文章给大家介绍python pycharm激活码最新版,需要的朋友跟随小编一起看看吧2020-01-01
python实现上传样本到virustotal并查询扫描信息的方法
这篇文章主要介绍了python实现上传样本到virustotal并查询扫描信息的方法,是比较实用的技巧,需要的朋友可以参考下2014-10-10
Python中列表(List) 的三种遍历(序号和值)方法小结
这篇文章主要介绍了Python中列表(List) 的三种遍历(序号和值)方法小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-05-05
通过 for 循环比较 Python 与 Ruby 的编程区别
这篇文章主要介绍了通过 for 循环比较 Python 与 Ruby 的编程区别,Ruby 与 Python 之间的差异在很大程度上可通过for循环看出本质,下文详细介绍需要的小伙伴可以参考一下2022-05-05


最新评论