torch中创建multitask网络结构

本文详细介绍了如何使用Torch7中的nngraph包来构建复杂的神经网络结构,包括双分支网络和多输入网络的搭建过程。通过具体实例展示了nngraph相较于传统Sequential模块的优势。

Torch7入门续集补充--- nngraph包的使用

http://blog.youkuaiyun.com/hungryof/article/details/72902169

faster-rcnn.torch

https://github.com/andreaskoepf/faster-rcnn.torch/blob/master/models/model_utilities.lua

https://github.com/torch/nngraph/blob/master/README.md


直接上源码:

原本我们使用sequential,创建无分枝的网络结构是这样的。

require 'loadcaffe'

local cnn = loadcaffe.load('VGG_ILSVRC_19_layers_deploy_5.prototxt','VGG_ILSVRC_19_layers_5.caffemodel','nn'):float()

net = nn.Sequential()
for i = 1,3 do
net:add(cnn:get(i))
end

print(net:get(1).weight)

现在我们要使用nngraph,创建二分枝的网络结构式这样的。

require 'nn'
require 'nngraph'
require 'loadcaffe'

local cnn = loadcaffe.load('VGG_ILSVRC_19_layers_deploy_5.prototxt','VGG_ILSVRC_19_layers_5.caffemodel','nn'):float()

local h1 = nn.Identity()()

net_same = h1 - cnn:get(1) - cnn:get(2)

net_1 = net_same - cnn:get(3) - cnn:get(4)
net_2 = net_same - cnn:get(3) - cnn:get(4)

gmod = nn.gModule({h1},{net_1,net_2})

print(gmod:get(2))

forward得到的out可以分为两个:out[1]和out[2]

如果想把他们合并起来是:out = {out[1], our[2]}

其他都一样backward,updateGradInput等随便用就OK


如果input有两个,就是这样的。

h1 = - nn.Linear(20,20)
h2 = - nn.Linear(10,10)
hh1 = h1 - nn.Tanh() - nn.Linear(20,1)
hh2 = h2 - nn.Tanh() - nn.Linear(10,1)
madd = {hh1,hh2} - nn.CAddTable()
oA = madd - nn.Sigmoid()
oB = madd - nn.Tanh()
gmod = nn.gModule( {h1,h2}, {oA,oB} )

是不是特别简单,啊哈哈


SCA-ConvNet是一种结合了卷积神经网络(CNN)和注意力机制的深度学习模型,专门用于解决如牛体重估计等多任务学习问题。该模型通过整合多个相关任务的学习过程,提高了单个任务的预测性能[^1]。 ### 模型原理 #### 卷积神经网络 (CNN) 在SCA-ConvNet中,基础部分是传统的卷积神经网络,它负责从输入图像中提取特征。这些特征通常包括边缘、纹理以及更复杂的形状和对象部件[^2]。 #### 注意力机制 SCA-ConvNet引入了通道和空间注意力模块(SCA),以增强对关键特征的关注度。这种机制允许模型动态调整不同特征的重要性,从而提高识别精度。具体来说: - **通道注意力**:评估每个通道的重要性,并为它们分配不同的权重。 - **空间注意力**:关注图像中的特定区域,忽略不重要的背景信息[^3]。 #### 多任务学习框架 多任务学习是指同时学习多个相关的任务,利用任务间的共性来提升整体性能。SCA-ConvNet将牛体重估计作为主任务,同时可能还包含其他辅助任务,比如姿态识别或品种分类。共享底层特征表示的同时,针对各个任务设计独立的头部进行细化处理。这样做的好处是可以减少过拟合的风险并增加泛化能力[^4]。 ### 应用场景 SCA-ConvNet主要应用于畜牧业中的智能监控系统,特别是对于牛只管理有着重要意义。通过对视频流或者静态图片分析,可以非接触式地估算出牛的体重,这对于自动化农场管理和动物健康监测非常有用。此外,这种方法还可以扩展到其他家畜的体型测量上,例如猪、羊等[^5]。 ### 示例代码结构 下面是一个简化的SCA-ConvNet模型架构示例,使用PyTorch实现: ```python import torch.nn as nn class SCA_Module(nn.Module): def __init__(self, channel, reduction=16): super(SCA_Module, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channel, channel // reduction, bias=False), nn.ReLU(inplace=True), nn.Linear(channel // reduction, channel, bias=False), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y.expand_as(x) class SCA_ConvNet(nn.Module): def __init__(self, backbone, num_tasks=2): super(SCA_ConvNet, self).__init__() self.backbone = backbone # 假设已经定义好的CNN主干网络 self.sca = SCA_Module(backbone.output_channels) self.heads = nn.ModuleList([nn.Linear(backbone.output_channels, 1) for _ in range(num_tasks)]) def forward(self, x): features = self.backbone(x) attended_features = self.sca(features) outputs = [head(attended_features.mean([2,3])) for head in self.heads] return outputs ``` 此代码片段展示了如何构建一个带有SCA模块的基础网络,并且为每个任务创建独立的输出头。实际应用时需要根据具体的硬件配置和数据集特性进一步调整参数设置。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值