【CNN基础】常见的loss函数及其实现(一)——TV Loss
Total Variation loss
在图像复原过程中,图像上的一点点噪声可能就会对复原的结果产生非常大的影响,因为很多复原算法都会放大噪声。这时候我们就需要在最优化问题的模型中添加一些正则项来保持图像的光滑性,TV loss是常用的一种正则项(注意是正则项,配合其他loss一起使用,约束噪声)。图片中相邻像素值的差异可以通过降低TV loss来一定程度上解决。比如降噪,对抗checkerboard等等。
1. 初始定义
~~~~~~ Rudin等人(Rudin1990)观察到,受噪声污染的图像的总变分比无噪图像的总变分明显的大。 那么最小化TV理论上就可以最小化噪声。图片中相邻像素值的差异可以通过降低TV loss来一定程度上解决。比如降噪,对抗checkerboard等等。总变分定义为梯度幅值的积分:
J T 0 ( u ) = ∫ Ω u ∣ ▽ u ∣ d x d y = ∫ D u u x 2 + u y 2 d x d y J_{T_0}(u)=\int\limits_{\Omega_{u}}|\triangledown_u|dxdy=\int\limits_{D_u}\sqrt{u_x^2+u_y^2}dxdy
J
T
0
(u)=
Ω
u
∫
∣▽
u
∣dxdy=
D
u
∫
u
x
2
+u
y
2
dxdy
~~~~~~ 其中,u x = ∂ u ∂ x u_x=\frac {\partial u}{\partial x}u
x
=
∂x
∂u
,u y = ∂ u ∂ y u_y=\frac {\partial u}{\partial y}u
y
=
∂y
∂u
,D u D_uD
u
是图像的支持域。限制总变分就会限制噪声。
2. 扩展定义
~~~~~~ 带阶数的TV loss 定义如下:
ℜ V β ( f ) = ∫ Ω ( ∂ f ∂ u ( u , v ) 2 + ∂ f ∂ v ( u , v ) 2 ) β 2 \Re _{V^{\beta }}\left ( f\right )=\int_{\Omega }\left ( \frac{\partial f}{\partial u}\left ( u,v \right )^{2}+\frac{\partial f}{\partial v}\left ( u,v \right )^{2} \right )^{\frac{\beta }{2}}
ℜ
V
β
(f)=∫
Ω
(
∂u
∂f
(u,v)
2
+
∂v
∂f
(u,v)
2
)
2
β
~~~~~~ 但是在图像中,连续域的积分就变成了像素离散域中求和,所以可以这么算:
ℜ V β ( x ) = ∑ i , j ( ( x i , j − 1 − x i , j ) 2 + ( x i + 1 , j − x i , j ) 2 ) β 2 \Re _{V^{\beta }}\left ( x\right )=\sum_{i,j}\left (\left ( x_{i,j-1}-x_{i,j}\right )^{2}+\left ( x_{i+1,j}-x_{i,j} \right )^{2} \right )^{\frac{\beta }{2}}
ℜ
V
β
(x)=
i,j
∑
((x
i,j−1
−x
i,j
)
2
+(x
i+1,j
−x
i,j
)
2
)
2
β
~~~~~~ 即:求每一个像素和横向下一个像素的差的平方,加上纵向下一个像素的差的平方。然后开β/2次根。
3. 效果
~~~~~~ The total variation (TV) loss encourages spatial smoothness in the generated image.(总变差(TV)损失促进了生成的图像中的空间平滑性。)根据论文Nonlinear total variation based noise removal algorithms的描述,当β < 1时,会出现下图左侧的小点点的artifact。当β > 1时,图像中小点点会被消除,但是代价就是图像的清晰度。效果图如下:
4. 代码实现
这两种实现都默认β = 2 \beta=2β=2,不支持β \betaβ的调整。
4.1 pytorch
import torch
import torch.nn as nn
from torch.autograd import Variable
class TVLoss(nn.Module):
def __init__(self,TVLoss_weight=1):
super(TVLoss,self).__init__()
self.TVLoss_weight = TVLoss_weight
def forward(self,x):
batch_size = x.size()[0]
h_x = x.size()[2]
w_x = x.size()[3]
count_h = self._tensor_size(x[:,:,1:,:])
count_w = self._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()
return self.TVLoss_weight*2*(h_tv/count_h+w_tv/count_w)/batch_size
def _tensor_size(self,t):
return t.size()[1]*t.size()[2]*t.size()[3]
def main():
# x = Variable(torch.FloatTensor([[[1,2],[2,3]],[[1,2],[2,3]]]).view(1,2,2,2), requires_grad=True)
# x = Variable(torch.FloatTensor([[[3,1],[4,3]],[[3,1],[4,3]]]).view(1,2,2,2), requires_grad=True)
# x = Variable(torch.FloatTensor([[[1,1,1], [2,2,2],[3,3,3]],[[1,1,1], [2,2,2],[3,3,3]]]).view(1, 2, 3, 3), requires_grad=True)
x = Variable(torch.FloatTensor([[[1, 2, 3], [2, 3, 4], [3, 4, 5]], [[1, 2, 3], [2, 3, 4], [3, 4, 5]]]).view(1, 2, 3, 3),requires_grad=True)
addition = TVLoss()
z = addition(x)
print x
print z.data
z.backward()
print x.grad
if __name__ == '__main__':
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
4.2 tensorflow
def tv_loss(X, weight):
with tf.variable_scope('tv_loss'):
return weight * tf.reduce_sum(tf.image.total_variation(X))
1
2
3
4. 参考资料
~~~~~~ 本章节参考以下资料,作一定的整理,方便他人阅读与研究:
wiki上关于TVLoss的描述:https://en.wikipedia.org/wiki/Total_variation_denoising,https://en.wikipedia.org/wiki/Total_variation_distance_of_probability_measures
CSDN博客《Total Variation》
视频教程Denoising, deconvolution and computed tomography using total variation penalty
实验——基于pytorch的噪声估计网络
pytorch的TV loss实现
————————————————
版权声明:本文为CSDN博主「Kindle君」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yexiaogu1104/article/details/88395475
【CNN基础】常见的loss函数及其实现(一)——TV Loss相关推荐
- 《深度学习笔记》——loss函数的学习笔记
1 loss的作用 在南溪看来,loss函数是对目标target和预测prediction之间的一种距离度量的公式: 2 loss函数的设计原则 此设计原则参考了距离的定义,(注意:距离跟范数是两个概 ...
- 聊一聊CNN中的感受野、优化函数、激活函数、Loss函数等
目录: 1.感受野 2.优化函数 3.激活函数 4.loss 函数. 前言 文章有点长,内容有点丰富,基本涵盖整个深度卷积神经网络,涉及 网络中的感受野.激活函数.loss函数以及各种相关知识. Pa ...
- 深度学习基础(三)loss函数
loss函数,即损失函数,是决定网络学习质量的关键.若网络结构不变的前提下,损失函数选择不当会导致模型精度差等后果.若有错误,敬请指正,Thank you! 目录 一.loss函数定义 二.常见的lo ...
- [人工智能-深度学习-14]:神经网络基础 - 常见loss损失函数之逻辑分类,对数函数,交叉熵函数
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- [人工智能-深度学习-9]:神经网络基础 - 常见loss损失函数之均分误差MSE、绝对值误差MAE、平滑平均绝对误差Huber
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- 深度学习中的损失函数总结以及Center Loss函数笔记
北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文 ...
- tensorflow学习(4.loss函数以及正则化的使用 )
本文还是以MNIST的CNN分析为例 loss函数一般有MSE均方差函数.交叉熵损失函数,说明见 https://blog.csdn.net/John_xyz/article/details/6121 ...
- 深度学习loss函数理解
机器学习中的范数规则化之L0.L1.L2范数及loss函数 监督机器学习问题无非就是"minimizeyour error while regularizing your parameter ...
- php 赋值 递增,PHP 基础(赋值及函数)
开端<?php>结尾 弱类型语言 定义变量的时候 不需要 声明 但是 每一个变量前 都必须 加$ 符号 储存文件按 统一放到 安装文件夹下面的 WAMP 下面 的WWW ...
最新文章
- 现代中产男人必备的8种气质[zt] 来自9G群里发的,据说是BF推荐给9G的
- linux添加cmd命令行参数,Windows 终端命令行参数 | Microsoft Docs
- php 时间错误,PHP xdebug调试trace记录时间错误
- 转载:[Matlab]结构体(Struct)
- Event.ADDED_TO_STAGE的本质
- python跳一跳编程构造_python实现微信跳一跳辅助工具步骤详解
- Spark自定义分区器
- Android 自定义View:教你轻松实现内存清理加速球的效果
- 空洞卷积详解(输入输出大小分析)
- android 样式 下载,VolumeStyles软件下载官方
- 古体字与简体字对照表_简体字与繁体字对照表汇总
- R语言使用aov函数建立单因素方差分析模型、使用TukeyHSD函数采用Tukey法对各组均值的差异进行成对检验、使用plot函数可视化TukeyHSD函数的事后分析的结果、并获得的95%置信区间
- Eclipse官方下载最新版
- 文本分析主要包含哪些技术,文本分析技术的发展方向是什么?
- 天下数据解析域名及域名转向
- Mac OS下FileVault encryption 使用原理与简介
- System.InvalidOperationException: Response Content-Length mismatch: too few bytes written (0 of 1628
- ES6 — ES11 新特性一篇通
- 计算机网络与多媒体试卷,《计算机网络与多媒体技术》试卷
- cadence SPB17.4 - allegro - CAM350_V10.7CN 引入槽孔(.rou)文件报错问题的优雅解决思路
热门文章
- navcat设置oracle表主键自增_初识 Oracle 表空间设置与管理
- html5画布显示不出来,运行后html5画布没出来
- 乐山市计算机学校坑不坑,据说这个学校很乱。
- 运行时常量池在哪里_Java虚拟机详解(二)------运行时内存结构
- 7-19 支票面额 (C语言)
- 【c语言】蓝桥杯算法提高 温度转换
- 微软正式发布Azure Storage上的静态网站
- NGUI_Depth
- label实现不同大小不同颜色
- Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (usin