26- AlexNet和VGG模型分析 (TensorFlow系列) (深度学习)
创始人
2024-05-28 16:43:11
0

知识要点

  • AlexNet 是2012年ISLVRC 2012竞赛的冠军网络。

  • VGG 在2014年由牛津大学著名研究组 VGG 提出。

  • 10 monkey数据集是10个种类的猴子分类.


AlexNet

1.1 Alexnet简介

AlexNet 是2012年ISLVRC 2012(ImageNet Large Scale Visual Recognition  Challenge)竞赛的冠军网络,分类准确率由传统的 70%+提升到 80%+。 它是由Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,深度学习开始迅速发展。

  • ISLVRC 2012竞赛

    • 训练集:1,281,167张已标注图片

    • 验证集:50,000张已标注图片

    • 测试集:100,000张未标注图片

该网络的亮点在于:

  1. 首次利用 GPU 进行网络加速训练。
  2. 使用了 ReLU 激活函数,而不是传统的 Sigmoid 激活函数以及 Tanh 激活函数。
  3. 使用了 LRN 局部响应归一化。
  4. 在全连接层的前两层中使用了 Dropout 随机失活神经元操作,以减少过拟合。

过拟合:根本原因是特征维度过多,模型假设过于复杂,参数 过多,训练数据过少,噪声过多,导致拟合的函数完美的预测 训练集,但对新数据的测试集预测结果差。 过度的拟合了训练 数据,而没有考虑到泛化能力。

使用 Dropout 的方式在网络正向传播过程中随机失活一部分神经元。

经卷积后的矩阵尺寸大小计算公式为:N = (W − F + 2P ) / S + 1

  1. 输入图片大小 W×W

  2. Filter大小 F×F

  3. 步长 S

  4. padding的像素数 P

1.2 模型网络内部

1.2.1 conv1层

Conv1:  kernels:48*2=96  kernel_size:11  padding:[1, 2]  stride:4

  • input_size:  [224, 224, 3]

  • output_size: [55, 55, 96]

N = (W − F + 2P ) / S + 1   = [224-11+(1+2)]/4+1 = 55

1.2.2 Maxpool1层

Conv1:  kernels:48*2=96  kernel_size:11  padding: [1, 2]  stride:4  output_size:  [55, 55, 96]

Maxpool1:  kernel_size:3  pading: 0  stride:2

  • input_size:  [55, 55, 96]

  • output_size: [27, 27, 96]

  • N = (W − F + 2P ) / S + 1    =(55-3)/2+1 = 27

1.2.3 Conv2层

Conv1:  kernels:48*2=96  kernel_size:11  padding: [1, 2]  stride:4  output_size:  [55, 55, 96]

Maxpool1:  kernel_size:3  pading: 0  stride:2    output_size:  [27, 27, 96]

Conv2:  kernels:128*2=256  kernel_size:5  padding: [2, 2]  stride:1

  • input_size:  [27, 27, 96]

  • output_size: [27, 27, 256]

N = (W − F + 2P ) / S + 1  =(27-5+4)/1+1 = 27

1.2.4 Maxpool2层

Conv2: kernels:128*2=256  kernel_size:5  padding: [2, 2]  stride:1  output_size: [27, 27, 256]

Maxpool2:  kernel_size:3  pading: 0  stride:2

  • input_size:  [27, 27, 256]

  • output_size: [13, 13, 256]

N = (W − F + 2P ) / S + 1 = (27-3)/2+1 = 13

1.2.5 Conv3层

Maxpool2:  kernel_size:3  pading: 0  stride:2    output_size: [13, 13, 256]

Conv3:  kernels:192*2=384  kernel_size:3  padding: [1, 1]  stride:1

  • input_size:  [13, 13, 256]

  • output_size: [13, 13, 384]

N = (W − F + 2P ) / S + 1 =(13-3+2)/1+1  = 13

1.2.6 Conv4层

Conv3:  kernels:192*2=384  kernel_size:3  padding: [1, 1]  stride:1  output_size:  [13, 13, 384]

Conv4:  kernels:192*2=384  kernel_size:3  padding: [1, 1]  stride:1

  • input_size:   [13, 13, 384]

  • output_size: [13, 13, 384]

N = (W − F + 2P ) / S + 1 = (13-3+2)/1+1

1.2.7 Conv5层

Conv4:  kernels:192*2=384  kernel_size:3  padding: [1, 1]  stride:1  output_size:  [13, 13, 256]

Conv5:  kernels:128*2=256  kernel_size:3  padding: [1, 1]  stride:1

  • input_size:   [13, 13, 384]

  • output_size: [13, 13, 256]

N = (W − F + 2P ) / S + 1 = (13-3+2)/1+1

1.2.8 Maxpool3层

Conv5:  kernels:128*2=256  kernel_size:3  padding: [1, 1]  stride:1   output_size:  [13, 13, 256]

Maxpool3:   kernel_size:3  padding:0  stride:2

  • input_size:   [13, 13, 256]

  • output_size: [6, 6, 256]

N = (W − F + 2P ) / S + 1 = (13-3)/2+1 = 6

1.3 图像内部尺寸变换

layer_name

kernel_size

kernel_num

padding

stride

Conv1

11

96

[1, 2]

4

Maxpool1

3

None

0

2

Conv2

5

256

[2, 2]

1

Maxpool2

3

None

0

2

Conv3

3

384

[1, 1]

1

Conv4

3

384

[1, 1]

1

Conv5

3

256

[1, 1]

1

Maxpool3

3

None

0

2

FC1

2048

None

None

None

FC2

2048

None

None

None

FC3

1000

None

None

None

1.4 代码实现

1.4.1 导包

from tensorflow import keras
import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltcpu=tf.config.list_physical_devices("CPU")
tf.config.set_visible_devices(cpu)
print(tf.config.list_logical_devices())

1.4.2 函数式建模

# 函数式写法
def AlexNet(im_height=224, im_width=224, num_classes=1000):# 输入层input_image = keras.layers.Input(shape =(im_height, im_width, 3), dtype = tf.float32)# 手动实现padding, 周边补零填充x = keras.layers.ZeroPadding2D(((1, 2), (1, 2)))(input_image)# 卷积x = keras.layers.Conv2D(48, kernel_size = 11, strides = 4, activation = 'relu')(x)# 池化x = keras.layers.MaxPool2D(pool_size = 3, strides = 2)(x)# 第二层卷积x = keras.layers.Conv2D(128, kernel_size = 5, padding = 'same', activation = 'relu')(x)# 池化x = keras.layers.MaxPool2D(pool_size = 3, strides = 2)(x)# 卷积x = keras.layers.Conv2D(192, kernel_size = 3, padding = 'same', activation = 'relu')(x)x = keras.layers.Conv2D(192, kernel_size = 3, padding = 'same', activation = 'relu')(x)x = keras.layers.Conv2D(128, kernel_size = 3, padding = 'same', activation = 'relu')(x)# 池化 pool_sizex = keras.layers.MaxPool2D(pool_size = 3, strides = 2)(x)# 传链接x = keras.layers.Flatten()(x)# 加dropoutx = keras.layers.Dropout(0.2)(x)x = keras.layers.Dense(2048, activation = 'relu')(x)x = keras.layers.Dropout(0.2)(x)x = keras.layers.Dense(2048, activation = 'relu')(x)# 输出层x = keras.layers.Dense(num_classes)(x)# 预测predict = keras.layers.Softmax()(x)model = keras.models.Model(inputs = input_image, outputs = predict)return modelmodel = AlexNet(im_height= 224, im_width= 224, num_classes= 10)
model.summary()

1.4.3 数据处理

# 用10mokeys 进行使用举例
train_dir = './training/training/'
valid_dir = './validation/validation/'
# 数据整理  # 图片数据生成器
train_datagen = keras.preprocessing.image.ImageDataGenerator(rescale = 1.0/ 255,rotation_range= 40, width_shift_range= 0.2,height_shift_range= 0.2,shear_range = 0.2, zoom_range = 0.2,horizontal_flip = True,vertical_flip= True,fill_mode= 'nearest')height = 224
width = 224
channels = 3
batch_size = 32
num_classes = 10
train_generator = train_datagen.flow_from_directory(train_dir, target_size= (height, width),batch_size = batch_size,shuffle= True,seed = 7,class_mode = 'categorical')valid_dategen = keras.preprocessing.image.ImageDataGenerator(rescale = 1. / 255)
valid_generator = valid_dategen.flow_from_directory(valid_dir, target_size= (height, width),batch_size = batch_size,shuffle= True,seed = 7,class_mode = 'categorical')print(train_generator.samples)   # 1098
print(valid_generator.samples)   # 272

1.4.4 模型训练

model.compile(optimizer = 'adam',   # optimizer 优化器, 防止过拟合 loss = 'categorical_crossentropy',metrics = ['accuracy'])histroy = model.fit(train_generator,steps_per_epoch= train_generator.samples // batch_size,epochs = 10,validation_data= valid_generator,validation_steps= valid_generator.samples // batch_size)

VGG

2.1 简介

VGG在2014年由牛津大学著名研究组VGG (Visual Geometry  Group) 提出,斩获该年ImageNet竞  中 Localization Task (定位 任务) 第一名 和 Classification Task (分类任务) 第二名。

网络中的亮点:通过堆叠多个 3x3的卷积核 来替代大尺度卷积核(减少所需参数)

论文中提到,可以通过堆叠两个3x3积核替代5x5的卷积核堆叠三个3x3的卷积核替代7x7的卷积核

2.2 基本概念拓展CNN感受

在卷积神经网络中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野(receptive field)。通俗的解释是,输出feature map上的一个单元对应输入层上的区域大小

论文中提到,可以通过堆叠两个3x3的卷积核替代5x5的卷积核

堆叠三个3x3的卷积核替代7x7的卷积核

使用7x7卷积核所需参数,与堆叠三个3x3卷积核所需参数(假设输入输出channel为C)

7 * 7* C * C = 49C^2

3*3* C *C +3* 3*C *C+ 3* 3* C *C =27C^ 2

  • conv的stride为1,padding为1
  • maxpool的size为2,stride为2

2.3 代码实现

2.3.1 导包

from tensorflow import keras
import tensorflow as tf
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltcpu=tf.config.list_physical_devices("CPU")
tf.config.set_visible_devices(cpu)
print(tf.config.list_logical_devices())

2.3.2 创建模型

# 函数式写法
cfgs = {'vgg11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],'vgg13': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],'vgg16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],'vgg19': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M']}  # M:池化
def make_feature(cfg):feature_layers = []for v in cfg:if v == 'M':feature_layers.append(keras.layers.MaxPool2D(pool_size = 2, strides = 2))else:feature_layers.append(keras.layers.Conv2D(v, kernel_size = 3,padding = 'SAME',activation = 'relu'))return keras.Sequential(feature_layers, name = 'feature')  # 整体当做一层
# 定义网络结构
def VGG(feature, im_height = 224, im_width = 224, num_classes = 1000):input_image = keras.layers.Input(shape = (im_height, im_width, 3), dtype = 'float32')x = feature(input_image)x = keras.layers.Flatten()(x)  # 将flatten当做一个函数# dropout, 防止过拟合, 每次放弃部分参数x = keras.layers.Dropout(rate = 0.5)(x)# 原论文为4096x = keras.layers.Dense(512, activation = 'relu')(x)x = keras.layers.Dropout(rate = 0.5)(x)x = keras.layers.Dense(512, activation = 'relu')(x)x = keras.layers.Dense(num_classes)(x)output = keras.layers.Softmax()(x)model = keras.models.Model(inputs = input_image, outputs = output)return model
# 定义网络模型
def vgg(model_name = 'vgg16', im_height = 224, im_width = 224, num_classes = 1000):cfg = cfgs[model_name]model = VGG(make_feature(cfg), im_height = im_height, im_width= im_width, num_classes= num_classes)return model
vgg16 = vgg(num_classes = 10)

 

2.3.3 数据导入

# 用10mokeys 进行使用举例
train_dir = './training/training/'
valid_dir = './validation/validation/'# 数据整理
# 图片数据生成器
train_datagen = keras.preprocessing.image.ImageDataGenerator(rescale = 1.0/ 255,rotation_range= 40, width_shift_range= 0.2,height_shift_range= 0.2,shear_range = 0.2, zoom_range = 0.2,horizontal_flip = True,vertical_flip= True,fill_mode= 'nearest')height = 224
width = 224
channels = 3
batch_size = 32
num_classes = 10
train_generator = train_datagen.flow_from_directory(train_dir, target_size= (height, width),batch_size = batch_size,shuffle= True,seed = 7,class_mode = 'categorical')valid_dategen = keras.preprocessing.image.ImageDataGenerator(rescale = 1. / 255)
valid_generator = valid_dategen.flow_from_directory(valid_dir, target_size= (height, width),batch_size = batch_size,shuffle= True,seed = 7,class_mode = 'categorical')print(train_generator.samples)
print(valid_generator.samples)

2.3.4 模型训练

vgg16.compile(optimizer = 'adam',   # optimizer 优化器, 防止过拟合 loss = 'categorical_crossentropy',metrics = ['accuracy'])histroy = vgg16.fit(train_generator,steps_per_epoch= train_generator.samples // batch_size,epochs = 10,validation_data= valid_generator,validation_steps= valid_generator.samples // batch_size)

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...