Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在我的模型中使用Pyrotch SSIM损失函数_Python_Deep Learning_Pytorch_Image Segmentation_Ssim - Fatal编程技术网

Python 在我的模型中使用Pyrotch SSIM损失函数

Python 在我的模型中使用Pyrotch SSIM损失函数,python,deep-learning,pytorch,image-segmentation,ssim,Python,Deep Learning,Pytorch,Image Segmentation,Ssim,我正在试用这个SSIM丢失工具进行图像恢复 为了参考作者GitHub上的原始示例代码,我尝试了: model.train() for epo in range(epoch): for i, data in enumerate(trainloader, 0): inputs = data inputs = Variable(inputs) optimizer.zero_grad() inputs = inputs.view(b

我正在试用这个SSIM丢失工具进行图像恢复

为了参考作者GitHub上的原始示例代码,我尝试了:

model.train()
for epo in range(epoch):
    for i, data in enumerate(trainloader, 0):
        inputs = data
        inputs = Variable(inputs)
        optimizer.zero_grad()
        inputs = inputs.view(bs, 1, 128, 128)
        top = model.upward(inputs)
        outputs = model.downward(top, shortcut = True)
        outputs = outputs.view(bs, 1, 128, 128)

        if i % 20 == 0:
            out = outputs[0].view(128, 128).detach().numpy() * 255
            cv2.imwrite("/home/tk/Documents/recover/SSIM/" + str(epo) + "_" + str(i) + "_re.png", out)

        loss = - criterion(inputs, outputs)
        ssim_value = - loss.data.item()
        print (ssim_value)
        loss.backward()
        optimizer.step()
然而,结果并不像我预期的那样。在前10个时代之后,打印的结果图像都是黑色的

loss=-标准(输入,输出)
是作者提出的,但是,对于经典的Pytorch训练代码,这将是
loss=criteria(y_pred,target)
,因此这里应该是
loss=criteria(输入,输出)

但是,我尝试了
loss=criteria(输入、输出)
,但结果仍然相同


有人能分享一些关于如何正确利用SSIM损失的想法吗?谢谢。

作者正试图最大化SSIM值。 对pytorch损失函数和优化器工作的自然理解是减少损失。但SSIM值是质量度量,因此越高越好。因此,作者使用了
loss=-标准(输入、输出)


您可以尝试使用
损耗=1-标准(输入、输出)

如本节所述。


修改代码(max_ssim.py),用于使用


将相似性(越高越好)转换为损失的常用方法是计算
1-相似性(x,y)

要创建此损失,您可以创建一个新的“函数”

def ssim_损失(x,y):
返回1。-ssim(x,y)
或者,如果相似性是一个类(
nn.Module
),您可以重载它以创建一个新的类

SSIMLoss类(SSIM):
def前进(自身、x、y):
返回1。-超级().正向(x,y)
此外,SSIM的实现也比此repo的实现更好。例如,Python包中的一个更快。 该软件包可以与一起安装

pip安装piqa
为了你的问题

从piqa导入SSIM
SSIMLoss类(SSIM):
def前进(自身、x、y):
返回1。-超级().正向(x,y)
criteria=SSIMLoss()#.cuda()如果需要GPU支持
...
损失=标准(x,y)
...

你的标准是什么?“这是可区分的吗?”Shai很抱歉这么晚才回复。标准是我帖子中的pytorch_ssim.ssim()。它是可微的。
import pytorch_ssim
import torch
from torch.autograd import Variable
from torch import optim
import cv2
import numpy as np

npImg1 = cv2.imread("einstein.png")

img1 = torch.from_numpy(np.rollaxis(npImg1, 2)).float().unsqueeze(0)/255.0
img2 = torch.rand(img1.size())

if torch.cuda.is_available():
    img1 = img1.cuda()
    img2 = img2.cuda()


img1 = Variable( img1,  requires_grad=False)
img2 = Variable( img2, requires_grad = True)

print(img1.shape)
print(img2.shape)
# Functional: pytorch_ssim.ssim(img1, img2, window_size = 11, size_average = True)
ssim_value = 1-pytorch_ssim.ssim(img1, img2).item()
print("Initial ssim:", ssim_value)

# Module: pytorch_ssim.SSIM(window_size = 11, size_average = True)
ssim_loss = pytorch_ssim.SSIM()

optimizer = optim.Adam([img2], lr=0.01)

while ssim_value > 0.05:
    optimizer.zero_grad()
    ssim_out = 1-ssim_loss(img1, img2)
    ssim_value = ssim_out.item()
    print(ssim_value)
    ssim_out.backward()
    optimizer.step()
    cv2.imshow('op',np.transpose(img2.cpu().detach().numpy()[0],(1,2,0)))
    cv2.waitKey()