【深度学习相关知识】

数据预处理

1)全部样本的尺寸是一致的(同时,全部样本的通道数是一致的)
2)图像最终以Tensor形式被输入卷积网络
3)图像被恰当地归一化
image_mean=[0.485,0.456,0.406]、image_std=[0.229,0.224,0.225]是Imagenet数据集的均值和标准差,使用Imagenet的均值和标准是一种常见的做法。
归一化:每个通道上的每个像素会减去均值,并除以方差。
图像其实是一种平稳的分布,减去数据对应维度的统计平均值,可以消除公共部分。以凸显个体之前的差异和特征
假设你的数据是“自然场景”的普通照片(人,建筑,动物,不同的照明/角度/背景等等),并且假设你的数据集和 ImageNet 存在类似的偏差(在类别平衡方面),那么使用 ImageNet 的场景统计数据进行规范化就可以了。
如果照片是“特殊的”(颜色过滤,对比度调整,不寻常的光线,等等)或“非自然的主题”(医学图像,卫星地图,手绘等) ,我建议在模型训练之前正确地规范化你的数据集(计算新的平均值和标准)。

滤波

均值滤波、高斯滤波、盒子滤波、拉普拉斯滤波等等
高斯滤波 like Gaussian filter
高斯滤波一般针对的是高斯噪声,能够很好的抑制图像输入时随机引入的噪声,将像素点跟邻域像素看作是一种高斯分布的关系,它的操作是将图像和一个高斯核进行卷积操作。作为低通滤波器使用,可以将低频能量(比如噪声)滤去,起到图像平滑作用。
通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值用。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。

OpenCV cv2

读写画图

滤波器和卷积核的区别

卷积核就是由长和宽来指定的,是一个二维的概念。
而滤波器是是由长、宽和深度指定的,是一个三维的概念。滤波器可以看做是卷积核的集合。
仅在 1 通道的情况下,滤波器和内核的作用是等价的。
滤波器的每个卷积核在各自的输入通道上「滑动」,产生各自的计算结果。然后将每个通道处理的结果汇在一起形成一个通道。滤波器的卷积核各自产生一个对应通道的输出,最后整个滤波器产生一个总的输出通道。

卷积网络的平移不变性

有的说有有的说没有
【不变性】就是目标发生了变换,但是你依然可以识别出来。在图像任务中,我们希望图像中的目标即使被平移、被旋转或者被缩放,模型都可以识别出来图像的目标。
在图像分类任务中,平移不变性就是图像中的目标不管被移动到哪个位置,模型给出的标签应该都是相同的。
卷积:简单地说,图像经过平移,相应的特征图上的表达也是平移的。下图只是一个为了说明这个问题的例子。输入图像的左下角有一个人脸,经过卷积,人脸的特征(眼睛,鼻子)也位于特征图的左下角。假如人脸特征在图像的左上角,那么卷积后对应的特征也在特征图的左上角。

归一化

避免数值问题。
对原始数据进行线性变换把数据映射到[0,1]之间
不同变量往往量纲不同,归一化可以消除量纲对最终结果的影响,使不同变量具有可比性。
标准化:数据均值为0,标准差为1
批量规范化利⽤⼩批量上的均值和标准差,不断调整神经⽹络中间输出,从⽽使整个神经⽹络在各层的中间输出的数值更稳定。

网络输出尺寸计算公式

卷积层输出尺寸计算公式
H o u t = H i n + 2 ∗ P − K S + 1 H_{out}=\frac{H_{in}+2*P-K}{S} +1 Hout=SHin+2PK+1


池化pooling层输出尺寸计算公式 同上
H o u t = H i n + 2 ∗ P − K S + 1 H_{out}=\frac{H_{in}+2*P-K}{S} +1 Hout=SHin+2PK+1


膨胀卷积是对卷积核的膨胀
膨胀后的卷积核 不膨胀的情况下D=1
K ′ = D ∗ ( K − 1 ) + 1 K^{'}=D*(K-1)+1 K=D(K1)+1
因此,膨胀卷积输出尺寸计算公式为
H o u t = H i n + 2 ∗ P − K ′ S + 1 K ′ = D ∗ ( K − 1 ) + 1 H_{out}=\frac{H_{in}+2*P-K^{'}}{S} +1\\ K^{'}=D*(K-1)+1 Hout=SHin+2PK+1K=D(K1)+1

C++

数组的初始化

#include <iostream>
using namespace std;
int main()
{
	int a[3]={1,2,3};
	int b[3]={1,2,3};//[1,2,3];
	for( int i = 0; i < 3; i = i + 1 )
   {
       cout<<a[i]<<' '<<b[i]<<endl;
   }
   cout << "Hello World";
   return 0;
}
#include <iostream>
using namespace std;
int main()
{
	//二维数组分行初始化
	int a[2][3]={{1,2,3},{456}};
	//不分行初始化
	int a[2][3]={ 1,23456};
   return 0;
}

条件概率

权重衰减

应对过拟合的方法:权重衰减
权重衰减等价于L2范数正则化(regularization)。还有L1和L0范数,其中L2范数应对过拟合最好。
正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常用手段。至于为什么添加了正则项就能降低过拟合。简单来说,添加了正则项后,损失函数计算梯度下降时就要同时满足原损失函数和正则项的权重同时等于0,压缩了解的空间,即对权重w的可能的取值做了限制。

LSTM

通用逼近器

马尔科夫、隐HMM

马尔科夫
隐马尔科夫
隐马尔科夫
可以认为不受时间的影响.
马尔可夫过程(Markov process)是一类随机过程。由俄国数学家A.A.马尔可夫于1907年提出。该过程具有如下特性:在已知目前状态(现在)的条件下,它未来的演变(将来)不依赖于它以往的演变 (过去 )。
马尔科夫过程是指过程中的状态的转移依赖于之前的状态,当影响转移状态的数目是n时,这个过程被称为 n阶马尔科夫模型.
如果第i 时刻上的取值依赖于且仅依赖于第i−1 时刻的取值,即
在这里插入图片描述
天气、赌徒输赢

隐马尔科夫模型 = 普通马尔科夫链 + 一组观测变量
观测变量取决于现在在的状态,过去对其不影响
比如我们的股市,如果只是观测市场,我们只能知道当天的价格、成交量等信息,但是并不知道当前股市处于什么样的状态(牛市、熊市、震荡、反弹等等),在这种情况下我们有两个状态集合,一个可以观察到的状态集合(股市价格成交量状态等)和一个隐藏的状态集合(股市状况)。我们希望能找到一个算法可以根据股市价格成交量状况和马尔科夫假设来预测股市的状况。
在上面的这些情况下,可以观察到的状态序列和隐藏的状态序列是概率相关的。于是我们可以将这种类型的过程建模为有一个隐藏的马尔科夫过程和一个与这个隐藏马尔科夫过程概率相关的并且可以观察到的状态集合,就是隐马尔可夫模型。
隐马尔可夫模型(Hidden Markov Model) 是一种统计模型,用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析。

和HMM模型相关的算法主要分为三类,分别解决三种问题:

  • 知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道每次掷出来的都是哪种骰子(隐含状态链)。
  • 还是知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道掷出这个结果的概率。
  • 知道骰子有几种(隐含状态数量),不知道每种骰子是什么(转换概率),观测到很多次掷骰子的结果(可见状态链),我想反推出每种骰子是什么(转换概率)。

+= -= 运算优先级

后缀++ --的优先级不对!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
赋值语句的返回值为该值

#include <iostream>
using namespace std;
int main()
{
   int a=2;
   int b=3;
   cout <<a<< (a=b)<<a<<endl;
   cout <<a<< (a+=b)<<a<<endl;
   return 0;
}

输出结果

233
366
#include <iostream>
using namespace std;
int main()
{
   int a=2;
   int b=3;
   cout <<(a+=a-=a*a)<<endl;
   return 0;
}

结果为-4

++i表示先增加,后取值。而后置版本表示先取值,后增加。

#include <iostream>
using namespace std;
int main()
{
   int a=2;
   int b=2;
   cout <<(a+=a++)<<endl;//5 a+=2,a=3 
   cout <<(b+=++b)<<endl;//6=3+3
   a=2;
   b=2;
   cout <<(a++)<<endl;//2
   cout <<(++b)<<endl;//3
   return 0;
}
#include <iostream>
using namespace std;

int main()
{
	int a=2;
	int b=2;
	int c= - --a;//-1
	int d= - b--;//-2
   cout << c<<d<<endl;
   return 0;
}

输出-1-2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值