基于ResNet50做图片分类的tensorflow代码实现

目标任务:将数据集中5类美食图片进行分类,每一类有1000张图片,共5000张。

实验总结:刚开始设置训练集和验证集的比例为8:2,有些欠拟合,因此后来调整到了9:1;分别测试了原生的ResNet50、ResNet101、ResNet152和改进后的ResNet50、ResNet101,但最终在验证集上的最佳精度只能达到75%左右。

改进后的ResNet101表现:

  • 训练集和验证集的精确度变化

  •  训练集和验证集的损失值变化

实验环境:TensorFlow-2.1.0。

ResNet50结构:

ResNet-50 结构 - 简书 (jianshu.com)

ResNet有2个基本的block,一个是Identity Block,输入和输出的dimension是一样的,所以可以连续串联多个;另外一个基本的block是Conv Block,输入和输出的dimension不一样,所以不能连续串联,它的作用就是为了改变特征向量的dimension。

在这里插入图片描述

CNN最后都要把输入的图像逐步转换为平面尺度很小但是depth很深的feature map,一般采用统一的比较小的kernel(比如VGG用3*3)进行操作,但是随着网络深度的增加,output的channel也增大(学到的东西越来越复杂),所以有必要在进入Identity Block之前,用Conv Block转换一下维度,这样之后就可以连续堆积Identity Block。

这里写图片描述

Conv Block:

Identity Block:

Conv Block中,在shortcut path边加上一个conv2D layer(1*1 filter size),可以在main path改变dimension之后,保证shortcut path进行变换之后的输出维度与之相同。

ResNetV1-50流程如下, 不使用bottleneck, 且只有resnetv1在initial_conv后面做BN和Relu:

block_sizes=[3, 4, 6, 3]指的是stage1(first pool)之后的4个layer的block数, 分别对应res2,res3,res4,res5,
    每一个layer的第一个block在shortcut上做conv+BN, 即Conv Block
inputs: (1, 720, 1280, 3)
initial_conv:
    conv2d_fixed_padding()
    1. kernel_size=7, 先做padding(1, 720, 1280, 3) -> (1, 726, 1286, 3)
    2. conv2d kernels=[7, 7, 3, 64], stride=2, VALID 卷积. 7x7的kernel, padding都为3, 为了保证左上角和卷积核中心点对其
       (1, 726, 1286, 3) -> (1, 360, 640, 64)
    3. BN, Relu (只有resnetv1在第一次conv后面做BN和Relu)
initial_max_pool:
    k=3, s=2, padding='SAME', (1, 360, 640, 64) -> (1, 180, 320, 64)
以下均为不使用bottleneck的building_block
block_layer1:
    (有3个block, layer间stride=1(上一层做pool了), 64个filter, 不使用bottleneck(若使用bottleneck 卷积核数量需乘4))
    1. 第一个block:
    Conv Block有projection_shortcut, 且strides可以等于1或者2
    Identity Block没有projection_shortcut, 且strides只能等于1
        `inputs = block_fn(inputs, filters, training, projection_shortcut, strides, data_format)`
        shortcut做[1, 1, 64, 64], stride=1的conv和BN, shape不变
        然后和主要分支里input做3次卷积后的结果相加, 一起Relu, 注意block里最后一次卷积后只有BN没有Relu
        input:    conv-bn-relu-conv-bn-relu-conv-bn  和shortcut相加后再做relu
        shortcut: conv-bn                            
        shortcut: [1, 1, 64, 64], s=1, (1, 180, 320, 64) -> (1, 180, 320, 64)
        input做两次[3, 3, 64, 64], s=1的卷积, shape不变(1, 180, 320, 64) -> (1, 180, 320, 64) -> (1, 180, 320, 64)
        inputs += shortcut, 再relu
    2. 对剩下的2个block, 每个block操作相同:
        `inputs = block_fn(inputs, filters, training, None, 1, data_format)`
        shortcut直接和input卷积结果相加, 不做conv-bn
        input做两次[3, 3, 64, 64], s=1的卷积, shape不变(1, 180, 320, 64) -> (1, 180, 320, 64) -> (1, 180, 320, 64)
        inputs += shortcut, 再relu
block_l
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你这个代码我看不懂

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

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

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

打赏作者

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

抵扣说明:

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

余额充值