当前位置:   article > 正文

经典卷积神经网络——VGGNet-16(超精炼,看完就会)_vgg16输入必须是244吗

vgg16输入必须是244吗

VGGNet简介

VGG的全称是Visual Geometry Group,隶属于牛津大学科学与工程系。它发布了一系列从VGG开始的卷积网络模型,从VGG16到VGG19,可应用于人脸识别和图像分类。VGG对卷积网络深度研究的初衷是要了解卷积网络的深度如何影响大规模图像分类和识别的准确率和准确率。

提出该网络结构的论文网址:https://arxiv.org/pdf/1409.1556

PS:完整的VGG16搭建代码在最下面,心急的小伙伴可直接使用

VGGNet网络结构

VGGNet 设计的输入为 224x244×3 大小的 RGB 图像,所使用的主要是三个元素:卷积层、最大池化层和全连接层。使用的所有卷积核尺寸为 3x3,步长是固定的 1×1,padding为‘same'的方式,并采用 relu 函数作为激活函数。所用的五个最大池化层窗口尺寸均为 2×2,步长同为 2×2。最终连接3个全连接层,它们的神经元分别是4096,4096和1000,也都采用relu作为激活函数。根据卷积层数+全连接层数的不同,可以分为从VGG11到VGG19不等。最小的 VGG11 有 8 个卷积层和 3 个全连接层;最大的 VGG19 有 16 个卷积层和3 个全连接;VGG16则是13个卷积层和3个全连接层。

VGG16的详细结构图:

VGG16网络层的输入输出图:

相信到这里基本能够理解了VGG16的结构,在搭建它之前我们再来看看另外几个VGG的详细结构吧,VGG11、13、16、19网络层结构如下图所示:

从上图可以看出来VGG系列在整体结构上都是异曲同工的,下面我们来搭建VGG16网络,小伙伴们也可以结合上图和下面的代码搭建出其他的VGG模型。

VGGNet-16代码实现:

  1. import tensorflow as tf
  2. from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D
  3. from tensorflow.keras.layers import Dense, Flatten
  4. from tensorflow.keras.models import Model
  5. def build_vgg16_model(input_shape):
  6. input_tensor = Input(shape=input_shape)
  7. # 第一块卷积层
  8. x = Conv2D(64, (3, 3), padding='same', activation='relu')(input_tensor)
  9. x = Conv2D(64, (3, 3), padding='same', activation='relu')(x)
  10. x = MaxPooling2D((2, 2))(x)
  11. # 第二块卷积层
  12. x = Conv2D(128, (3, 3), padding='same', activation='relu')(x)
  13. x = Conv2D(128, (3, 3), padding='same', activation='relu')(x)
  14. x = MaxPooling2D((2, 2))(x)
  15. # 第三块卷积层
  16. x = Conv2D(256, (3, 3), padding='same', activation='relu')(x)
  17. x = Conv2D(256, (3, 3), padding='same', activation='relu')(x)
  18. x = Conv2D(256, (3, 3), padding='same', activation='relu')(x)
  19. x = MaxPooling2D((2, 2))(x)
  20. # 第四块卷积层
  21. x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
  22. x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
  23. x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
  24. x = MaxPooling2D((2, 2))(x)
  25. # 第五块卷积层
  26. x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
  27. x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
  28. x = Conv2D(512, (3, 3), padding='same', activation='relu')(x)
  29. x = MaxPooling2D((2, 2))(x)
  30. # 展平
  31. x = Flatten()(x)
  32. # 全连接层
  33. x = Dense(4096, activation='relu')(x)
  34. x = Dense(4096, activation='relu')(x)
  35. # 输出层(分类), 多少分类就设置神经元是多少
  36. output = Dense(1000, activation='softmax')(x)
  37. # 构建模型
  38. model = Model(inputs=input_tensor, outputs=output)
  39. return model
  40. input_shape = (224, 224, 3)
  41. vgg16_model = build_vgg16_model(input_shape)
  42. # 模型训练参数
  43. epochs = 100
  44. batch_size = 256 # 大了很需要计算资源,可以设置得小一些
  45. # 定义优化器,在这里我们使用的是SGD
  46. optimizer = tf.keras.optimizers.SGD(
  47. learning_rate=0.001, # 可以根据你的需求调整学习率
  48. momentun=0.9 #动量设置为0.9
  49. )
  50. # 编译模型, 也可以更换其他的loss
  51. vgg16_model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])
  52. # 打印模型概览
  53. vgg16_model.summary()

至此,我们就搭建好了VGGNet-16,最后我们打印了模型概览来与下面的详细参数表对比一下是否一致吧。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/957594
推荐阅读
相关标签
  

闽ICP备14008679号