首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >输入图像的小波二维散射变换

输入图像的小波二维散射变换
EN

Stack Overflow用户
提问于 2019-10-16 06:28:26
回答 1查看 259关注 0票数 0

我正在尝试对输入图像进行2D散射变换。当我运行下面的代码时,我得到这个错误:“过滤器不兼容乘法!”有谁能帮帮忙吗?谢谢!

代码语言:javascript
运行
复制
import torch
from kymatio import Scattering2D
import numpy as np
import PIL
from PIL import Image

FILENAME = "add a png file path"
image = PIL.Image.open(FILENAME).convert("L")

a = np.array(image).astype(np.float32)
x = torch.from_numpy(a)
imageSize=x.shape

scattering = Scattering2D(J=2, shape=imageSize, L=8)
Sx = scattering.forward(x)

print(Sx.size()) 
EN

Stack Overflow用户

发布于 2019-10-19 13:35:57

对于宽度和高度相等的小1KB .png (正方形,而不是矩形),似乎可以正常工作:

代码语言:javascript
运行
复制
import torch
from kymatio import Scattering2D
import numpy as np
import PIL
from PIL import Image

FILENAME = "/path/to/dir/small_size_1_KB.png"
image = PIL.Image.open(FILENAME).convert("L")

a = np.array(image).astype(np.float64)
x = torch.from_numpy(a)
imageSize = x.shape

scattering = Scattering2D(J=2, shape=imageSize, L=8)

Sx = scattering.forward(x)

print(Sx.size())

输出

代码语言:javascript
运行
复制
torch.Size([81, 19, 19])

你得到的错误是在这个方法(backend_torch.py)中,应该与张量大小有关:

代码语言:javascript
运行
复制
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)

来源

https://github.com/edouardoyallon/pyscatwave/blob/master/scatwave/utils.py

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58403385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档