Python 输入图像的小波二维散射变换
我正在尝试对输入图像进行2D散射变换。当我运行下面的代码时,我得到了这个错误:“过滤器不兼容乘法!”。有人能帮忙吗? 塔克斯Python 输入图像的小波二维散射变换,python,numpy,torch,wavelet,wavelet-transform,Python,Numpy,Torch,Wavelet,Wavelet Transform,我正在尝试对输入图像进行2D散射变换。当我运行下面的代码时,我得到了这个错误:“过滤器不兼容乘法!”。有人能帮忙吗? 塔克斯 对于具有相同宽度和高度(正方形,而非矩形)的1KB.png小屏幕,似乎工作正常: 输出 但是,您在该方法中遇到的错误(backend\u torch.py)应该与张量大小有关: def cdgmm(A, B, inplace=False): """ Complex pointwise multiplication between (batched)
对于具有相同宽度和高度(正方形,而非矩形)的1KB
.png
小屏幕,似乎工作正常:
输出
但是,您在该方法中遇到的错误(backend\u torch.py
)应该与张量大小有关:
def cdgmm(A, B, inplace=False):
"""
Complex pointwise multiplication between (batched) tensor A and tensor B.
Parameters
----------
A : tensor
input tensor with size (B, C, M, N, 2)
B : tensor
B is a complex tensor of size (M, N, 2)
inplace : boolean, optional
if set to True, all the operations are performed inplace
Returns
-------
C : tensor
output tensor of size (B, C, M, N, 2) such that:
C[b, c, m, n, :] = A[b, c, m, n, :] * B[m, n, :]
"""
A, B = A.contiguous(), B.contiguous()
if A.size()[-3:] != B.size():
raise RuntimeError('The filters are not compatible for multiplication!')
if not iscomplex(A) or not iscomplex(B):
raise TypeError('The input, filter and output should be complex')
if B.ndimension() != 3:
raise RuntimeError('The filters must be simply a complex array!')
if type(A) is not type(B):
raise RuntimeError('A and B should be same type!')
C = A.new(A.size())
A_r = A[..., 0].contiguous().view(-1, A.size(-2)*A.size(-3))
A_i = A[..., 1].contiguous().view(-1, A.size(-2)*A.size(-3))
B_r = B[...,0].contiguous().view(B.size(-2)*B.size(-3)).unsqueeze(0).expand_as(A_i)
B_i = B[..., 1].contiguous().view(B.size(-2)*B.size(-3)).unsqueeze(0).expand_as(A_r)
C[..., 0].view(-1, C.size(-2)*C.size(-3))[:] = A_r * B_r - A_i * B_i
C[..., 1].view(-1, C.size(-2)*C.size(-3))[:] = A_r * B_i + A_i * B_r
return C if not inplace else A.copy_(C)
来源
对于宽度和高度相等(正方形,而不是矩形)的1KB
.png
来说,似乎工作正常:
输出
但是,您在该方法中遇到的错误(backend\u torch.py
)应该与张量大小有关:
def cdgmm(A, B, inplace=False):
"""
Complex pointwise multiplication between (batched) tensor A and tensor B.
Parameters
----------
A : tensor
input tensor with size (B, C, M, N, 2)
B : tensor
B is a complex tensor of size (M, N, 2)
inplace : boolean, optional
if set to True, all the operations are performed inplace
Returns
-------
C : tensor
output tensor of size (B, C, M, N, 2) such that:
C[b, c, m, n, :] = A[b, c, m, n, :] * B[m, n, :]
"""
A, B = A.contiguous(), B.contiguous()
if A.size()[-3:] != B.size():
raise RuntimeError('The filters are not compatible for multiplication!')
if not iscomplex(A) or not iscomplex(B):
raise TypeError('The input, filter and output should be complex')
if B.ndimension() != 3:
raise RuntimeError('The filters must be simply a complex array!')
if type(A) is not type(B):
raise RuntimeError('A and B should be same type!')
C = A.new(A.size())
A_r = A[..., 0].contiguous().view(-1, A.size(-2)*A.size(-3))
A_i = A[..., 1].contiguous().view(-1, A.size(-2)*A.size(-3))
B_r = B[...,0].contiguous().view(B.size(-2)*B.size(-3)).unsqueeze(0).expand_as(A_i)
B_i = B[..., 1].contiguous().view(B.size(-2)*B.size(-3)).unsqueeze(0).expand_as(A_r)
C[..., 0].view(-1, C.size(-2)*C.size(-3))[:] = A_r * B_r - A_i * B_i
C[..., 1].view(-1, C.size(-2)*C.size(-3))[:] = A_r * B_i + A_i * B_r
return C if not inplace else A.copy_(C)
来源
torch.Size([81, 19, 19])
def cdgmm(A, B, inplace=False):
"""
Complex pointwise multiplication between (batched) tensor A and tensor B.
Parameters
----------
A : tensor
input tensor with size (B, C, M, N, 2)
B : tensor
B is a complex tensor of size (M, N, 2)
inplace : boolean, optional
if set to True, all the operations are performed inplace
Returns
-------
C : tensor
output tensor of size (B, C, M, N, 2) such that:
C[b, c, m, n, :] = A[b, c, m, n, :] * B[m, n, :]
"""
A, B = A.contiguous(), B.contiguous()
if A.size()[-3:] != B.size():
raise RuntimeError('The filters are not compatible for multiplication!')
if not iscomplex(A) or not iscomplex(B):
raise TypeError('The input, filter and output should be complex')
if B.ndimension() != 3:
raise RuntimeError('The filters must be simply a complex array!')
if type(A) is not type(B):
raise RuntimeError('A and B should be same type!')
C = A.new(A.size())
A_r = A[..., 0].contiguous().view(-1, A.size(-2)*A.size(-3))
A_i = A[..., 1].contiguous().view(-1, A.size(-2)*A.size(-3))
B_r = B[...,0].contiguous().view(B.size(-2)*B.size(-3)).unsqueeze(0).expand_as(A_i)
B_i = B[..., 1].contiguous().view(B.size(-2)*B.size(-3)).unsqueeze(0).expand_as(A_r)
C[..., 0].view(-1, C.size(-2)*C.size(-3))[:] = A_r * B_r - A_i * B_i
C[..., 1].view(-1, C.size(-2)*C.size(-3))[:] = A_r * B_i + A_i * B_r
return C if not inplace else A.copy_(C)