码迷,mamicode.com
首页 > Web开发 > 详细

深度学习|GoogLeNet

时间:2021-05-25 17:46:30      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:http   googl   提升   png   通过   通道   port   实例化   维度   

1. GoogLeNet背景

GoogLeNet和AlexNet/VGGNet这类依靠加深网络结构的深度的思想不完全一样。GoogLeNet在加深度的同时做了结构上的创新,引入了一个叫做Inception的结构来代替之前的卷积加激活的经典组件。GoogLeNet在ImageNet分类比赛上的Top-5错误率降低到了6.7%。

2. Inception

2.1为什么提出Inception

在GoogLeNet之前,大多数提升网络性能的方式为增加网络深度,GoogLeNet采用增加网络宽度来提升网络性能,在相同计算量下获取更多的特征信息,从而提升训练结果

2.2Inception

GoogLeNet中的基础卷积块叫作Inception块,得名于同名电影《盗梦空间》(Inception)。Inception块在结构比较复杂,如下图所示:技术图片
Inception块内有4条并行的线路,分别为1x1、3x3、5x5卷积层和应该3x3的最大池化层,其中中间两个线路先用1x1卷积来减少通道数,以减少参数的个数,池化层通过1x1卷积层来改变通道个数,4条线路都padding都采用same方式,确保四条线路宽高一致。最后我们将每条线路的输出在通道维度上进行连结,病作为下一层的输入。

扩展:为什么1x1卷积可以减少网络参数?

技术图片
(a)是未加入1x1卷积的inception模块,(b)是加入了1x1 卷积的inception模块。
我们以3x3卷积线路为例,假设输入的特征图大小为(28x28x192),输出特征图的通道数是128:
(a)图中该线路的参数量为:3x3x192x128 = 221184
(b)图中加入1x1卷积后通道为96,再送入3x3卷积中的参数量为:(1x1x192x96)+(3x3x96x128)=129024
对比可知,加入1x1卷积后参数量减少了。

在tf.keras中实现Inception模块,各个卷积层卷积核的个数通过输入参数来控制,如下所示:

import 
import tensorflow as tf
# 定义Inception模块
class Inception(tf.keras.layers.Layer):
	# 输入参数为各个卷积核个数
	def __init__(self,c1,c2,c3,c4):
		super().__init__()
		# 线路1:1x1的卷积核,激活函数为relu,padding为same
		self.p1_1 = tf.keras.layers.Conv2D(c1,kernel_size=1,activition=‘relu‘,padding=‘same‘)
		# 线路2:1x1的卷积核后接3x3的卷积核,就函数为relu,padding为same
		self.p2_1 = tf.keras.layers.Conv2D(c2[0],kernel_size=1,activition=‘relu‘,padding=‘same‘)
		self.p2_2 = tf.keras.layers.Conv2D(c2[1],kernel_size=3,activition=‘relu‘,padding=‘same‘)
		# 线路3: 1x1的卷积核后接5x5的卷积核,激活函数为relu,padding为same
		self.p3_1 = tf.keras.layers.Conv2D(c3[0],activition=‘relu‘,padding=‘same‘)
		self.p3_2 = tf.keras.layers.Conv2D(c3[1],activition=‘relu‘,padding=‘same‘)
		# 线路4: 3x3的池化层后接1x1的卷积层,激活函数为relu,padding为same
		self.p4_1 = tf.keras.layers.Maxpool2D(pool_size=3,padding=‘same‘,strides=1)
		self.p4_2 = tf.keras.layers.Conv2D(c4,kernel_size=1,activition=‘relu‘,padding=‘same‘,)
	# 完成前向传播
	def call(self,x):
		# 线路1
		p1 = self.p1_1(x)
		# 线路2
		p2 = self.P2_2(self.p2_1(x))
		# 线路3
		p3 = self.p3_2(self.p3_1(x))
		# 线路4
		p4 = selg.p4_2(self.p4_1(x))
		return tf.concat([p1,p2,p3,p4],axis=-1)# axis -1  选择最后一个维度
		

指定通道数,对Inception模块进行实例化:

Inception(64, (96, 128), (16, 32), 32)

3.GoogLeNet模型

GoogLeNet主要由Inception模块构成,如下图所示:
技术图片
整个网络架构我们分为五个模块,每个模块之间使用步幅为2的3×3最大池化层来减小输出高宽
技术图片
googLeNet的网络设计
技术图片

深度学习|GoogLeNet

标签:http   googl   提升   png   通过   通道   port   实例化   维度   

原文地址:https://www.cnblogs.com/hzzhu/p/14805886.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!