详细学习1*1卷积核

1*1卷积是大小为1*1的滤波器做卷积操作,不同于2*2、3*3等filter,没有考虑在前一特征层局部信息之间的关系。我们从1*1卷积的两个主要使用来理解其原理和作用。

卷积核:可以看作对某个局部的加权求和,它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整体,而是先从局部开始认识,这就对应了卷积。卷积核的大小一般有1x1,3x3和5x5的尺寸。卷积核的个数就对应输出的通道数,这里需要说明的是对于输入的每个通道,输出每个通道上的卷积核是不一样的。比如输入是28x28x192(WxDxK,K代表通道数),然后在3x3的卷积核,卷积通道数为128,那么卷积的参数有3x3x192x128,其中前两个对应的每个卷积里面的参数,后两个对应的卷积总的个数。 

下面直接截图吴恩达老师的课件,做1*1卷积运算的理解。对于如下的二维矩阵,做卷积,相当于直接乘以2。

 

 

对于三维矩阵,做卷积。

 

当设置多个1*1filter时,就可以随意增减输出的通道数,也就是降维和升维。

1、Network In Network论文

最早出现在 Network In Network的论文中 ,使用1*1卷积是想加深加宽网络结构 。

2、Inception网络

在Inception网络(论文Going Deeper with Convolutions)中图像输入进来后,通常可以选择直接使用像素信息(1x1卷积)传递到下一层,可以选择3x3卷积,可以选择5x5卷积,还可以选择max pooling的方式downsample刚被卷积后的feature maps。 但在实际的网络设计中,究竟该如何选择需要大量的实验和经验的。 Inception就不用我们来选择,而是将4个选项给神经网络,让网络自己去选择最合适的解决方案。但是这些卷积滤波器的设计也会在计算上造成很大的消耗,由于3*3卷积或者5*5卷积在几百个filter的卷积层上做卷积操作时相当耗时,所以1*1卷积在3*3卷积或者5*5卷积计算之前先降低维度

普通的inception模块

 按照上面的说法,我们的这层的模型参数与输入的特征维数(28x28x192),卷积核大小以及卷积通道数(包括三种卷积核,分别是1x1x64,3x3x128,5x5x32),所以参数为:

参数:(1×1×192×64) + (3×3×192×128) + (5×5×192×32) = 153600
最终输出的feature map个数:64+128+32+192 = 416

池化层不引人参数!

feature map个数就是filter个数,一个滤波器在前一个feature map上进行一次卷积操作(特征抽取)会产生一个feature map或者叫通道、深度。

加入1x1卷积的inception

 上图中在3x3,5x5 卷积层前新加入的1x1的卷积核为96和16通道的,max pooling后加入的1x1卷积为32通道。

图中该层的参数:

参数:(1×1×192×64)+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32)+(1x1x32)=15904
最终输出的feature map个数: 64+128+32+32=256

所以,加入1×1的卷积后,在降低大量运算的前提下,降低了维度。

3、1*1卷积作用

总结一下,1x1的卷积核可以进行降维或者升维,也就是通过控制卷积核(通道数)实现,这个可以帮助减少模型参数,也可以对不同特征进行尺寸的归一化;同时也可以用于不同channel上特征的融合。一个trick就是在降维的时候考虑结合传统的降维方式,如PCA的特征向量实现,这样效果也可以得到保证。

1*1卷积的主要作用有以下几点:

1、降维。比如,一张500 * 500且厚度depth为100 的图片在20个filter上做1*1的卷积,那么结果的大小为500*500*20。

2、加入非线性。卷积层之后经过激励层,1*1的卷积在前一层的学习表示上添加了非线性激励,提升网络的表达能力;

3、增加模型深度。可以减少网络模型参数,增加网络层深度,一定程度上提升模型的表征能力。

参考资料

[1] https://blog.csdn.net/ybdesire/article/details/80314925

[2] https://blog.csdn.net/a1154761720/article/details/53411365

[3] https://www.zhihu.com/question/56024942

[4]https://mooc.study.163.com/learn/2001281004?tid=2001392030#/learn/content?type=detail&id=2001729330&cid=2001725134

  • 25
    点赞
  • 187
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
【资源说明】 基于机器学习对比学习法对MNIST数据集进行预训练和分类源码+项目说明+详细注释.zip 对比学习是一种机器学习方法,它利用训练数据中的相似和不同之处来学习分类任务。对比学习的目标是通过将相似样本归为一类、将不同样本归为另一类来学习分类决策边界。这种方法通常用于处理具有少量标注数据的问题,例如人脸识别,图像检索和自然语言处理。 ## 模型构架及训练步骤 1.加载并预处理数据集 可以使用本地的数据集,也可以在线下载(需要外网),建议直接使用本地 ```python # 指定本地路径的方法 from keras.datasets import mnist path = '你的数据集路径' (x_train, y_train), (x_test, y_test) = mnist.load_data(path) # 数据归一化处理 x_train = x_train.astype("float32") / 255.0 x_test = x_test.astype("float32") / 255.0 ``` 2.自定义DataGenerate 在这个类中锚点数据将从数据集中直接按标签取出,将锚点数据送进数据增强器,进行随机旋转、平移、剪切、缩放、翻转等方法。生成正样本。 在原有的数据集中选择标签不等于当前标签的数据作为负样本。 3.自定义损失函数 采用欧式距离计算正负样本和锚点之间的差异,并设置alpha参数作为阈值当negative样本与anchor样本的距离大于该阈值时,我们认为这样个样本是不匹配的,需要具体问题具体调整。 4.构建预训练网络模型 1>卷积层,使用32个3×3的卷积核,激活函数为ReLU。 2>池化层,使用2×2的池化窗口。 3>卷积层,使用64个3×3的卷积核,激活函数为ReLU。 4>池化层,使用2×2的池化窗口。 5>展平层,将输入的多维数据转换成以为向量。 6>全连接层,输出维度为64,激活函数是ReLU。 ```python encoder = keras.Sequential( [ layers.Conv2D(32, (3, 3), activation="relu", input_shape=input_shape), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activation="relu"), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dense(embedding_dim, activation="relu"), ], name="encoder", ) ``` 5.构建MLP模型 搭建两个全连接层,输入参数为256,输出类别数,从而实现分类。 ```python mlp_model = keras.Sequential([ layers.Dense(256, activation="relu", input_shape=(embedding_dim,)), layers.Dense(num_classes, activation="softmax") ], name="mlp_model") ``` 6.准确率 设置epochs=20,batches=128跑下来准确能够达到0.9179 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值