PaddlePaddle——基于高层API从零搭建网络模型的Demo(2.0+版本)

网络结构搭建统一框架

(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))

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值