高斯噪声的均值和方差

2021-02-01 09:59发布

请问在神经网络中给训练集的数据添加高斯噪声,应该怎样设置高斯噪声的均值和方差???训练集的输入数据和输出数据都要添加高斯噪声吗??哪位大佬指明道路[face]qq:83.gif[/face][face...

请问在神经网络中给训练集的数据添加高斯噪声,应该怎样设置高斯噪声的均值和方差???
训练集的输入数据和输出数据都要添加高斯噪声吗??

哪位大佬指明道路[face]qq:83.gif[/face][face]qq:83.gif[/face]


2条回答
卡卡
2楼 · 2021-02-02 09:37

1. 小数据集存在的问题

在训练大型神经网络时,小型数据集会带来问题。

第一个问题是网络可以有效地记忆训练数据集。该模型可以学习特定的输入示例及其关联的输出,而不是学习从输入到输出的一般映射。这将导致模型在训练数据集上表现良好,而在新数据上表现不佳,即泛化能力很差。

第二个问题是小的数据集提供较少的机会来描述输入空间的结构及其与输出的关系。更多的训练数据为模型可以学习的问题提供了更丰富的描述。较少的数据意味着震荡和离散的输入空间而不是平滑的输入空间,这可能会导致模型学习特征映射比较困难。

有时候,有些数据的收集比较困难。此外,即使采集了更多的数据,可能仍然无法解决这些问题。一种解决方法是训练期间添加噪声。


2. 训练期间添加噪声

小数据集在训练时,会导致比较大的误差。通过在训练期间添加噪声,可以提高模型从输入空间学习映射规则的能力,提高模型的泛化能力和容错率。

在神经网络模型训练期间添加噪声具有正则化效果,进而提高了模型的鲁棒性。与权重正则化方法一样,已经证明添加噪声对损失函数的影响和惩罚项的作用类似。

实际上,添加噪声会扩大训练数据集的大小。每次将训练样本输入模型时,都会将随机噪声添加到输入变量,从而使输入模型的数据每次都不同。将噪声添加到输入样本是数据增强的一种简单形式。

添加噪声意味着网络无法记住训练样本,因为它们一直在变化,从而导致网络权重更小且网络更健壮,泛化误差更低。

噪声意味着从已知样本附近的域中抽取新样本,从而平滑了输入空间的结构。这种平滑可能意味着映射功能更易于网络学习,从而导致更好,更快的学习。


3. 如何添加噪声

高斯噪声或白噪声(Gaussian noise, or white noise) 的平均值为零,标准差(std)为1,可以根据需要使用伪随机数生成器生成。在信号处理中,使用高斯噪声这一术语来指代电路中不相关的随机噪声;传统上,将高斯噪声添加到神经网络的输入中称为抖动(jitter)或随机抖动。

添加的噪声量(例如,扩展或标准偏差)是可配置的超参数。噪声太小没有影响,而噪声太大使映射功能难以学习。通常是通过在将输入数据喂给网络之前在输入数据上添加一个随机向量来完成的,因此,在训练中同样的数据在不同训练批次中,也会添加不同的随机向量。

随机噪声的标准差可以根据每个输入变量的大小进行调整。如果输入变量的标度已首先进行标准化,则配置起来会更容易。

噪声仅在训练期间添加。在模型评估期间或使用模型对新数据进行预测时,不会添加任何噪声。

噪声的添加也是自动特征学习的重要部分,例如在自动编码器的情况下,所谓的降噪自动编码(Denoising Autoencoders)器明确要求模型在存在输入噪声的情况下学习鲁棒特征。

尽管在数据中添加噪声是最常见且最广泛的方法,但是在训练过程中可以将随机噪声添加到网络的其它部分。比如:

  • 给激活添加噪声,即每层的输出。

  • 给权重添加噪声,即迭代输入。

  • 给梯度(即更新权重的方向)添加噪声。

  • 给输出(即标签或目标变量)添加噪声。


在激活中中增加噪声,从而可以在网络的任何数据使用噪声。这对于非常深的网络可能是有益的。将噪声添加到层输出中,很可能是通过使用噪声激活函数来实现的。

在权重中添加噪声,可以使该方法以一致的方式在整个网络中使用,而不是在输入和层激活中添加噪声。这在递归神经网络中特别有用。

向梯度添加噪声,可以使模型更多地集中在提高优化过程本身的鲁棒性上,而不是输入空间的结构上。噪声的数量可能在训练开始时就开始很高,并且随着时间的流逝而降低,这很像学习速率的下降。对于非常深的网络和各种不同的网络类型,该方法已被证明是一种有效的方法。

将噪声添加到激活,权重或梯度都提供了一种更通用的添加噪声的方法,该噪声对于提供给模型的输入变量的类型是不变的。

如果认为或预期问题域带有错误标记的示例,则在类别标签上添加噪声可以提高模型对此类错误的鲁棒性。但这很容易偏离学习过程。

在回归或时间序列预测中,将噪声添加到连续目标变量中,非常类似于将噪声添加到输入变量中,并且可能是更好的方法。


4. 添加噪声的提示

添加噪声的方法,主要用于多层感知器,但可以与卷积和递归神经网络一起使用。

重要的是,噪声的添加对模型具有一致的影响。这就要求对输入数据进行重新缩放,以使所有变量都具有相同的缩放比例,以便在以固定方差将噪声添加到输入时,具有相同的效果。这也适用于在权重和渐变上添加噪声,因为它们也受输入比例的影响。这可以通过输入变量的标准化或标准化来实现。如果在数据缩放后添加了随机噪声,则可能需要对每个批处理再次重新缩放变量。


5. tensorflow.keras API

将噪声添加到具有少量训练数据集的神经网络模型中可以产生正则化效果并减少过拟合。

Keras通过单独的 GaussianNoise 层添加高斯噪声。该层可用于向现有模型添加噪声。

tf.keras.layers.GaussianNoise(
    stddev, **kwargs)123

参数说明:

  • stddev:float类型,噪声分布的标准差。

调用参数说明:

  • inputs:输入张量(任何等级)。

  • training:bool类型,True指示该层在训练模式下添加噪声;False表示不执行任何操作。

  • input_shape:在将此层用作模型的第一层时,需要指定该关键字参数(整数元组,不包括样本轴)。

示例:

from tensorflow.keras.layers import GaussianNoise
layer = GaussianNoise(0.1)12

实例:

1. 在激活之前添加高斯噪声:

...model.add(Dense(32))model.add(GaussianNoise(0.1))model.add(Activation('relu'))model.add(Dense(32))...123456

2. 在激活之后添加高斯噪声:

...model.add(Dense(32, activation='reu'))model.add(GaussianNoise(0.1))model.add(Dense(32))...12345

可以将标准差作为超参数,通过网格搜索找出最佳的值。


参考
https://machinelearningmastery.com/train-neural-networks-with-noise-to-reduce-overfitting/
https://machinelearningmastery.com/how-to-improve-deep-learning-model-robustness-by-adding-noise/
https://www.tensorflow.org/api_docs/python/tf/keras/layers/GaussianNoise


征戰撩四汸
3楼 · 2021-11-23 11:20

方法一:利用randn()函数生成高斯噪声
这里需要用到randn()函数,该函数就专门用来生成正态分布数据的一个函数。
比如 randn(10,10),然后这个矩阵和原图像矩阵相加即可(注意缩放灰度范围)

randn(10,10)

ans =

   -0.3587    0.6694    0.2922    0.4127   -0.4399   -0.2027    1.2917   -1.2807    0.0522   -0.2097

    1.4851   -0.2349   -0.0809   -1.0475    0.4734   -0.8012   -1.3658   -2.4489    1.2525   -0.0725

    0.1214    0.2553    0.2774   -0.9508   -0.3378   -1.1350    0.7951   -0.6749   -0.1797   -0.5646

   -0.7056    1.5769   -0.8234    1.5896    1.5743    0.1304   -0.3575   -1.0971   -0.2286   -1.5035

    1.4605    0.6227   -0.6059    1.5939    0.0120   -0.1012   -0.9397   -1.6988   -2.3375    1.0503

   -0.2038    0.7016    0.7310   -0.4053   -0.0419   -0.3276   -0.7675    0.6319    0.3662   -1.0595

   -1.3164    0.1579    0.3200   -0.2055    0.5508   -0.6350    0.7769    1.1788    1.1854   -1.0070

    0.1054    1.0071    0.4267    0.6462   -1.1893   -1.8829   -1.2166   -0.2838    1.0378    0.8280

    0.9141   -1.5962   -0.0540    1.5489    1.0449    0.6155   -0.6227    0.2447    0.2955   -0.7770

   -0.7474    0.6233    1.3306   -0.2167   -0.2423    1.3778   -1.0203   -1.1946    0.4893    0.0451

代码:

t=imread('a1.jpg');

[m,n,z]=size(t);

y=0+0.1*randn(m,n);%二维高斯分布矩阵 0是均值 0.1是标准差

 

%先将其double化,再除以255 便于后面计算

t1=double(t)/255;

 

%加上噪声

t1=t1+y;

 

%将像素范围扩大至0--255

t1=t1*255;

 

%转换为uint8类型

t1=uint8(t1);

 

subplot(1,2,1),imshow(t),title('原图');

subplot(1,2,2),imshow(t1),title('加入均值为0,标准差为0.1的高斯噪声后');

方法二:随机生成高斯噪声

image=imread('a1.jpg');

[width,height,z]=size(image);

subplot(1,2,1);

imshow(image);

title('原图');

av=0;

std=0.1;

u1=rand(width,height);

u2=rand(width,height);

x=std*sqrt(-2*log(u1)).*cos(2*pi*u2)+av;

result1=double(image)/255+x;

result1=uint8(255*result1);

subplot(1,2,2);

imshow(result1);

title('加入均值为0,标准差为0.1的高斯噪声后');



相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问