感知机损失函数(感知器算法的损失函数)

作者:电脑培训网 2024-05-06 22:46:07 850

【损失函数:3】感知损失:PerceptualLoss、总变异损失

损失函数

1.感知损失1.相关介绍1)什么是PerceptualLoss?2)感知损失是如何构建的?3)代码实现2.代码示例2.总变化损失1.相关介绍2.代码示例参考:一、感知损失

感知机损失函数(感知器算法的损失函数)

1.相关介绍

《PerceptualLossesforReal-TimeStyleTransferandSuper-Resolution》感知损失的概念是为了实时超分辨率而提出的任务和风格迁移任务从此被应用到更多领域。图像去雾方向也有很多工作用到了感知损失,所以这里我们就来详细了解一下感知损失是什么以及如何构建结构和知觉损失在记忆中爆炸,然后我直接放弃了,因为设备太垃圾了!)。

1)PerceptualLoss是什么?

对于图像数据,在网络提取特征的过程中,较浅层通常提取边缘、颜色、亮度等低频信息,而网络较深层提取细节等高频信息和纹理。越深的网络层提取一些有判别性的关键特征,也就是说网络层越深,提取的特征越抽象和高级。

感知损失是通过一个固定的网络,分别使用真实图像和网络生成的结果作为其输入,得到对应的输出特征:feature_gt、feature_p,然后使用feature_gt和feature_p构造损失,它近似真实图像和网络生成结果之间的深层信息,即感知信息。与普通的L2损失相比,它可以增强输出特征的详细信息。

可以这样理解:这里的固定网络看成是一个函数f,feature_gt=f(GroundTruth),feature_p=f(Prediciton),我们的目的是最小化feature_gt和feature_p的差异,即最小化feature_gt、feature_p构成感知损失。

2)PerceptualLoss如何构造?

设置固定网络。网络参数是固定的,不会更新。使用真实图像和网络生成结果作为其输入,得到对应的输出特征:feature_gt、feature_p;使用feature_gt和feature_p构造损失;

这里有两点需要注意:

通常生成网络的目标函数不仅仅只有一个感知损失,而是将多个部分损失组合起来得到最终的损失函数,例如:

其中,和作为权衡系数来调整不同损失对总损失函数的重要性。

通常不仅采用固定网络的单层来提取特征,而是采用其网络结构的浅层、深层、更深层中的某些层的组合来提取特征和构造损失。对于真实图像y和生成图像y',定义如下,N表示一个batch中的样本数,表示固定网络的特征提取层,j表示指定的第j个网络层,j表示该层的输出特征:

单层特征提取:

此时,特征提取利用固定网络中多个指定网络层的输出特征来组合并构造损失。例如,VGG16特征提取模块的第3、5、7卷积层的输出特征被累加。

多层组合:

此时特征提取使用固定网络中指定网络层的输出特征来构造损失,例如VGG16的特征提取模块的第三卷积层的输出。

VGG16特征提取模块的结构如下:

原文章中,红框所示的四个激活层的输出用于构造感知损失,对应结构图中红框内的I部分:

3)代码实现

importtorchimporttorch.nnasnnfromtorch.autogradimportVariablefromtorchvision.modelsimportvgg16importwarningswarnings.filterwarnings('ignore')#计算特征提取模块的感知损失defvgg16_loss(feature_module,loss_func,y,y_):out=feature_module(y)out_=feature_module(y_)loss=loss_func(out,out_)returnloss#获取指定的特征提取模块defget_feature_module(layer_index,device=None):vgg=vgg16(ptrained=True,progress=True)。featuresvgg.eval()#冻结vgg.parameters():中parm的参数parm.requires_grad=Falsefeature_module=vgg[0:layer_index+1]feature_module.to(device)returnfeature_module#计算指定组合模块类的感知损失PerceptualLoss(nn.Module):def__init__(self,loss_func,layer_indexs=None,device=None):super(PerceptualLoss,self).__init__()self.creation=loss_funcself.layer_indexs=layer_indexsself.device=devicedefforward(self,y,y_):self.layer_indexs:中索引的损失=0feature_module=get_feature_module(index,self.device)loss+=vgg16_loss(feature_module,self.creation,y,y_)返回损失

使用上述代码构造感知损失时,需要注意:

loss_func是基本损失函数:确定使用哪种方法形成感知损失,例如MSE、MAE。声明PerceptualLoss对象时,需要提前使用loss_func.to(device)来确定损失函数执行操作的设备;layer_indexs必须是一个列表或祖先,指定使用VGG16的哪个网络层输出构成感知损失,例如3表示vgg16特征提取模块中第0-3层组成的第一个模块的输出;

2.代码示例

#-*-coding:utf-8-*-#创建时间:2022/9/28#作者:李鹏泽importtorchimporttorch.nnasnnfromtorch.autogradimportVariablefromtorchvision.modelsimportvgg16importwarningswarnings.filterwarnings('ignore')#计算特征提取模块的感知损失defvgg16_loss(feature_module,loss_func,y,y_):out=feature_module(y)out_=feature_module(y_)loss=loss_func(out,out_)returnloss#获取指定的特征提取模块defget_feature_module(layer_index,device=None):vgg=vgg16(ptrained=True,progress=True).featuresvgg.eval()#冻结vgg.parameters()中parm的参数:parm.requires_grad=Falsefeature_module=vgg[0:layer_index+1]feature_module.to(device)returnfeature_module#计算规范组合模块类的感知损失PerceptualLoss(nn.Module):def__init__(self,loss_func,layer_indexs=None,device=None):super(PerceptualLoss,self).__init__()self.creation=loss_funcself.layer_indexs=layer_indexsself.device=devicedefforward(self,y,y_):loss=0for索引self.layer_indexs:feature_module=get_feature_module(index,self.device)loss+=vgg16_loss(feature_module,self.creation,y,y_)returnlossif__name__=='__main__':device=torch.device('cuda'iftorch.cuda.is_available()else'cpu')x=torch.ones((1,3,256,256))y=torch.zeros((1,3,256,256))x,y=x.to(设备),y.to(设备)layer_indexs=[3,8,15,22]#基础损失函数:确定使用哪种方法感知损失,如MSE、MAEloss_func=nn.MSELoss().to(device)#感知损失创建=PerceptualLoss(loss_func,layer_indexs,device)perceptual_loss=creation(x,y)打印

张量

二、总变分损失

1.相关介绍

1)TVLoss代表TotalVariationLoss,它计算输入图像的总变化。TVLoss常作为正则项出现在整体函数中来约束网络学习,可以有效促进网络输出结果的空间平滑性。在数字图像处理中,其定义通常如下:

上面的公式仅适用于单个图像。xi,j表示输入图像中的一个像素。公式的含义是:计算每个像素点xi,j在水平方向和垂直方向的关系。H)下一个紧邻像素xi,j-1和xi+1,j之差的平方,然后对所有像素取平方根并将其相加。

2)代码实现

def_tensor_size(t):返回t.size()[1]*t.size()[2]*t.size()[3]deftv_loss(x):h_x=x.size()[2]w_x=x.size()[3]count_h=_tensor_size(x[:1:])count_w=_tensor_size(x[:1:])h_tv=torch.pow((x[:1:]-x[:h_x-1,]),2).sum()w_tv=torch.pow((x[:1:]-x[:w_x-1]),2).sum()return2*(h_tv/count_h+w_tv/count_w)classTV_Loss(nn.Module):def__init__(self,TVLoss_weight=1):super(TV_Loss,self).__init__()self.TVLoss_weight=TVLoss_weightdefforward(self,x):batch_size=x.shape[0]returnself.TVLoss_weight*tv_loss(x)/batch_size

2.代码示例

导入torchimporttorch.nn作为nnfromtorchvision导入transforms导入numpy作为npimportosimporttime导入pathlib从matplotlib导入pyplot作为plt导入警告np.set_printoptions(threshold=np.inf)warnings.filterwarnings(action='ignore')def_tensor_size(t)第:章)[3]count_h=_tensor_size(x[:1:])count_w=_tensor_size(x[:1:])h_tv=torch.pow((x[:1:第333章60]-x[:h_x-1,]),2).sum()w_tv=torch.pow((x[:1:]-x[:w_x-1]),2).sum()return2*(h_tv/count_h+w_tv/count_w)classTV_Loss(nn.Module):def__init__(self,TVLoss_weight=1):super(TV_Loss,self).__init__()self.TVLoss_weight=TVLoss_weightdefforward(self,x):batch_size=x.shape[0]returnself.TVLoss_weight*tv_loss(x)/batch_sizedevice=torch.device('cuda'iftorch.cuda.is_available()else'cpu')x=torch.randint(10,size=(1,1,3,3))x=x.to(device)print(x)creation=TV_Loss().to(device)loss=creation(x)打印

张量

参考:

1)

2)

免责声明:以上内容如有错误,欢迎大家共同讨论!

相关推荐

  • 培训机构被注销的损失,培训机构被注销的损失怎么算

    培训机构被注销的损失,培训机构被注销的损失怎么算

    大家好,今天小编关注到一个比较有意思的话题,就是关于培训机构被注销的损失的问题,于是小编就整理了4个相关介绍培训机构被注销的损失的解答,让我们一起看看吧。培训机…

    培训机构被注销的损失,培训机构被注销的损失怎么算 2024-10-12 14:06:17
  • 培训机构学习linux,培训班linux

    培训机构学习linux,培训班linux

    大家好,今天小编关注到一个比较有意思的话题,就是关于培训机构学习linux的问题,于是小编就整理了3个相关介绍培训机构学习linux的解答,让我们一起看看吧。l…

    培训机构学习linux,培训班linux 2024-10-01 03:26:19
  • 校外培训机构停课损失,校外培训机构停课损失谁承担

    校外培训机构停课损失,校外培训机构停课损失谁承担

    大家好,今天小编关注到一个比较有意思的话题,就是关于校外培训机构停课损失的问题,于是小编就整理了4个相关介绍校外培训机构停课损失的解答,让我们一起看看吧。学校停…

    校外培训机构停课损失,校外培训机构停课损失谁承担 2024-09-13 14:26:03
  • 云计算培训linux机构,linux云计算培训班价格

    云计算培训linux机构,linux云计算培训班价格

    大家好,今天小编关注到一个比较有意思的话题,就是关于云计算培训linux机构的问题,于是小编就整理了3个相关介绍云计算培训linux机构的解答,让我们一起看看吧…

    云计算培训linux机构,linux云计算培训班价格 2024-06-18 20:06:54
  • 以色列印度培训机构,以色列christina培训

    以色列印度培训机构,以色列christina培训

    大家好,今天小编关注到一个比较有意思的话题,就是关于以色列印度培训机构的问题,于是小编就整理了4个相关介绍以色列印度培训机构的解答,让我们一起看看吧。亚训有哪些…

    以色列印度培训机构,以色列christina培训 2024-06-07 07:44:05
热门推荐

猜你喜欢