【问题标题】:only one element tensors can be converted to python scalars只有一个元素张量可以转换为 python 标量
【发布时间】:2021-03-16 20:30:28
【问题描述】:
def Log(A):
    '''
    theta = arccos((tr(A)-1)/2)
    K=1/(2sin(theta))(A-A^T)
    log(A)=theta K
    '''
    theta=torch.acos(torch.tensor((torch.trace(A)-1)/2))
    K=(1/(2*torch.sin(theta)))*(torch.add(A,-torch.transpose(A,0,1)))
    
    return theta*K

def tensor_Log(A):
    blah=[[Log(A[i,j]) for j in range(A.shape[1])] for i in range(A.shape[0])]
    new=torch.tensor(blah)
    
    return new

ValueError: only one element tensors can be converted to Python scalars

在获取我的网络输出的训练期间,上述函数产生以下错误,它在自定义层内被调用,我不知道它引用了什么,有什么想法吗?

【问题讨论】:

  • tensor_LogLog的输入是什么形状?
  • @Ivan tensor_log 是一个 4 张量,而 Log 只是一个矩阵
  • @Ivan 更具体地说 tensor_Log 是 bs x extra dim x 3 x 3 并且 log 接受 3x3 矩阵
  • 好的,究竟哪一行会抛出这个错误?

标签: neural-network pytorch layer


【解决方案1】:

blah 列表理解中的问题是张量列表。

我会通过循环 A.shape[0]A.shape[1] 创建张量的平面列表,然后将所有内容堆叠到一个张量中。

R = torch.stack([Log(A[i,j]) for i in range(A.shape[0]) for j in range(A.shape[1])])

然后您可以使用reshapeview 恢复所需的格式:

R.reshape(A.shape)

【讨论】:

  • 干杯,解决了这个问题。奇怪的是,我在自定义层中使用的另一个函数上使用了相同类型的列表组合,并且没有在那里抛出错误
  • 在这种情况下,Log 已经返回了一个张量,因此您的列表理解变成了torch.tensor 不喜欢接收的张量列表。如果Log 返回了一个标量,它会起作用,也许这就是它在您的其他函数中起作用的原因。我很高兴它有所帮助;)。
猜你喜欢
  • 2020-11-08
  • 2019-02-04
  • 2022-01-12
  • 2022-01-19
  • 2021-03-04
  • 2021-07-23
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多