如何高大上的初始化变量和对矩阵每行求平均

好久没写博客了,去年下半年学雅思和申博,今年这几个月准备毕业论文,手忙脚乱的。

一、按行归一化

直接进正题,最近工作涉及到需要对一个 [s,d] ,大部分是0的矩阵tmp每行求每个值的平均(即归一化)
最开始想到的是
np.mean(H,1)
但它是把每行求成一个值了,得到的是[s,1],而我需要得到的仍是[s,d]
后来我用了个笨办法,先求每行的和的一个向量cout[s,1]
然后扩展成[s,d]
最后相除。。。

tmp = torch.mm(self.H2, Mq)  # [s,d]
cout = np.sum(self.avr, 1).reshape(-1, 1) # [s,1]
weight = torch.tensor(np.tile(cout, self.hidden_dim)).to(self.device)
res = tmp / weight  # [s,d] 

后来我发现可以用F.normalize实现

res = F.normalize(tmp.float(), p=1, dim=0)

其中p=1代表第一范式,即求平均,p=2代表第二范式,即求std标准差,描述各数据偏离平均数的距离的平均数
这里我用到的是p=1
这里给个示例

x = torch.tensor([0,1,0,2])
print(F.normalize(x.float(), p=1, dim=0))

输出是:tensor([0.0000, 0.3333, 0.0000, 0.6667])

二、简易初始化

这也是我最近学到的,以前我初始化一个q维度的表示

Q_embedding = nn.Embedding(q + 1, hidden_dim)
a = torch.tensor(range(1, q + 1)).to(self.device)
Eq = Q_embedding(a)  # [q,d]

现在可以一行解决,就是用Q_embedding.weight,毕竟之前的方法也是为了拿出nn.Embedding中各个位置的权重

Q_embedding = nn.Embedding(q, hidden_dim)
Eq = Q_embedding.weight  # [q,d]

有一个需要注意的点就是nn.Embedding不需要q+1了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值