【发布时间】:2020-02-24 04:22:30
【问题描述】:
给定以下张量(这是网络的结果 [注意 grad_fn]):
tensor([121., 241., 125., 1., 108., 238., 125., 121., 13., 117., 121., 229.,
161., 13., 0., 202., 161., 121., 121., 0., 121., 121., 242., 125.],
grad_fn=<MvBackward>)
我们将定义为:
xx = torch.tensor([121., 241., 125., 1., 108., 238., 125., 121., 13., 117., 121., 229.,
161., 13., 0., 202., 161., 121., 121., 0., 121., 121., 242., 125.]).requires_grad_(True)
我想定义一个计算每个值出现次数的操作,这样操作将输出以下张量:
tensor([2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 7, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
0, 1, 1])
即有 2 个零,1 个 1,2 个 13,等等……可能值的总数是在上游设置的,但在这个例子中是 243
到目前为止,我已经尝试了以下方法,它们成功地产生了所需的张量,但这样做的方式不允许通过网络计算梯度:
尝试 1
tt = []
for i in range(243):
tt.append((xx == i).unsqueeze(0))
torch.cat(tt,dim=0).sum(dim=1)
尝试 2
tvtensor = torch.tensor([i for i in range(243)]).unsqueeze(1).repeat(1,xx.shape[0]).float().requires_grad_(True)
(xx==tvtensor).sum(dim=1)
编辑:添加尝试
尝试 3
-- 真的没想到这会支持,但我还是想试试看
ll = torch.zeros((1,243))
for x in xx:
ll[0,x.long()] += 1
感谢任何帮助
编辑:根据要求,最终目标如下:
我正在使用一种技术来计算两个时间序列之间的结构相似性。一个是真实的,另一个是生成的。该技术在本文 (https://link.springer.com/chapter/10.1007/978-3-642-02279-1_33) 中进行了概述,其中将时间序列转换为代码字序列,并使用代码字的分布(类似于 NLP 中使用 Bag of Words 的方式)来表示时间系列。当两个信号分布相似时,两个系列被认为是相似的。这就是计数统计张量的用途。
希望能够构建一个损失函数,该函数消耗这个张量并测量真实信号和生成信号之间的距离(时域数据上的欧几里德范数直接不能很好地工作,这种方法要求更好的结果),以便它可以适当地更新生成器。
【问题讨论】:
标签: pytorch counting backpropagation