IRCNN-FPOCS 代码解读(1):整体框架

news2025/1/13 10:11:22

0 前言

按照自己实现论文代码的思路,去研究作者的代码,找到自己的知识盲区和不足,提升编码技能。

本模块主要介绍代码实现思路。细节分析详见后续博客。

1、合成地震数据

利用波动方程???合成数据,也就是标签(Ground truth)。

代码实现在 generateHyperbolic.m中,

使用的函数为:D = hyperbolic_events(dt, f0, tmax, offset, tau, v, amp, snr, L);
% dt:采样间隔(秒)
%f0:中心频率(Hz)
%tmax:模拟的最长时间(秒)
%h:偏移矢量,单位为米
%tau,v,amp:截距矢量,均方根速度和每个线性事件的振幅,v以m/s为单位,tau以秒为单位)
%snr:信噪比(清洁的最大振幅信号/噪声的最大幅度)
%L:随机噪声是L个样本的平均值

论文中参数设置如下:

dt = 2./1000;
tmax = 2.;
n = 100;
offset = (-n:n)*10;
tau = [.5, .8, 1., 1.4];
v = [1700, 1800, 2000, 2300];   
amp = [.4, .4, .6, .5];
f0 = 30;
snr = Inf; 
L = 20;

生成的地震数据如下图:

 但参数的设置是如何影响图像中曲线形态的,以及和实际地震数据采集过程中的,地震道之间的距离、采样间隔等实际指标是如何对应的,不明确?

2、生成含噪声的下采样的地震数据

输入:合成地震数据

输出:含噪声的下采样地震数据

数据预处理包括四个步骤:归一化、加噪声、下采样、预插值。

2.1 归一化

1)方法:

Min-Max Normalization
 x' = (x - X_min) / (X_max - X_min)

2)作用:

加速模型收敛,节约训练时间

2.2 加噪声

此处为随机噪声。噪声水平[0,255]。

2.3 下采样

1)生成下采样模板

这里有两种方式可选择,按照指定模板下采样和自定义下采样。这里介绍自定义下采样。

这里的下采样可以随机去行、随机去列、有规律去列、无规律去列。

这里采用的是无规律去列。

如:mask = projMask(D, Ratio, sampleType)

参数 D 为输入图像,Ratio 为保留原图像的比率,sampleType是采样类型,这里选择的是iregc(无规律去除列数据)。

实现代码如下:

index = randperm(n); % n为原图像列的数目,将n个整数随机排列
sample = index(1:fix(n*r)); % fix是向下取整的意思,r是保留的比例 
mask(:, sample) = 1;

最终得到只含有0 和 1 的mask,0表示原图像对应位置的值去除,1表示保留。

2)得到下采样数据

将原始数据和下采样模板点乘可得到下采样数据,注意,这里还做了一个小处理,用原图像的均值将缺失值补齐,最起码缺失部分看起来没有那么突兀。

% Down-sampling input.
input = nlabel.*mask;   % nlabel为加噪声的地震数据
input(mask==0) = mean(nlabel(:));  % 将缺失值用均值补齐

2.4 预插值

作用:预插值可以提高效率和准确性,就像神经网络初始化权重时不是随机初始化权重,而是使用某种方法进行初始化。

这里用的是Shepard插值方法,又称为与距离成反比的加权法,其基本实现是将插值函数定义为各数据点函数值的加权平均,权函数定义为与距离成反比。

什么类型的插值算法不重要,重要的是得有这一步,好的初始化很重要!

3、实现IRCNN-FPOCS的迭代过程

3.1 论文算法的整体描述如下:

%  论文算法步骤5   
maxv = 30;
epsilon = 10;
LambdaS = maxv * exp(((0:totalIter-1) * (log(epsilon) - log(maxv))) / (totalIter-1));  

for itern = 1 : totalIter
    %%%%%%%%%%%%%%%
    
    d_old = output;
    
    % 对应论文算法的步骤3、4、7,这里认为 alpha=1,tt为论文算法步骤3里面的st.
    % 步骤7作用有点类似于网络训练中的 optimize.zero_grad() 放在前面后面都可以
    tt = next_t(t);  
    beta = (t-1)/tt;
    output = mask.*input + (1 - mask).*(output + beta * (output - d_old));
   
    d_old = output;
    %%%%%%%%%%%%%%%%%%%%%
    
    if ns(itern+1) ~= ns(itern)
        [net] = loadmodel(LambdaS(itern), CNNdenoiser);    
        net = vl_simplenn_tidy(net); %修复不完整或过时的网络
        if useGPU
            net = vl_simplenn_move(net, 'gpu');
        end
    end
    
    for k = 1 : inIter
        res    = vl_simplenn(net,output,[],[],'conserveMemory',true,'mode','test');
        output = output - res(end).x;
    end
end

论文步骤5的目标是求噪声方差\sigma _{t},其最大值设置为30, 最小值设置为10,代码中的LambdaS是采用指数方式迭代30次,产生30个 30和10之间的值,作为迭代过程中IRCNN 去噪模型的参数。

 output = mask.*input + (1 - mask).*(output + beta * (output - d_old));  

input为原始图像加噪声下采样用均值补齐后结果,

output在迭代开始为原始图像加噪声下采样用均值补齐预插值后结果,在后续步骤中用IRCNN更新,此时论文步骤7里的\alpha取值为1。

  d_old 、 output分别表示迭代前后两次计算的d

res    = vl_simplenn(net,output,[],[],'conserveMemory',true,'mode','test'); 这一步为IRCNN深度模型的测试结果,其中输入output 为含噪声数据,输出res  为残差(也就是分离出的噪声数据)。

代码中的ns 不知道是来干啥的???继续问。 

3.2  IRCNN深度模型如何嵌入matlab?

在matlab中使用深度学习网络要用到matconvnn 工具箱。

1)将训练好的参数载入模型

[net] = loadmodel(LambdaS(itern), CNNdenoiser);    
net = vl_simplenn_tidy(net); %修复不完整或过时的网络

2)测试输出

res = vl_simplenn(net,output,[],[],'conserveMemory',true,'mode','test');

3)模型训练过程。用python 实现。

4、其他说明

代码细节描述,见注释,暂不公开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript的“神奇”之处

JavaScript 是一门很棒的语言。它的语法简单,生态系统也很庞大,最重要的是,它拥有最伟大的社区力量。我们知道,JavaScript 是一个非常有趣的语言,但同时也充满了各种奇怪的行为。让我们一起来看一下吧~ example 数组…

Weston 窗口管理(2)

窗口管理(2) 本文基于 weston 分支 10.0.2 进行描述. 五、概述 本文为窗口管理(1)的续章,更多站在开发者角度,以 weston 的代码实现讲解窗口管理(1)中所实现的部分业务场景. 六、数据结构 在窗口管理(1)中曾经描述过 weston 具体的分层逻辑,如下: 再进一步可以把 WESTON_LAY…

关于grpc的第一次尝试

自己瞎琢磨的,有错勿怪。 一、rpc理解 微服务会在不同的端口使用不同的语言提供相异的服务,端口之间的通信就使用rpc。这边的grpc的“g”我原先意味是golang,后来发现是google。 在golang关于rpc的官方包中,rpc主要有使用http/…

(7)Qt中的自定义槽(函数)

目录 槽函数定义的规则 关联信号与槽错误的示例 类成员函数函数做槽函数使用 静态类成员函数做槽函数使用 全局函数做槽函数使用 lambda表达式做槽函数使用 使用lambda表达式的注意事项 注意事项一: 注意事项二: 槽函数定义的规则 1.槽函数返回值…

多图解析KMP算法原理

KMP是什么 KMP是一种字符串匹配算法,能够判断字符串s2,是否为字符串s1的子串 例如:s1 "abd123def",s2 "123",KMP会返回4,代表s2是s1的子串,第一个匹配的下标为3 假设s…

线程池及源码分析

目录 1 java构建线程的方式 2 线程池的7个参数 3 线程池属性标识&线程池的状态 3.1 核心属性 3.2 线程池的状态 4 线程池的执行流程 5 添加工作线程的流程 6 Worker的封装&后续任务的处理 1 java构建线程的方式 一般就3~4种: 继承Thread&#xff…

迎接新年,暂且用Python绘制几个中国结吧

前言 今天就来分享几个用python绘制的图案吧 马上就要迎来新年了 就绘制了几个中国结,嘿嘿 话不多说,直接展示一下代码和效果图吧 更多学习资料与源码点击文章末尾名片领取 1. 效果图: 代码展示 import turtle turtle.screensize(600,…

GPDB插件安装工具之gppkg

gppkg命令gppkg是一个python3编写的打包脚本,在整个集群中安装.gppkg格式的Greenplum数据库扩展(例如PL/Java、PL/R和MADlib)及其依赖项,位于/usr/local/cloudberry-db/bin/gppkg(自己安装的gpdb目录),安装到$GPHOME里…

1个寒假能学多少网络安全知识?

现在可以看到很多标题都声称三个月内就可以转行网络安全领域,并且成为月入15K的网络工程师。那么,这个寒假的时间能学多少网络安全知识?是否能入门网络安全工程师呢? 答案是肯定的。 虽然网络完全知识是一门广泛的学科&#xff…

ccc-sklearn-13-朴素贝叶斯(1)

朴素贝叶斯 一种直接衡量标签和特征之间概率关系的有监督学习算法,专注分类的算法,基于概率论和数理统计的贝叶斯理论。在计算的过程中,假设特征之间条件独立,不进行建模,采用后验估计。 sklearn中的朴素贝叶斯 类含…

1-选择题练手

1.采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是 A.每次划分后,先处理较长的分区可以减少递归次数 B.递归次数与初始数据的排列次序无关 C.每次划分后,先处理较短的分区可以减少递归次数 D.递归次数与…

DaVinci:键 - 外部蒙版

调色页面:键Color:Key在调色页面,可以轻松地从媒体池将某个片段拖至节点面板中,以作为外部蒙版。或者,在节点上右击选择“添加蒙版” Add Matte。若无附加,则可以选择本节点片段的明度信息作为外部蒙版。当…

hbase2.x orphan regions on filesystem(region丢失)问题修复

问题描述:orphan regions on filesystem 可以通过主master web页面的HBCK Report查看 也可以通过hbck2工具查看 # 查看指定表 hbase hbck -j $HBASE_HOME/lib/hbase-hbck2-1.3.0-SNAPSHOT.jar addFsRegionsMissingInMeta default:tableName # 查看命名空间下所有…

Yolov5+TensorRT-生成dll-python/c++调用dll

YOlov5-6.0TensorRTdllpython/c调用简介1.项目环境2.TensorRT验证1.在tensorrtx-yolov5-v6.0\yolov5目录下新建build目录2.编写CMake.txt,根据自己目录更改2(OpenCV_DIR)、3(TRT_DIR)、10(Dirent_INCLUDE_DIRS&#xf…

LabVIEW网络服务器何使用,有哪些不同

LabVIEW网络服务器何使用,有哪些不同NI有几款不同的Web服务器,可使用不同的产品并覆盖不同的用例。它们具有非常相似的名称,可以互换使用,但每个都提供不同的功能。应用程序Web服务器描述:NI应用Web服务器加载使用LabV…

企业微信商户号是什么?如何开通?

企业微信作为一款优秀的移动办公工具,与微信全方位打通,既可以与客户沟通交流,也可以在达成交易后直接进行对公收款,但是前提是要开通企业微信商户号。前言企业微信和微信都出自腾讯,而且企业微信全方位连接微信&#…

C#,图像二值化(16)——全局阈值的力矩保持算法(Moment-proserving Thresholding)及其源代码

1、力矩保持法 提出了一种基于矩保持原理的自动阈值选择方法。以这样的方式确定地计算阈值,即在输出画面中保留输入画面的时刻。实验结果表明,该方法可以将给定的图像阈值化为有意义的灰度级。该方法描述了全局阈值,但也适用于局部阈值。 A…

企业微信开发——企业内部自建应用开发(第二篇)---JS_SDK配置

企业微信如果想要使用企业微信的JS_SDK来实现拍照、定位等等功能,就需要预先在使用到的页面进行配置,当然你可以做全局配置。对于JS_SDK的配置设计前端和后端的统一配置。下面我来说明下具体的步骤。特别说明:1、企业微信有的接口需要配置wx.…

shader基础入门(1)

本文基于unity免费公开课“Hi Shader以及网络公开资料等书写”遵循开源协议。 MeshFilter网格过滤器 从海量资源中挑选适合的Mesh将他交给MeshRender MeshRenderer 网格渲染器 负责把MeshFilter丢过来的Mesh,绘制显示到我们的场景中 Material 材质球 Material…

多线程之死锁

目录: 1.什么是死锁? 2.可重入与不可重入 3.发生死锁的三个典型情况 4.发生死锁的四个必要条件 5.如何破除死锁? 1.什么是死锁? 谈到死锁,程序猿们都心存忌惮,因为程序一旦出现死锁,就会导…