好久没写博客了,去年下半年学雅思和申博,今年这几个月准备毕业论文,手忙脚乱的。
一、按行归一化
直接进正题,最近工作涉及到需要对一个 [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了。