AlexNet 实现猫狗分类(keras and pytorch)

AlexNet 实现猫狗分类

前言

在训练网络过程中遇到了很多问题,先在这里抱怨一下,没有硬件条件去使用庞大的ImageNet2012 数据集 。所以在选择合适的数据集上走了些弯路,最后选择有kaggle提供的猫狗数据集,因为二分类问题可能训练起来比较容易一些。实验结果和代码我放在kaggle上了,有时会加载不出来。ipynb文件百度云里面也有 下载完成后用jupyter打开。下面附上链接

内容 地址
数据集 链接
kaggle实验过程 链接
百度云ipynb文件 链接 提取码:di7c

好,我们开始介绍吧!

AlexNet简介

首先呢,AlexNet是2012年,由Alex Krizhevsky、 llya Sutskever 和 Geoffrey E. Hinton 提出来的一种卷积神经网络模型,并获得了2012年ILSVRC图像分类大赛的冠军,自此呢也掀起了深度学习的热潮。神经网络通常都是直接上图比较直观。

在这里插入图片描述
看上去好像 很复杂的样子,其实由于当时硬件条件限制,所以将图片分成了两个部分,分别用两块GPU进行训练,分别放置了一半的卷积核。相比上一篇提到的LeNet, 它有很多优点。如下表所示:

技巧 AlexNet LeNet
Relu,多GPU 训练速度块 训练速度慢
局部响应归一化 提高了精度,缓解过拟合
数据扩充,丢失输出 减少过拟合

这里有争议的就是局部响应归一化(Local Response Normalization,简称LRN),在它之后有论文证明局部响应归一化并没有太大作用,我第一次实验也用的局部响应归一化但效果并不好,后面采用的是批标准化(BatchNormalization, 简称BN)。

网络结构

网络节后从图中可以详细看出,这里就不再进行赘述,我们可以看看keras搭建好的AlexNet网络结构:

Model: "AlexNet"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         [(None, 224, 224, 3)]     0         
_________________________________________________________________
zero_padding2d_2 (ZeroPaddin (None, 227, 227, 3)       0         
_________________________________________________________________
conv_block_1 (Conv2D)        (None, 55, 55, 96)        34944     
_________________________________________________________________
max_pooling_1 (MaxPooling2D) (None, 27, 27, 96)        0         
_________________________________________________________________
batch_normalization_12 (Batc (None, 27, 27, 96)        384       
_________________________________________________________________
conv_block_2 (Conv2D)        (None, 27, 27, 256)       614656    
_________________________________________________________________
max_pooling_2 (MaxPooling2D) (None, 13, 13, 256)       0         
_________________________________________________________________
batch_normalization_13 (Batc (None, 13, 13, 256)       1024      
_________________________________________________________________
conv_block_3 (Conv2D)        (None, 13, 13, 384)       885120    
_________________________________________________________________
max_pooling_3 (MaxPooling2D) (None, 6, 6, 384)         0         
_________________________________________________________________
batch_normalization_14 (Batc (None, 6, 6, 384)         1536      
_________________________________________________________________
conv_block_4 (Conv2D)        (None, 6, 6, 384)         1327488   
_________________________________________________________________
conv_block_5 (Conv2D)        (None, 6, 6, 256)         884992    
_________________________________________________________________
max_pooling_5 (MaxPooling2D) (None, 2, 2, 256)         0         
_________________________________________________________________
batch_normalization_15 (Batc (None, 2, 2, 256)         1024      
_________________________________________________________________
flatten (Flatten)            (None, 1024)              0         
_________________________________________________________________
fc_1 (Dense)                 (None, 4096)              4198400   
_________________________________________________________________
dropout_1 (Dropout)          (None, 4096)              0         
_________________________________________________________________
batch_normalization_16 (Batc (None, 4096)              16384     
_________________________________________________________________
fc_2 (Dense)                 (None, 4096)              16781312  
_________________________________________________________________
dropout_2 (Dropout)          (None, 4096)              0         
_________________________________________________________________
batch_normalization_17 (Batc (None, 4096)              16384     
_________________________________________________________________
dense_2 (Dense)              (None, 1000)              4097000   
=================================================================
Total params: 28,860,648
Trainable params: 28,842,280
Non-trainable params: 18,368

可以清楚的看到每一层网络的输入输出及节点数。我们不用ImageNet2012作为训练数据,这里直接用一块GPU训练就好。

注意事项

由于输入是224x224x3(HWC)大小的图片,但实际运算时使用的是227x227x3(HWC)大小的图片。所以又要进行填0操作:

 x = ZeroPadding2D(((3, 0), (3, 0)))(img_input)

下面请看详细代码:

  1. 构建网络模型:
#定义网络结构
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, Flatten, Lambda, MaxPooling2D, Dropout, Input, Dense,ZeroPadding2D,BatchNormalization
from tensorflow.python.keras import backend
from tensorflow.python.keras.engine import training
from tensorflow.python.keras.utils import layer_utils
from tensorflow.keras import optimizers, losses
  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__不想写代码__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值