目录
前言
这个是按照B站up主的教程学习这方面知识的时候自己做的的笔记和总结,可能有点乱,主要是按照我自己的记录习惯
参考内容来自:
- up主的b站链接:霹雳吧啦Wz视频专辑-霹雳吧啦Wz视频合集-哔哩哔哩视频
- up主将代码和ppt都放在了github:https://github.com/WZMIAOMIAO
- up主的csdn博客:深度学习在图像处理中的应用(tensorflow2.4以及pytorch1.10实现)_太阳花的小绿豆的博客-CSDN博客_深度学习图像处理需要哪些软件
ResNet网络结构,BN以及迁移学习详
ResNet详解
为什么这里强调了超深的网络,因为会产生梯度消失或者梯度爆炸;退化问题。
一般梯度消失或爆炸的解决方法:对数据进行标准化处理,或者权重标准化以及BN
一般退化问题(层数深的网络没有层数少的效果好):本文resnet中提出的残差结构
上图的右图是在原论文中搭建的一系列网路。
resnet中提出的残差结构
实现和虚线的残差结构有不同,实现的输入输出的形状不变
原论文给出的参数列表
BN
使用迁移学习的优势
1.能够快速的训练出一个理想的结果
2.当数据集较小的时候也能训练出理想的效果
注:使用别人预训练模型参数时,要注意别人的预处理方式
迁移学习介绍
将学习到的网络的浅层的网络迁移到新的网络中,这样新的网络也拥有了学习底层通用特征的能力了 ,这样新的网络就可以更加快速的去学习新的特征
常见的迁移学习方式
1.载入权重后训练所有参数
2.载入权重后只训练最后几层参数
3.载入权重后在原网络基础上再添加一层全连接层,仅仅训练最后一个全连接层
ResNeXt网络结构
作者仍然有何凯明大神
使用pytorch搭建ResNet并基于迁移学习训练
model.py
import torch.nn as nn
import torch
class BasicBlock(nn.Module):
expansion = 1 # 对应残差结构中主分支采用的卷积核的个数是否发生变化
def __init__(self, in_channel, out_channel, stride=1, downsample=None, **kwargs): # downsample=None 下采样:对应虚线的残差结构
super(BasicBlock, self).__init__()
self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel,
kernel_size=3, stride=stride, padding=1, bias=False) # stride=1对应实线的残差结构
# 使用batch normalization时不需要使用偏置, bias = False
self.bn1 = nn.BatchNorm2d(out_channel) # out_channel对应输入特征矩阵的深度
self.relu = nn.ReLU()
self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel,
kernel_size=3, stride=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(out_channel)
self.downsample = downsample
def forward(self, x):
identity = x
if self.downsample is not None: # 没有输入下采样
identity = self.downsample(x)
out = self.conv1(x)