import torch.nn as nn
import torch
# Resnet的pytorch实现
# 残差结构
class BasicBlock(nn.Module):
# 对应残差结构中,同一卷积层 每层卷积核的个数是否发生改变
# 在图中可以看到18层和34层的卷积核个数没有发生改变
expansion = 1
# 初始化函数,参数依次为:
# 输入特征矩阵深度: in_channel
# 输出特征矩阵深度(图中卷积核个数): out_channel
# 步距stride默认=1,对应的是实线的残差结构
# 下采样downsample默认设置为None,对应是我们的虚线的残差结构
# 在conv3,4,5中第一层都是虚线的残差结构,输入不符合,起到降维的作用
def __init__(self, in_channel, out_channel, stride=1, downsample=None):
super(BasicBlock, self).__init__()
# 第一层
# kernel_size卷积核大小,是3x3的
# stride步距=1,对应的是实线的残差结构(不改变宽高)
# 偏置=False, 使用bn层的时候不使用偏置
self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel,
kernel_size=3, stride=stride, padding=1, bias=False)
# 使用BN时,将bias=False
# 将BN层放在卷积层conv和激活层relu之间
self.bn1 = nn.BatchNorm2d(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): # 正向传播过程,x为输入的特征矩阵
identity = x # 将x赋值给捷径分支的输出identity
if self.downsample is not None: # =none没有输入下采样函数,对应实线残差结构,跳过此部分
# is not None输入了下采样函数,对应虚线残差结构,将输入特征矩阵输入下采样中,得到捷径分支identity的输出
identity = self.downsample(x)
# 主分支
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
# 主分支的输出+捷径分支的输出,再使用激活函数(相加再经过激活函数)
out += identity
out = self.relu(out)
# 返回残差结构的最终输出
return out
class Bottleneck(nn.Module):
# 针对更深层次的残差结构
# 以50层conv2_x为例,卷积层1、2的卷积核个数=64,而第三层卷积核个数=64*4=256,故expansion = 4
# 在图中可以看到
expansion = 4
def __init__(self, in_channel, out_channel, stride=1, downsample=None):
super(Bottleneck, self).__init__()
# 对于第一层卷积层,无论是实线残差结构还是虚线,stride都=1
# 这里是out_channels卷积核个数是指第一层和第二层的卷积核个数
self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel,
kernel_size=1, stride=1, bias=False) # squeeze channels
self.bn1 = nn.BatchNorm2d(out_channel)
# 对于第二层卷积层,实线残差结构和虚线的stride是不同的,stride采用传入的方式
self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel,
kernel_size=3, stride=stride, bias=False, padding=1)
self.bn2 = nn.BatchNorm2d(out_channel)
# 第三层out_channels是第一第二层的四倍
self.conv3 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel * self.expansion,
kernel_size=1, stride=1, bias=False) # unsqueeze channels
self.bn3 = nn.BatchNorm2d(out_channel * self.expansion)
self.relu = nn.ReLU(inplace=True)
self.downsample = downsample
# 正向传播过程
def forward(self, x):
identity = x
# self.downsample=none对应实线残差结构,否则为虚线残差结构
if self.downsample is not None:
identity = self.downsample(x)
out = self.conv1(x) # 卷积层
out = self.bn1(out) # BN层
out = self.relu(out) # 激活层
out = self.conv2(out)
out = self.bn2(out)
out = self.relu(out)
out = self.conv3(out)
out = self.bn3(out)
out += identity
out = self.relu(out)
return out
class ResNet(nn.Module):
# 浅层网络结构block=BasicBlock,深层=Bottleneck
# blocks_num所使用的残差结构的数目(列表),若是一个34层网络结构,blocks_num=[3,4,6,3]
# num_classes训练集的分类个数
# include_top参数便于在ResNet网络基础上搭建更复杂的网络
def __init__(self, block, blocks_num, num_classes=1000, include_top=True):
super(ResNet, self).__init__()
self.include_top = include_top
# 输入特征矩阵的深度(经过最大下采样层之后的)
self.in_channel = 64
# 第一个卷积层,对应表格中7*7的卷积层,输入特征矩阵的深度RGB图像,故第一个参数=3
self.conv1 = nn.Conv2d(3, self.in_channel, kernel_size=7, stride=2,
padding=3, bias=False)
self.bn1 = nn.BatchNorm2d(self.in_channel)
self.relu = nn.ReLU(inplace=True)
# 对应3*3那个maxpooling
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
# conv2_x对应的残差结构,是通过_make_layer函数生成的
self.layer1 = self._make_layer(block, 64, blocks_num[0])
# conv3_x
self.layer2 = self._make_layer(block, 128, blocks_num[1], stride=2)
# conv4_x
self.layer3 = self._make_layer(block, 256, blocks_num[2], stride=2)
# conv5_x
self.layer4 = self._make_layer(block, 512, blocks_num[3], stride=2)
if self.include_top:
# 平均池化下采样层,AdaptiveAvgPool2d自适应的平均池化下采样操作,所得到特征矩阵的高和宽都是(1,1)
# output size = (1, 1)
self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
# 全连接层(输出节点层)
self.fc = nn.Linear(512 * block.expansion, num_classes)
# 卷积层初始化操作
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
# block为BasicBlock或Bottleneck
# channel残差结构中所对应的第一层的卷积核的个数(值为64/128/256/512)
# block_num对应残差结构中每一个conv*_x卷积层的个数(该层一共包含了多少个残差结构)例:34层的conv2_x:block_num取值为3
def _make_layer(self, block, channel, block_num, stride=1):
downsample = None # 下采样赋值为none
# 对于18层、34层conv2_x不满足此if语句(不执行)
# 而50层、101层、152层网络结构的conv2_x的第一层也是虚线残差结构,需要调整特征矩阵的深度而高度和宽度不需要改变
# 但对于conv3_x、conv4_x、conv5_x不论ResNet为多少层,特征矩阵的高度、宽度、深度都需要调整(高和宽缩减为原来的一半)
if stride != 1 or self.in_channel != channel * block.expansion:
# 生成下采样函数
downsample = nn.Sequential(
nn.Conv2d(self.in_channel, channel * block.expansion, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(channel * block.expansion))
layers = [] # 定义一个空列表
# 参数依次为输入特征矩阵的深度,残差结构所对应主分支上第一
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本设计源码提供了一个基于pear-admin-flask的病害识别平台。项目包含1148个文件,主要使用JavaScript、Python、CSS、HTML和Shell编程语言。文件类型包括496个PNG图片文件、173个JavaScript脚本文件、93个Python源代码文件、88个CSS样式文件、80个GIF图片文件、49个HTML页面文件、46个JPG图片文件、39个SVG文件、20个JSON配置文件和16个Map文件。该平台基于resnet152模型进行病害识别,并使用pear-admin-flask进行二次开发。适合用于学习和实践JavaScript、Python技术,以及开发病害识别相关的平台。
资源推荐
资源详情
资源评论
收起资源包目录
基于pear-admin-flask的病害识别平台二次开发设计源码 (1150个子文件)
__init__ 217B
layui.css 84KB
layui.css 71KB
skin.css 71KB
skin.css 71KB
skin.min.css 60KB
skin.min.css 59KB
toast.css 59KB
main.css 41KB
loading.css 25KB
skin.mobile.css 24KB
skin.mobile.css 24KB
content.css 24KB
content.inline.css 23KB
content.inline.css 23KB
content.css 23KB
iconfont.css 23KB
content.min.css 21KB
content.inline.min.css 21KB
content.inline.min.css 21KB
content.min.css 21KB
skin.mobile.min.css 21KB
skin.mobile.min.css 21KB
select.css 19KB
layer.css 14KB
layer.css 14KB
ui.css 12KB
layout.css 11KB
fui.css 10KB
layui.mobile.css 10KB
demo.css 8KB
icon.css 8KB
admin.css 8KB
iconfont.css 8KB
laydate.css 7KB
fui.min.css 7KB
notice.css 7KB
laydate.css 7KB
tab.css 6KB
dtree.css 5KB
menu.css 5KB
dtreefont.css 4KB
cropper.css 4KB
button.css 3KB
frame.css 3KB
content.css 2KB
content.css 2KB
console1.css 2KB
content.css 2KB
content.css 2KB
login.css 2KB
console2.css 2KB
table.css 2KB
load.css 2KB
card.css 2KB
loader.css 2KB
content.min.css 2KB
scrollbar.css 1KB
content.min.css 1KB
content.min.css 1KB
content.min.css 1KB
step.css 1KB
code.css 1KB
form.css 1KB
message.css 1KB
person.css 1KB
user.css 1KB
tag.css 1KB
code.css 1KB
base.css 1KB
error.css 915B
pear.css 864B
skin.shadowdom.css 833B
skin.shadowdom.css 833B
skin.shadowdom.min.css 786B
skin.shadowdom.min.css 786B
content.mobile.css 727B
content.mobile.css 727B
content.mobile.min.css 595B
content.mobile.min.css 595B
result.css 569B
style.css 428B
treetable.css 394B
link.css 218B
page.css 153B
department.css 150B
code.css 126B
layer.css 111B
topBar.css 85B
label.css 0B
Dockerfile 769B
iconfont.eot 51KB
iconfont.eot 41KB
iconfont.eot 27KB
dtreefont.eot 19KB
.flaskenv 552B
59.gif 10KB
22.gif 10KB
24.gif 8KB
13.gif 7KB
共 1150 条
- 1
- 2
- 3
- 4
- 5
- 6
- 12
资源评论
沐知全栈开发
- 粉丝: 4767
- 资源: 3372
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功