Python 在我的模型中使用Pyrotch SSIM损失函数
我正在试用这个SSIM丢失工具进行图像恢复 为了参考作者GitHub上的原始示例代码,我尝试了: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
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()