OSV_q 编写散度算子div和拉普拉斯踩的坑

 为了编写图像矩阵的拉普拉斯,需要用到散度算子
一开始开始复制别人的代码

def divergence(x, y):
     divx = x - np.roll(x, 1, axis=1)
     divy = y - np.roll(y, 1, axis=-1)
     div = divx + divy
     return div

报错: 因为不支持Tensor和list类型的除法操作
# loss1 = miu2 * mse(u1, f1 - dive + b2)    # 因为不支持Tensor和list类型的除法操作
# loss1 = torch.optim.Adam(f1 - dive + b2, lr=0.1)      #  l2正则化

报错: 因为不支持Tensor和Add类型的除法操作

用最原始的方法写拉普拉斯了

zxx, zxy = getGrd(zx)
zyx, zyy = getGrd(zy)
dive = zxx + zyy
。。。。。。。

虽然有了其他的新错误,继续前进

报错:

dive1 = zxx + zyy
RuntimeError: The size of tensor a (320) must match the size of tensor b (318) at non-singleton dimension 3

可能是做了两次梯度,维度不一致了,选择给梯度的边界补零:

def getGrd(data_in):
    # [m, n] = data_in.shape
    # data_in1 = torch.Tensor(np.pad(data_in, ((0, 0), (0, 0), (0, 0), (0, 0)), 'edge'))
    grd_x = data_in.clone()
    grd_y = data_in.clone()
    grd_x = grd_x[:, :, 0:-1, :] - data_in[:, :, 1:, :]
    # grd_x = torch.Tensor(np.pad(grd_x, ((0, 0), (0, 0), (0, 1), (0, 0)), "constant"))  # 补零
    grd_y = grd_y[:, :, :, 0:-1] - data_in[:, :, :, 1:]
    # grd_y = torch.Tensor(np.pad(grd_y, ((0, 0), (0, 0), (0, 0), (0, 1)), "constant"))
# 补零
    grd = (grd_x, grd_y)
    return grd
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值