五、多分类,One-hot

这篇博客深入探讨了多分类问题中的一热编码方法,指出了其空间消耗和效率问题。同时,介绍了softmax函数及其在概率分布计算中的应用。接着,详细讲解了交叉熵损失函数的计算过程,并通过示例展示了如何使用numpy实现。文章最后通过一个实例演示了分类预测与实际标签的误差评估。

1、耗费空间
2、数据量更新起来,效率低
3、遗漏很多重要信息

def one_hot(elements):
    pure = list(set(elements))

    vectors = []
    for e in elements:
        vec = [0] * len(pure)
        vec[pure.index(e)] = 1
        vectors.append(vec)

    return vectors

print(one_hot(["北京", "上海", "南京", "北京", "重庆", "深圳", "广州", "天津"]))

多分类问题

x = [1237, 4512, 7845]
y = [0, 0, 1, 0, 0]  # x 的真实分类,这里选定为第3类
x = np.array(normalize(x))
weights = np.random.random(size=(3, 5))
# print(np.dot(x, weight))  # logits  算子


def softmax(x):
    """处理数据"""
    x = np.array(x)
    x -= np.max(x)  # 防止数据过大
    return np.exp(x) / np.sum(np.exp(x))

# ic(softmax(np.dot(x, weight)))


def cross_entropy(y, yhat):
    """把真实值和预测值对比"""
    return -np.sum(y_i * np.log(yhat_i) for y_i, yhat_i in zip(y, yhat))

print(cross_entropy(y, softmax(np.dot(x, weights))))

### One-Hot 编码在语义分割中的应用 在语义分割任务中,为了实现多分类one-hot编码,通常会针对每个像素点设置多个通道来表示不同的类别。具体来说,在逐像素分类网络中,对像素进行分类时确实使用了one-hot编码[^1]。 #### 方法概述 假设存在一个具有特定尺寸的高度、宽度以及深度(或通道数)的输入张量作为原始标签图(label map),其中每个位置上的数值代表该处所属的目标类别索引。要将其转换成适合训练过程的形式,则需构建一个新的四维张量——即one-hot编码后的版本。新张量的第一维度对应样本数量;第二维度等于总的类别数目加一(考虑到背景类);第三和第四维度则保持原高度与宽度不变。 #### Python代码示例 下面给出一段Python代码片段用于说明如何基于给定的label_map执行上述操作: ```python import torch def label_to_onehot(label_map, num_classes): """ 将整型标注映射转化为独热(one-hot)形式 参数: label_map (Tensor): 形状为[N,H,W] 的整型张量, 表达每一张图片上各像素对应的类别编号. num_classes (int): 类别的总数目. 返回值: Tensor: 转化后形状为 [N,C,H,W], C=num_classes+1 的浮点型张量, 其中C轴方向上仅有一个位置为1其余皆为0。 """ N, H, W = label_map.size() # 创建全零张量并调整至适当大小 one_hot = torch.zeros((N, num_classes + 1, H, W), dtype=torch.float) # 使用scatter_函数填充相应的位置 one_hot.scatter_(dim=1, index=label_map.unsqueeze(dim=1).long(), value=1.) return one_hot # 测试用例 if __name__ == "__main__": # 假设我们有两张3x3分辨率的图像数据,共有三种前景物体加上一种背景共四种情况 labels = torch.tensor([[[0, 1, 2], [3, 0, 1], [2, 3, 0]], [[1, 2, 3], [0, 1, 2], [3, 0, 1]]]) encoded_labels = label_to_onehot(labels, 3) print(encoded_labels.shape) # 输出应为torch.Size([2, 4, 3, 3]) ``` 此段程序展示了怎样通过`scatter_()`方法高效地完成从常规标签到one-hot向量间的转变工作[^3]。值得注意的是,这里额外引入了一个维度用来容纳所有可能出现的不同种类对象及其背后的环境部分。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值