开发者

python label与one-hot之间的互相转换方式

开发者 https://www.devze.com 2023-02-01 09:40 出处:网络 作者: 强殖装甲凯普
目录label与one-hot之间的互相转换label 转 one-hotone-hot 转labellabel:one-hot 与 标量转化标量 转化为 one-hot 向量one-hot向量 转化为 标量总结label与one-hot之间的互相转换
目录
  • label与one-hot之间的互相转换
    • label 转 one-hot
    • one-hot 转label
  • label:one-hot 与 标量转化
    • 标量 转化为 one-hot 向量
    • one-hot向量 转化为 标量
  • 总结

    label与one-hot之间的互相转换

    有时候需要label,比如强化学习的离散动作空间,输出动作索引;有时候需要one-hot,比如训练数据或开发者_JAVA入门者输入上一个状态的动作,简单的互相转换还是重要的。

    label 转 one-hot

    通过 np.jseye(action_dims)[actions] 快速生成:

    >>> import numpy as np
    >>> labandroidel = [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)[python1].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],
        js      [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]

    总结

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

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号