网络结构搭建统一框架
(1)模型搭架的主体代码框架
无论你想搭架什么样的网络,都可以通过以下的代码框架进行你的模型网络组建:
class xxxNet(nn.Layer):
def __init__(self, num_classes=XX):
super(xxxNet, self).__init__()
# (1)特征提取层组网
self.feature = nn.Sequential(xxx)
# (2)全连接层组网
self.fc = nn.Sequential(xxx)
# (3)前向网络组网
def forward(self, inputs):
y = self.features(inputs)
y = paddle.flatten(y, 1)
out = self.fc(y)
return out
# (4)网络初始化
Network_xxxNet = xxxNet()
# (5)查看网络结构
paddle.summary(Network_xxxNet, input_size=(1, 3, xxx, xxx))
组网代码详解:
class xxxNet(nn.Layer):
'''
xxxNet网络结构
'''
def __init__(self, num_classes=XX):
super(xxxNet, self).__init__()
# (1)特征提取层组网
self.feature = nn.Sequential(
'''
# 此处放置各种网络结构,例如:
nn.Conv2D(1, 6, 3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2D(2, 2)
'''
)
# (2)全连接层组网
self.fc = nn.Sequential(
'''
# 此处为全连接层的网络结构,例如:
nn.Linear(340, 120),
nn.Linear(120, num_classes) # 最后输出的是分类类别个数
nn.Softmax()
'''
)
# (3)前向网络组网
def forward(self, inputs):
y = self.features(inputs)
y = paddle.flatten(y, 1)
out = self.fc(y)
return out
API文档:模型组网相关API参考
(2)组网并查看模型的结构
# (4)网络初始化
Network_xxxNet = xxxNet()
# (5)查看网络结构
paddle.summary(Network_xxxNet, input_size=(1, 3, xxx, xxx))
input_size
:是模型网络输入的shape,即:(1, [通道数], [图像宽], [图像高])
,例如:如果是三通道RGB的480*640的图像输入,则为(1, 3, 480, 640)
。
搭建AlexNet网络结构
import paddle.nn as nn
import paddle
class AlexNet(nn.Layer):
def __init__(self, num_class=10):
# super(AlexNet, self):继承了父类;super(AlexNet, self).__init__():继承了父类后执行父类的__init__()函数,相当于初始化父类了
super(AlexNet, self).__init__()
self.feature = nn.Sequential(
# 第一层卷积
nn.Conv2D( in_channels=3, # 输入3通道(RGB图像)
out_channels=96, # 输出通道数
kernel_size=11, # 卷积核尺寸
stride=4, # 步长
padding='VALID'), # padding
nn.BatchNorm(num_channels=96), # 批归一化层
# nn.BatchNorm:实现了批归一化层(Batch Normalization Layer)的功能,可用作卷积和全连接操作的批归一化函数,根据当前批次数据按通道计算的均值和方差进行归一化。
nn.ReLU(),
nn.MaxPool2D(kernel_size=3, stride=2),
# 第二层卷积
nn.Conv2D(in_channels=96, out_channels=256, kernel_size=5, stride=1, padding=2),
nn.BatchNorm(num_channels=256),
nn.ReLU(),
nn.MaxPool2D(kernel_size=3, stride=2),
# 第三层卷积
nn.Conv2D(in_channels=256, out_channels=384, kernel_size=3, stride=1, padding=1), # padding='SAME'指保持特征图尺寸不变的padding填充算法
nn.ReLU(),
# 第四层卷积
nn.Conv2D(in_channels=384, out_channels=384, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
# 第五层卷积
nn.Conv2D(in_channels=384, out_channels=256, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2D(kernel_size=3, stride=2),
)
self.fc = nn.Sequential(
nn.Linear(in_features=9216, out_features=2048*2), # 这里的in_features应当由池化层flatten之后得到。
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(in_features=2048*2, out_features=2048*2),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(2048*2, num_class),
nn.Softmax()
)
def forward(self, inputs):
y = self.feature(inputs)
y = paddle.flatten(y, 1)
print(y)
out = self.fc(y)
return out
Network_AlexNet = AlexNet()
paddle.summary(Network_AlexNet, input_size=(1, 3, 227, 227))