• AlexNet 06


    一、发展

    1989年,Yann LeCun提出了一种用反向传导进行更新的卷积神经网络,称为LeNet。

    1998年,Yann LeCun提出了一种用反向传导进行更新的卷积神经网络,称为LeNet-5

    AlexNet,VGG,GoogleNet,ResNet

    二、AlexNet

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

    AlexNet使用了8层卷积神经网络,它首次证明了学习到的特征可以超越手工设计的特征,从而一举打破计算机视觉研究的方向

    ISLVRC 2012

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

    验证集50,000张已标注图 

    测试集100,000张未标注图

    该网络的亮点在于

    1首次利用 GPU 进行网络加速训练。

    2使用了 ReLU 激活函数,而不是传统的 Sigmoid 激活函数以及 Tanh 激活函数。

    3使用了 LRN 局部响应归一化。(LPN是bn的变种)

    4在全连接层的前两层中使用了 Dropout 随机失活神经元操作,以减少过拟合。

    5 AlexNet引入了大量的图像增强,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。

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

    1.1 AlexNet详解

    网络分为上下两层,用两个GPU同时在跑

    第一层卷积:

    两个GPU跑,卷积核是48*2

    padding [1,2] 是左边一列0,右边两列0,上边一行0,下面两行0

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

      输入图片大小 W×W

    Filter大小 F×F

    步长 S

    padding的像素数 P

    第二层maxpool:

    第三层卷积:

     第四层maxpool:

     第五层卷积:

     第六层卷积:

     第七层卷积:

     第八层maxpool:

    1.2 AlexNet实现

    模型实现

    1. from tensorflow import keras
    2. import tensorflow as tf
    3. import numpy as np
    4. import pandas as pd
    5. import matplotlib.pyplot as plt
    6. # 函数式和子类.
    7. def AlexNet(im_height=224, im_width=224, num_classes=1000):
    8. input_image = keras.layers.Input(shape=(im_height, im_width, 3), dtype=tf.float32)
    9. # 手动padding
    10. x = keras.layers.ZeroPadding2D(((1, 2), (1, 2)))(input_image)
    11. x = keras.layers.Conv2D(48, kernel_size=11, strides=4, activation='relu')(x)
    12. x = keras.layers.MaxPool2D(pool_size=3, strides=2)(x)
    13. x = keras.layers.Conv2D(128, kernel_size=5, padding='same', activation='relu')(x)
    14. x = keras.layers.MaxPool2D(pool_size=3, strides=2)(x)
    15. x = keras.layers.Conv2D(192, kernel_size=3, padding='same', activation='relu')(x)
    16. x = keras.layers.Conv2D(192, kernel_size=3, padding='same', activation='relu')(x)
    17. x = keras.layers.Conv2D(128, kernel_size=3, padding='same', activation='relu')(x)
    18. x = keras.layers.MaxPool2D(pool_size=3, strides=2)(x)
    19. #全连接
    20. # 前面不管几维,都变成2维
    21. x = keras.layers.Flatten()(x)
    22. x = keras.layers.Dropout(0.2)(x) #随机去掉20%神经元
    23. x = keras.layers.Dense(2048, activation='relu')(x)
    24. x = keras.layers.Dropout(0.2)(x) #随机去掉20%神经元
    25. x = keras.layers.Dense(2048, activation='relu')(x)
    26. x = keras.layers.Dense(num_classes)(x) #num_classes 最后输出类别
    27. # 预测
    28. predict = keras.layers.Softmax()(x)
    29. model = keras.models.Model(inputs=input_image, outputs=predict)
    30. return model

    数据准备

    1. train_dir = './training/training/'
    2. valid_dir = './validation/validation/'
    3. # 图片数据生成器
    4. train_datagen = keras.preprocessing.image.ImageDataGenerator(
    5. rescale = 1. / 255,
    6. rotation_range = 40,
    7. width_shift_range = 0.2,
    8. height_shift_range = 0.2,
    9. shear_range = 0.2,
    10. zoom_range = 0.2,
    11. horizontal_flip = True,
    12. vertical_flip = True,
    13. fill_mode = 'nearest'
    14. )
    15. height = 224
    16. width = 224
    17. channels = 3
    18. batch_size = 32
    19. num_classes = 10
    20. train_generator = train_datagen.flow_from_directory(train_dir,
    21. target_size = (height, width),
    22. batch_size = batch_size,
    23. shuffle = True,
    24. seed = 7,
    25. class_mode = 'categorical')
    26. valid_datagen = keras.preprocessing.image.ImageDataGenerator(
    27. rescale = 1. / 255
    28. )
    29. valid_generator = valid_datagen.flow_from_directory(valid_dir,
    30. target_size = (height, width),
    31. batch_size = batch_size,
    32. shuffle = True,
    33. seed = 7,
    34. class_mode = 'categorical')
    35. print(train_generator.samples)
    36. print(valid_generator.samples)

    训练

    1. model = AlexNet(im_height=224, im_width=224, num_classes=10)
    2. model.summary()
    3. model.compile(optimizer='adam',
    4. loss='categorical_crossentropy',
    5. metrics=['acc'])
    6. history = model.fit(train_generator,
    7. steps_per_epoch=train_generator.samples // batch_size,
    8. epochs=10,
    9. validation_data=valid_generator,
    10. validation_steps = valid_generator.samples // batch_size
    11. )

  • 相关阅读:
    整理了一份七大专题的Java架构速成笔记
    标准流布局
    React学习笔记
    【自然语言处理(NLP)】基于循环神经网络实现情感分类
    U2Net网络简介
    JavaScript强制转换数字类型并设置默认值为0
    DAP+ESB预置样例组件配置心得
    Mysql索引失效的几种情况总结
    Vue tree树状结构数据转扁平数据
    【保姆级】WebSocket是什么有什么用
  • 原文地址:https://blog.csdn.net/peng_258/article/details/132742380