One-hot function in PyTorch

One-hot function implementation in PyTorch


Method1: use scatter_ function

labels = [0, 1, 4, 7, 3, 2]
one_hot = torch.zeros(6, 8).scatter_(dim = 1, index = labels, value = 1)

Method2: use index_select() funtion

labels = [0, 1, 4, 7, 3, 2]
index = torch.eye(8)
one_hot = torch.index_select(index, dim = 0, index = labels)

Method3: use Embedding module

emb = nn.Embedding(8, 8)
emb.weight.data = torch.eye(8)

then we can get

emb(Variable(torch.LongTensor([1, 2], [3, 4])))
Variable containing:
(0,.,.) = 
0 1 0 0 0 0 0 0 
0 0 1 0 0 0 0 0
(1 ,.,.) =
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0

Method4: create a module

class One_Hot(nn.Module):
    def __init__(self, depth):
        super(One_Hot,self).__init__()
        self.depth = depth
        self.ones = torch.sparse.torch.eye(depth)
    def forward(self, X_in):
        X_in = X_in.long()
        return Variable(self.ones.index_select(0,X_in.data))
    def __repr__(self):
        return self.__class__.__name__ + "({})".format(self.depth)
### PyTorch 语法教程及示例 #### 加法运算中的广播机制 在 PyTorch 中,当执行加法操作时,如果两个张量的形状不完全匹配,则会触发广播机制。例如,在以下代码中,`a` 的形状为 `(3, 4)` 而 `b` 的形状为 `(4,)`。通过广播机制,`b` 将被扩展到与 `a` 形状一致的形式后再进行逐元素相加。 ```python import torch a = torch.rand(3, 4) # 随机生成 (3, 4) 大小的 Tensor b = torch.rand(4) # 随机生成 (4,) 大小的 Tensor c1 = a + b # 广播后的加法 c2 = torch.add(a, b) # 等价于 c1 print(c1.shape, c2.shape) # 输出均为 (3, 4) print(torch.all(torch.eq(c1, c2))) # 判断两种实现是否相同 ``` 上述代码展示了如何利用广播机制完成不同形状张量之间的加法操作[^1]。 --- #### 自定义函数的应用 (`apply`) PyTorch 提供了一种灵活的方式来应用自定义的操作逻辑——即通过继承 `torch.autograd.Function` 来创建新的前向和反向传播方法,并将其应用于张量上。下面是一个简单的例子: 假设我们需要实现一个指数激活函数并对其进行梯度计算,可以按照如下方式编写代码: ```python class Exp(torch.autograd.Function): @staticmethod def forward(ctx, i): result = i.exp() ctx.save_for_backward(result) return result @staticmethod def backward(ctx, grad_output): result, = ctx.saved_tensors return grad_output * result x = torch.tensor([2.0], requires_grad=True) y = Exp.apply(x) # 使用 apply 方法调用自定义函数 z = y ** 2 # 对结果进一步处理 z.backward() print(x.grad) # 计算得到 x 的梯度 ``` 这段代码说明了如何通过重写 `forward` 和 `backward` 函数来自定义一个新的神经网络层或操作符,并借助 `.apply()` 方法将其实现[^2]。 --- #### One-Hot 编码简介及其局限性 One-hot 编码是一种常见的离散特征表示形式,尤其适合分类变量的数据预处理阶段。然而需要注意的是,这种编码方式存在一些固有的缺陷,比如无法很好地捕捉词语间的相似关系以及随着类别数增加而变得稀疏等问题。具体而言,对于具有 n 种可能取值的属性来说,one-hot 向量将会拥有 n 维空间大小;尽管如此,由于其仅有一个位置标记为 1 其余皆为零的特点决定了它难以表达更深层次的语言学含义[^3]。 虽然 one-hot 编码简单易懂且易于实现,但在实际项目开发过程中往往会被其他更加高效的词嵌入技术所取代,如 Word2Vec 或 GloVe 等高级模型。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值