scale of Laplace to satisfy the constraint GreaterThan(lower_bound=0.0)

先说最终解决办法:降低cudatoolkit、pytorch版本。 详细解决过程如下:

一直都是在cuda9.0, pytorch1.1.0的环境里跑模型,最近换了新服务器、不支持这么低版本的cuda了,只好安装cuda 11.6.0 pytorch3.8.0的环境。不料在运行到第194行时出现了以下bug:

File "。。/python3.8/site-packages/torch/distributions/distribution.py", line 55, in __init__ raise ValueError( ValueError: Expected parameter scale (Tensor of shape (128, 8, 8)) of distribution Laplace(loc: torch.Size([128, 8, 8]), scale: torch.Size([128, 8, 8])) to satisfy the constraint GreaterThan(lower_bound=0.0), but found invalid values: tensor(。。。

bug是说torch.distributions.laplace.Laplace这个输入scale必须是≥0的,这个条件是毋庸置疑的。但是奇怪在,我在scale生成的时候已经用了torch.abs() 对scale的范围进行规范了,如下所示
所以实在想不通,torch.abs()的输出为何不满足这个条件。。。。。
无奈之下只好手动在torch.abs()之后再+1e-9.。。。确实在几个模型里解决了上述bug,但还是觉得治标不治本。。。
于是,就决定要彻底避免这个bug,只好试着重新安装稍微低一点的cuda版本。果然,在cuda11.0的环境下,这个bug消失了。。。。。。。。。。。

血泪教训:环境尽量保持不变。。。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是将三个函数合并成一个函数的代码: ```python def add_noisy_image(image_path, output_path, epsilon=0.3, k=50): # 读取图片并调整大小 image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) image = cv2.resize(image, (128, 128), interpolation=cv2.INTER_LINEAR) # 对图片添加噪声 f = np.fft.fft2(image) fshift = np.fft.fftshift(f) rows, cols = image.shape FIM = fshift FIM_k = FIM[:k, :k] delta_f = np.max(np.sqrt(np.real(FIM[:k, :k]) ** 2 + np.imag(FIM[:k, :k]) ** 2)) - np.min(np.sqrt(np.real(FIM[:k, :k]) ** 2 + np.imag(FIM[:k, :k]) ** 2)) c = delta_f / epsilon d = delta_f * math.sqrt(2 * math.log(1.2 / 0.1)) / epsilon sensitivity = np.abs(FIM_k) / np.sqrt(epsilon) sensitivity2 = np.abs(FIM) / np.sqrt(epsilon) scale = sensitivity2 / epsilon b = d * scale p = 0.5 noise = np.random.laplace(scale=b, size=(rows, cols)) + np.mean(f) * p image_noise = fshift + noise f_ishift = np.fft.ifftshift(image_noise) image_back = np.fft.ifft2(f_ishift) image_back = np.real(image_back) # 调整大小并保存图片 im = cv2.resize(image_back, (47, 62), interpolation=cv2.INTER_LINEAR) image_back = np.uint8(im) cv2.imwrite(output_path, image_back) return image_back ``` 这个函数接收三个参数:输入图片路径、输出图片路径、epsilon 和 k。其中,epsilon 和 k 用于调整噪声的强度和频率范围。在函数内部,首先读取输入图片并调整大小,然后对图片进行处理生成噪声图像。最后,将生成的噪声图像调整大小并保存到指定路径,返回生成的噪声图像。 使用这个函数时,可以像下面这样调用: ```python add_noisy_image('image.jpg', 'face_privacy.jpg', epsilon=0.3, k=50) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值