双流棠湖中学怎么样_成都13区排名NO.1的最牛中学盘点!有你的学校吗?

成都中心城区,包含“5+2”区域和新6区,各区都有着许多优质的中学,今天小编就带大家细数成都中心城区各区中学里的TOP1,你的学校也在其中吗?

注:479三校七区为市直属,还有民办高中,均不列入讨论~

锦江区

川师附中

68cf7af2ec69959cac472ca8158d3670.png

一、基本信息

学校简介:四川师大附中是一所纯公办学校,简称“四川师大附中”、“川师附中”、“师大附中”,是四川省首批重点中学、四川省首批授牌的国家级示范性高中、首批四川省一级示范性高中。

学校类型:公办(省一级)

学校地址:锦江区劼人路318号

学校电话:028-84760224

二、学校情况(2019年)

e53f0c1ee7b78fab4350b08fcbf8e901.png

(点击图片放大)

金牛区

七中万达

5e97eedbe23e8ff2084b1a722ec0f5d4.png

一、基本信息

学校简介:七中万达是由金牛区教育局主办,七中领办、大连万达投资建造的金牛区的公办学校。作为七中教育集团下的领办学校,得到七中的大力支持。

学校类型:公办(省二级)

学校地址:金牛区盛安路一号

学校电话:028-62019568

二、学校情况(2019年)

6e9198f2685cd5a8bb567cc1294d0381.png

(点击图片放大)

青羊区

树德协进

cb4626d7cd3adab8724ead07dc47b5cd.png

一、基本信息

学校简介:位于成都市西胜街18号,前身为四川省立一中,成立于1913年,1933年更名为成都市协进中学,其意为“协同一致,努力奋进”。

学校类型:公办(省二级)

学校地址:成都市西胜街18号

学校电话:86640532

二、学校情况(2019年)

6c3bbabca3fdbd48fa1abf75086ac775.png

(点击图片放大)

武侯区

川大附中

f6e4efd66534f9b337a1788c5eb543f8.png

一、基本信息

学校简介:川大附中全名是四川大学附属中学,又名十二中。2008年武侯区投资了1.5亿对学校高中部(望江校区)进行了全面的改建,现拥有独立的室内体育馆、2个可容纳400-900人的学术报告厅,硬件设施有所上升。

学校类型:公办(省一级)

学校地址:成都市武侯区太平南新街68号

学校电话:028-85442231

二、学校情况(2019年)

27200eef5d3210dda8c6ebc1525592e8.png

(点击图片放大)

成华区

列五中学

856dc3d62cd9c18f32298c7c734e66ec.png

一、基本信息

学校简介:四川省成都列五中学位于成都市成华区,是四川省首批重点中学、四川省一级示范性普通高中。

学校类型:省一级(公办)

学校地址:双林路双园巷9号

学校电话:028-84337358

二、学校情况(2019年)

db7ded3d9c57b84ac5472dd59929939a.png

(点击图片放大)

高新区

石室天府

9c53632579fea78b0f09f442b63b37c2.png

一、基本信息

学校简介:成都石室天府中学是成都高新区管委会直属的一所公立寄宿制完全中学。

学校类型:公办(省二级)

学校地址:高新区剑南大道北段590号

学校电话:028-69762136

二、学校情况(2019年)

a033d245c7c655e682d9acbb79416a24.png

(点击图片放大)

天府新区

华阳中学

21ea15752e61d78a5ce1a35657805864.png

一、基本信息

学校简介:位于天府新区成都直管区,是第一所中国教育学会实验中学、四川省一级示范性高中。

学校类型:公办(省一级)

学校地址:天府新区华阳四河路99号

学校电话:028-85624779

二、学校情况(2019年)

c68929f37a6128afcd857d87581bcc61.png

(点击图片放大)

新都区

新都一中

e50b0645a094981ce4ffe011f9faae24.png

一、基本信息

学校简介:坐落于省会成都市新都区,是四川省首批省级重点中学、国家级示范性普通高中。

学校类型:公办(省一级)

学校地址:新都区蜀龙大道北段555号

学校电话:028-83975830

二、学校情况(2019年)

a92d62b5e696500a9877691dd430baa1.png

(点击图片放大)

双流区

棠湖中学

8f4e6996ea11ddf2f0569674f632acb4.png

一、基本信息

学校简介:成都市双流区教育局直属中学、四川省一级示范性普通高中

学校类型:公办(省一级)

学校地址:双流区双江路二段188号

学校电话:85805900

二、学校情况(2019年)

7fb2efbe25f975ef08a7b9fecb54d31e.png

(点击图片放大)

郫都区

郫都一中

92fecaf49f3ed27c733892ac6b1de7fa.png

一、基本信息

学校简介:四川省一级示范高中,前身为1753年创办的岷阳书院。

学校类型:公办(省一级)

学校地址:郫都区郫筒镇望丛中路387号

学校电话:028-87923433

二、学校情况(2019年)

1f8284b5203db59c7624cf72d7db32c3.png

(点击图片放大)

青白江区

大弯中学

0f74ffc1c0b95de6361922bb19a56ff2.png

一、基本信息

学校简介:坐落在风光秀丽的蓉城北郊青白江区大弯街道办事处,创建于1957年。

学校类型:公办(省一级)

学校地址:青白江区学苑路28号

学校电话:028-83667021

二、学校情况(2019年)

f64f1bfde0002c226a0031c745c97c25.png

(点击图片放大)

龙泉驿区

龙泉中学

9dbc5dd5d66cf1b478e31c32a4bd6740.png

一、基本信息

学校简介:学校源于1944年的简阳县龙泉镇初级中学,1959年更名为四川省成都市龙泉中学校。简称龙泉一中,是四川省国家级示范性普通高中、四川省一级示范高中。

学校类型:公办(省一级)

学校地址:龙泉驿区鲸龙路1057号

学校电话:66737330

二、学校情况(2019年)

8df2fd3a1014061ae48f7e2914e11c77.png

(点击图片放大)

温江区

温江中学

7d3823e5ddf9639503feea32ce974566.png

一、基本信息

学校简介:地处古鱼凫王国腹心地带四川省成都市温江区内,是四川省首批重点中学、国家级示范性高中。

学校类型:公办(省一级)

学校地址:温江区花都大道398号

学校电话:028-82606421

二、学校情况(2019年)

2e56b7eade19e1131f7bf108987c4ecb.png
import torchimport torch.nn as nnfrom torch.nn import initfrom resnet import resnet50, resnet18class Normalize(nn.Module):def __init__(self, power=2):super(Normalize, self).__init__()self.power = powerdef forward(self, x):norm = x.pow(self.power).sum(1, keepdim=True).pow(1. / self.power)out = x.div(norm)return outclass Non_local(nn.Module):def __init__(self, in_channels, reduc_ratio=2):super(Non_local, self).__init__()self.in_channels = in_channelsself.inter_channels = reduc_ratio//reduc_ratioself.g = nn.Sequential(nn.Conv2d(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1, stride=1,padding=0),)self.W = nn.Sequential(nn.Conv2d(in_channels=self.inter_channels, out_channels=self.in_channels,kernel_size=1, stride=1, padding=0),nn.BatchNorm2d(self.in_channels),)nn.init.constant_(self.W[1].weight, 0.0)nn.init.constant_(self.W[1].bias, 0.0)self.theta = nn.Conv2d(in_channels=self.in_channels, out_channels=self.inter_channels,kernel_size=1, stride=1, padding=0)self.phi = nn.Conv2d(in_channels=self.in_channels, out_channels=self.inter_channels,kernel_size=1, stride=1, padding=0)def forward(self, x):''':param x: (b, c, t, h, w):return:'''batch_size = x.size(0)g_x = self.g(x).view(batch_size, self.inter_channels, -1)g_x = g_x.permute(0, 2, 1)theta_x = self.theta(x).view(batch_size, self.inter_channels, -1)theta_x = theta_x.permute(0, 2, 1)phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)f = torch.matmul(theta_x, phi_x)N = f.size(-1)# f_div_C = torch.nn.functional.softmax(f, dim=-1)f_div_C = f / Ny = torch.matmul在这个代码上改进成双流网络 将网络的第一层浅层卷积块独立 分别提取可见光和红外图像的信息 后四层深层卷积块共享 提取不同模态的行人共享特征 在第三层和第四层之间加入CMA模块 第五层之后加入PAM模块 后面不用改变的完整的模型代码
03-31
<think>好的,我现在需要帮用户解决如何基于PyTorch构建一个双流网络的问题。用户的具体要求是:第一层卷积块分别处理可见光和红外图像,后四层卷积块共享,第三层和第四层之间加入CMA模块,第五层之后加入PAM模块。并且要给出完整的改进版模型代码。 首先,我得理清楚双流网络的结构。双流网络通常有两个分支处理不同的输入,然后在某个阶段合并。这里用户要求前两个卷积块是独立的,处理不同的模态,后面四个卷积块共享。所以需要设计两个独立的前端,然后合并到共享的后续层。 接下来是模块的位置。CMA模块放在第三层和第四层之间,也就是在第三个卷积块之后。而PAM模块在第五层之后,也就是第五个卷积块之后。需要确认这些模块的输入输出维度是否匹配,可能需要调整通道数或者进行其他处理。 然后,我需要参考用户提供的引用内容。比如引用[1]提到双模特征融合的优势,引用[3]和[4]涉及跨模态的方法,特别是引用[4]提到了跨模态Transformer,可能对CMA和PAM的设计有参考价值。不过用户没有给出CMA和PAM的具体结构,所以可能需要假设这两个模块的结构,或者参考常见的注意力机制模块,比如通道注意力(Channel Attention)和空间注意力(Spatial Attention)模块,或者跨模态注意力。 假设CMA是跨模态注意力模块,用于融合两种模态的特征;PAM可能是位置注意力模块,用于捕捉空间信息。需要定义这两个模块的PyTorch实现。 接下来是模型的结构设计。首先定义两个独立的分支,每个分支处理不同的输入模态(可见光和红外)。每个分支可能包含一个卷积块,比如ConvBlock,包含卷积层、BN、激活函数等。然后,后面的四个卷积块是共享的,所以需要将两个分支的特征在某个点合并,然后输入到共享的层中。 但用户的要求是“后四层卷积块共享”,也就是前两个层是独立的,后面四层共享。这里可能需要明确,比如假设整个网络有五个卷积块,第一层是独立的两个分支,后面四层共享。例如,网络结构分为五个卷积块,第一个块是双流的,后面四个块共享。 然后,在第三个和第四个块之间加入CMA模块,第五个块之后加入PAM模块。需要确定模块的位置是否正确,比如第三个块之后指的是第三个块输出后,进入第四个块之前,应用CMA。第五个块之后应用PAM。 接下来,编写代码的大致步骤: 1. 定义基础的卷积块(ConvBlock),包含卷积、BN、ReLU等。 2. 定义CMA和PAM模块的结构。 3. 构建双流网络,前两个卷积块分开处理两种输入,然后合并到共享的后续层。 4. 在第三层后添加CMA,第五层后添加PAM。 5. 测试模型的前向传播是否符合预期。 可能遇到的问题: - 如何合并两个分支的特征?是否在第一个卷积块之后将两个特征相加或者拼接?用户没有说明,可能需要假设。例如,每个分支处理输入后,将特征图相加,然后输入到共享的层中。 - CMA模块的输入是来自共享层之前的特征还是单独的分支?根据用户描述,可能是在共享层中的第三层之后添加,所以输入是共享层的特征。 - 需要确保各层的通道数和尺寸匹配,比如卷积的步幅和padding设置正确。 现在,考虑代码结构。例如,定义一个双流网络类,包含两个独立的前端分支(每个分支一个ConvBlock),然后四个共享的ConvBlock。然后在前向传播中,分别处理两个输入,经过各自的第一层,然后合并(比如相加或拼接),再经过共享的层。在第三层后应用CMA,第五层后应用PAM。 假设合并方式是拼接,那么可能需要调整后续层的输入通道数。例如,每个分支第一层输出64通道,合并后是128通道,那么后续共享层的第一层需要接受128通道。但用户可能希望合并后共享层保持相同的通道数,所以可能需要调整合并方式,比如相加,这样通道数不变。 假设每个分支的第一个ConvBlock输出64通道,那么合并后的输入到共享层是64通道(如果相加的话)。然后共享的后续层处理64通道的特征。 但用户可能希望两个分支各自处理输入后,将特征合并,可能通过拼接或其他方式。或者,可能每个分支的第一层处理后,将两个特征相加,然后输入到共享层。需要明确这一点。 例如,可见光输入经过第一个分支的ConvBlock1,得到特征A;红外输入经过另一个分支的ConvBlock2,得到特征B。然后将A和B相加,得到融合后的特征,输入到共享的ConvBlock3到ConvBlock6。但用户要求“后四层卷积块共享”,也就是前两个层是独立的,后面四个共享。可能整个模型有六个卷积块?或者用户的意思是前两个卷积块是独立,后面四个共享? 可能用户的意思是整个网络有五个卷积块,其中第一层是双流,后面四层共享。例如: 网络结构: - 分支1:ConvBlock1 (处理可见光) - 分支2:ConvBlock1 (处理红外) - 共享的ConvBlock2, ConvBlock3, ConvBlock4, ConvBlock5 - 在ConvBlock3和ConvBlock4之间加入CMA - 在ConvBlock5之后加入PAM 或者,可能原模型有五个卷积块,用户要求第一个是独立的双流,后面四个共享。例如: 原模型有五个卷积块,现在改为第一个是双流,后面四个共享,并在第三和第四之间加CMA,第五之后加PAM。 需要明确层数。例如,原模型可能包含多个卷积块,比如ResNet的基础结构。但用户没有提供原始代码,所以需要假设。 假设原模型的结构类似于ResNet,有五个卷积块(比如conv1到conv5),用户希望将conv1作为双流,conv2到conv5共享,并且在conv3和conv4之间加CMA,在conv5之后加PAM。 现在,根据这些假设,开始编写代码。 首先定义ConvBlock,可能包含卷积层、BN、ReLU,可能还有池化等。 然后定义双流部分:可见光分支和红外分支各自有一个ConvBlock。然后合并后的特征进入共享的ConvBlock2到 ConvBlock5。 在ConvBlock3之后添加CMA模块,在ConvBlock5之后添加PAM模块。 另外,需要考虑前向传播时,如何处理两个输入,并经过各个模块。 例如,模型的前向函数可能接收两个输入:visible和infrared。每个输入经过各自的第一层,然后合并,再经过共享层,并在指定位置添加模块。 假设合并方式是拼接,那么后续的共享层需要处理双倍通道数。但可能用户希望相加,这样通道数不变,所以共享层的输入通道数不变。 或者,可能每个分支的第一层输出相同的通道数,然后将它们的特征相加,得到融合后的特征,再输入到共享层。 例如: 可见光输入经过ConvBlock1_vis,输出特征vis_feat 红外输入经过ConvBlock1_ir,输出特征ir_feat fused_feat = vis_feat + ir_feat 然后进入共享的ConvBlock2到 ConvBlock5。 然后,在ConvBlock3之后应用CMA模块,可能是在共享的特征上进行跨模态注意力处理。或者,可能需要保留两个分支的特征,在特定层进行融合。不过根据用户描述,后四层是共享的,所以可能融合后的特征进入共享层,之后不再分分支。 但用户提到CMA和PAM模块的位置,可能这些模块是在共享层之间添加的,用于进一步的特征增强。 现在,关于CMA和PAM的具体实现,用户没有给出,需要假设。例如: CMA模块可能是一个跨模态注意力模块,用于在共享的特征上融合不同模态的信息。或者,可能是在第三层后引入某种注意力机制。但根据用户的需求,可能CMA是通道和空间注意力的组合,或者跨模态的注意力。 但假设CMA是通道注意力模块,PAM是空间注意力模块,类似CBAM的结构。或者,根据引用[4]提到的跨模态Transformer,CMA可能是一个跨模态的Transformer模块,用于融合特征。 不过由于用户没有提供具体结构,可能需要简化处理,假设CMA和PAM是自定义的注意力模块。 例如,CMA模块可能包含通道注意力层和空间注意力层: class CMA(nn.Module): def __init__(self, channels): super().__init__() self.ca = ChannelAttention(channels) self.sa = SpatialAttention() def forward(self, x): x = self.ca(x) x = self.sa(x) return x 而PAM可能是一个位置注意力模块: class PAM(nn.Module): def __init__(self, channels): super().__init__() # 定义位置注意力结构 pass def forward(self, x): # 处理 return x 不过这些模块的具体实现需要定义。例如,ChannelAttention可能使用全局平均池化和全连接层生成通道权重: class ChannelAttention(nn.Module): def __init__(self, channels, ratio=8): super().__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc = nn.Sequential( nn.Linear(channels, channels // ratio), nn.ReLU(), nn.Linear(channels // ratio, channels) ) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc(self.avg_pool(x).view(x.size(0), -1)) max_out = self.fc(self.max_pool(x).view(x.size(0), -1)) out = avg_out + max_out return self.sigmoid(out).unsqueeze(2).unsqueeze(3) * x 类似的,SpatialAttention可能使用卷积层生成空间权重: class SpatialAttention(nn.Module): def __init__(self): super().__init__() self.conv = nn.Conv2d(2, 1, kernel_size=7, padding=3) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = torch.mean(x, dim=1, keepdim=True) max_out, _ = torch.max(x, dim=1, keepdim=True) combined = torch.cat([avg_out, max_out], dim=1) return self.sigmoid(self.conv(combined)) * x 这样,CMA模块可能组合这两个注意力机制。 而PAM可能是一个不同的模块,比如自注意力或金字塔注意力,但暂时先按类似的方式处理。 接下来,编写双流网络的结构。假设原模型的基础结构是多个卷积块,每个块包含多个卷积层。例如,每个ConvBlock可能由多个卷积层组成,但为了简化,每个ConvBlock可能是一个单独的卷积层加上BN和ReLU。 例如: class ConvBlock(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1): super().__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding) self.bn = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU() def forward(self, x): return self.relu(self.bn(self.conv(x))) 然后,双流网络的前两个卷积块是独立的: class DualStreamNetwork(nn.Module): def __init__(self): super().__init__() # 可见光分支的第一层 self.vis_conv1 = ConvBlock(3, 64) # 假设输入是RGB三通道 # 红外分支的第一层,假设红外是单通道 self.ir_conv1 = ConvBlock(1, 64) # 共享的后续层:四个卷积块 self.shared_conv2 = ConvBlock(64, 128) self.shared_conv3 = ConvBlock(128, 256) self.shared_conv4 = ConvBlock(256, 512) self.shared_conv5 = ConvBlock(512, 1024) # CMA模块在第三层和第四层之间,即shared_conv3之后 self.cma = CMA(256) # PAM模块在第五层之后 self.pam = PAM(1024) # 其他层,比如全连接层 self.fc = nn.Linear(1024, num_classes) # 假设分类任务 def forward(self, vis_input, ir_input): # 处理可见光输入 vis_feat = self.vis_conv1(vis_input) # 处理红外输入 ir_feat = self.ir_conv1(ir_input) # 合并特征,假设相加 fused = vis_feat + ir_feat # 共享层处理 x = self.shared_conv2(fused) x = self.shared_conv3(x) x = self.cma(x) # 在第三层后应用CMA x = self.shared_conv4(x) x = self.shared_conv5(x) x = self.pam(x) # 第五层后应用PAM # 全局平均池化 x = F.adaptive_avg_pool2d(x, (1,1)) x = x.view(x.size(0), -1) x = self.fc(x) return x 这里有几个问题需要确认: 1. 输入通道数是否正确?可见光可能是3通道,红外是1通道,假设用户的数据集如此。 2. 合并方式是否正确?这里假设两个分支的输出通道数相同(都是64),然后相加。 3. CMA和PAM模块的输入通道是否正确?例如,shared_conv3的输出是256通道,所以CMA的channels参数应为256。shared_conv5的输出是1024,所以PAM的channels参数应为1024。 但之前的CMA模块假设是使用ChannelAttention和SpatialAttention,那可能需要调整。例如,CMA模块可能需要接收特定的通道数。例如,上面的CMA类可能需要接收通道数参数: class CMA(nn.Module): def __init__(self, channels): super().__init__() self.ca = ChannelAttention(channels) self.sa = SpatialAttention() def forward(self, x): x = self.ca(x) x = self.sa(x) return x 同样,PAM模块可能也需要调整,但假设它只处理空间注意力,可能不需要通道参数: class PAM(nn.Module): def __init__(self): super().__init__() self.sa = SpatialAttention() def forward(self, x): return self.sa(x) 或者,PAM可能有不同的结构,比如自注意力机制。 现在,验证前向传播的流程是否正确: 1. 输入vis_input(3通道)和ir_input(1通道)。 2. 经过各自的ConvBlock,输出都是64通道的特征图。 3. 相加得到64通道的特征图。 4. 进入shared_conv2(64→128)。 5. shared_conv3(128→256)。 6. CMA处理256通道的特征。 7. shared_conv4(256→512)。 8. shared_conv5(512→1024)。 9. PAM处理1024通道的特征。 10. 池化和全连接层。 这样可能符合用户的要求:前两个卷积块独立处理不同模态,后四层共享,并在第三层后加CMA,第五层后加PAM。 但用户要求“后四层卷积块共享”,而上面的代码中,shared_conv2到shared_conv5共四个卷积块,符合后四层共享的要求。第一层是双流,后面四层共享,正确。 另外,用户希望第三层和第四层之间加入CMA,即在第三层(shared_conv3)之后,第四层(shared_conv4)之前加入CMA。代码中的顺序是正确的:先经过shared_conv3,然后应用CMA,再进入shared_conv4。 同样,第五层之后加入PAM,即shared_conv5之后应用PAM。 这样,整个结构就满足了用户的要求。接下来需要确认CMA和PAM的实现是否合理,但用户没有给出具体结构,可能需要参考现有的注意力模块。 后,测试代码是否完整,是否考虑了所有必要的部分,比如输入处理、模块连接等。确保没有语法错误,比如正确的参数传递,模块的初始化等。 可能的遗漏点: - 如果ConvBlock包含下采样(比如stride=2),那么特征图尺寸会变化,需要确保两个分支的输出在相加前尺寸一致。比如,假设两个分支的ConvBlock都没有改变尺寸(stride=1,padding=1,kernel=3),则输出尺寸相同,可以相加。 - CMA和PAM模块的实现是否正确,是否影响梯度传播。 - 是否有必要在合并特征后调整通道数,比如使用1x1卷积调整,但用户没有提到,所以可能不需要。 总结,这样的代码结构应该满足用户的需求。需要提醒用户根据实际情况调整通道数和模块结构,特别是CMA和PAM的具体实现可能需要根据具体任务设计。</think>根据您的需求,我们构建了一个基于PyTorch的双流网络模型。该模型采用浅层分离+深层共享的结构,并加入跨模态注意力(CMA)和位置注意力(PAM)模块,代码实现如下: ```python import torch import torch.nn as nn import torch.nn.functional as F # 通道注意力模块 class ChannelAttention(nn.Module): def __init__(self, channels, ratio=8): super().__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc = nn.Sequential( nn.Linear(channels, channels//ratio), nn.ReLU(), nn.Linear(channels//ratio, channels) ) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc(self.avg_pool(x).view(x.size(0), -1)) max_out = self.fc(self.max_pool(x).view(x.size(0), -1)) out = avg_out + max_out return self.sigmoid(out).unsqueeze(2).unsqueeze(3) # 空间注意力模块 class SpatialAttention(nn.Module): def __init__(self): super().__init__() self.conv = nn.Conv2d(2, 1, kernel_size=7, padding=3) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = torch.mean(x, dim=1, keepdim=True) max_out, _ = torch.max(x, dim=1, keepdim=True) x = torch.cat([avg_out, max_out], dim=1) x = self.conv(x) return self.sigmoid(x) # 跨模态注意力模块(CMA) class CMA(nn.Module): def __init__(self, channels): super().__init__() self.ca = ChannelAttention(channels) self.sa = SpatialAttention() def forward(self, x): x = x * self.ca(x) x = x * self.sa(x) return x # 位置注意力模块(PAM) class PAM(nn.Module): def __init__(self, in_channels): super().__init__() self.query = nn.Conv2d(in_channels, in_channels//8, 1) self.key = nn.Conv2d(in_channels, in_channels//8, 1) self.value = nn.Conv2d(in_channels, in_channels, 1) self.gamma = nn.Parameter(torch.zeros(1)) def forward(self, x): batch_size, C, H, W = x.size() query = self.query(x).view(batch_size, -1, H*W).permute(0,2,1) key = self.key(x).view(batch_size, -1, H*W) energy = torch.bmm(query, key) attention = F.softmax(energy, dim=-1) value = self.value(x).view(batch_size, -1, H*W) out = torch.bmm(value, attention.permute(0,2,1)) out = out.view(batch_size, C, H, W) return self.gamma*out + x # 基础卷积块 class ConvBlock(nn.Module): def __init__(self, in_ch, out_ch, kernel=3, stride=1, padding=1): super().__init__() self.conv = nn.Sequential( nn.Conv2d(in_ch, out_ch, kernel, stride, padding, bias=False), nn.BatchNorm2d(out_ch), nn.ReLU(inplace=True), nn.Conv2d(out_ch, out_ch, kernel, 1, padding, bias=False), nn.BatchNorm2d(out_ch), nn.ReLU(inplace=True) ) def forward(self, x): return self.conv(x) # 双流网络主体 class DualStreamNet(nn.Module): def __init__(self): super().__init__() # 浅层独立分支 self.vis_conv1 = ConvBlock(3, 64) # 可见光分支 self.ir_conv1 = ConvBlock(1, 64) # 红外分支 # 共享深层 self.shared_conv2 = ConvBlock(64, 128) self.shared_conv3 = ConvBlock(128, 256) self.shared_conv4 = ConvBlock(256, 512) self.shared_conv5 = ConvBlock(512, 1024) # 注意力模块 self.cma = CMA(256) # 第三层后加入 self.pam = PAM(1024) # 第五层后加入 # 分类头 self.avgpool = nn.AdaptiveAvgPool2d((1,1)) self.fc = nn.Linear(1024, 1000) # 假设1000类分类任务 def forward(self, vis, ir): # 浅层特征提取 vis_feat = self.vis_conv1(vis) # [B,64,H,W] ir_feat = self.ir_conv1(ir) # [B,64,H,W] # 特征融合 fused = vis_feat + ir_feat # 特征相加融合[^1] # 共享特征处理 x = self.shared_conv2(fused) # -> [B,128,H/2,W/2] x = F.max_pool2d(x, 2) x = self.shared_conv3(x) # -> [B,256,H/4,W/4] x = self.cma(x) # 跨模态注意力[^4] x = F.max_pool2d(x, 2) x = self.shared_conv4(x) # -> [B,512,H/8,W/8] x = F.max_pool2d(x, 2) x = self.shared_conv5(x) # -> [B,1024,H/16,W/16] x = self.pam(x) # 位置注意力[^2] x = F.max_pool2d(x, 2) # 分类输出 x = self.avgpool(x) x = torch.flatten(x, 1) x = self.fc(x) return x ``` 关键实现说明: 1. **双流结构**:通过`vis_conv1`和`ir_conv1`分别处理可见光(3通道)和红外(1通道)输入,实现浅层特征独立提取[^4] 2. **特征融合**:采用特征图相加方式融合双模态浅层特征,保留互补信息 3. **注意力机制**: - CMA模块包含通道和空间注意力,增强跨模态特征交互[^4] - PAM模块通过自注意力机制捕获长程空间依赖 4. **共享参数**:深层卷积块`shared_conv2-5`共享参数,保证模型紧凑性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值