H1N1

      最近,H1N1在中国比较猖狂。被感染的人很多,死没死人只有政府清楚。

      九月十九日我们封校了,要想出去只能越墙了。

class SqueezeExcite(nn.Module): """ Squeeze-and-Excitation w/ specific features for EfficientNet/MobileNet family Args: in_chs (int): input channels to layer rd_ratio (float): ratio of squeeze reduction act_layer (nn.Module): activation layer of containing block gate_layer (Callable): attention gate function force_act_layer (nn.Module): override block's activation fn if this is set/bound rd_round_fn (Callable): specify a fn to calculate rounding of reduced chs """ def __init__( self, in_chs: int, rd_ratio: float = 0.25, rd_channels: Optional[int] = None, act_layer: LayerType = nn.ReLU, gate_layer: LayerType = nn.Sigmoid, force_act_layer: Optional[LayerType] = None, rd_round_fn: Optional[Callable] = None, ): super(SqueezeExcite, self).__init__() if rd_channels is None: rd_round_fn = rd_round_fn or round rd_channels = rd_round_fn(in_chs * rd_ratio) act_layer = force_act_layer or act_layer self.conv_reduce = nn.Conv2d(in_chs, rd_channels, 1, bias=True) self.act1 = create_act_layer(act_layer, inplace=True) self.conv_expand = nn.Conv2d(rd_channels, in_chs, 1, bias=True) self.gate = create_act_layer(gate_layer) def forward(self, x): x_se = x.mean((2, 3), keepdim=True) x_se = self.conv_reduce(x_se) x_se = self.act1(x_se) x_se = self.conv_expand(x_se) return x * self.gate(x_se) class iRMB(nn.Module): def __init__(self, dim_in, dim_out, norm_in=True, has_skip=True, exp_ratio=1.0, norm_layer='bn_2d', act_layer='relu', v_proj=True, dw_ks=3, stride=1, dilation=1, se_ratio=0.0, dim_head=64, window_size=7, attn_s=True, qkv_bias=False, attn_drop=0., drop=0., drop_path=0., v_group=False, attn_pre=False): super().__init__() self.norm = get_norm(norm_layer)(dim_in) if norm_in else nn.Identity() dim_mid = int(dim_in * exp_ratio) self.has_skip = (dim_in == dim_out and stride == 1) and has_skip self.attn_s = attn_s if self.attn_s: assert dim_in % dim_head == 0, 'dim should be divisible by num_heads' self.dim_head = dim_head self.window_size = window_size self.num_head = dim_in // dim_head self.scale = self.dim_head ** -0.5 self.attn_pre = attn_pre self.qk = ConvNormAct(dim_in, int(dim_in * 2), kernel_size=1, bias=qkv_bias, norm_layer='none', act_layer='none') self.v = ConvNormAct(dim_in, dim_mid, kernel_size=1, groups=self.num_head if v_group else 1, bias=qkv_bias, norm_layer='none', act_layer=act_layer, inplace=inplace) self.attn_drop = nn.Dropout(attn_drop) else: if v_proj: self.v = ConvNormAct(dim_in, dim_mid, kernel_size=1, bias=qkv_bias, norm_layer='none', act_layer=act_layer, inplace=inplace) else: self.v = nn.Identity() self.conv_local = ConvNormAct(dim_mid, dim_mid, kernel_size=dw_ks, stride=stride, dilation=dilation, groups=dim_mid, norm_layer='bn_2d', act_layer='silu', inplace=inplace) self.se = SE(dim_mid, rd_ratio=se_ratio, act_layer=get_act(act_layer)) if se_ratio > 0.0 else nn.Identity() self.proj_drop = nn.Dropout(drop) self.proj = ConvNormAct(dim_mid, dim_out, kernel_size=1, norm_layer='none', act_layer='none', inplace=inplace) self.drop_path = DropPath(drop_path) if drop_path else nn.Identity() def forward(self, x): shortcut = x x = self.norm(x) B, C, H, W = x.shape if self.attn_s: # padding if self.window_size <= 0: window_size_W, window_size_H = W, H else: window_size_W, window_size_H = self.window_size, self.window_size pad_l, pad_t = 0, 0 pad_r = (window_size_W - W % window_size_W) % window_size_W pad_b = (window_size_H - H % window_size_H) % window_size_H x = F.pad(x, (pad_l, pad_r, pad_t, pad_b, 0, 0,)) n1, n2 = (H + pad_b) // window_size_H, (W + pad_r) // window_size_W x = rearrange(x, 'b c (h1 n1) (w1 n2) -> (b n1 n2) c h1 w1', n1=n1, n2=n2).contiguous() # attention b, c, h, w = x.shape qk = self.qk(x) qk = rearrange(qk, 'b (qk heads dim_head) h w -> qk b heads (h w) dim_head', qk=2, heads=self.num_head, dim_head=self.dim_head).contiguous() q, k = qk[0], qk[1] attn_spa = (q @ k.transpose(-2, -1)) * self.scale attn_spa = attn_spa.softmax(dim=-1) attn_spa = self.attn_drop(attn_spa) if self.attn_pre: x = rearrange(x, 'b (heads dim_head) h w -> b heads (h w) dim_head', heads=self.num_head).contiguous() x_spa = attn_spa @ x x_spa = rearrange(x_spa, 'b heads (h w) dim_head -> b (heads dim_head) h w', heads=self.num_head, h=h, w=w).contiguous() x_spa = self.v(x_spa) else: v = self.v(x) v = rearrange(v, 'b (heads dim_head) h w -> b heads (h w) dim_head', heads=self.num_head).contiguous() x_spa = attn_spa @ v x_spa = rearrange(x_spa, 'b heads (h w) dim_head -> b (heads dim_head) h w', heads=self.num_head, h=h, w=w).contiguous() # unpadding x = rearrange(x_spa, '(b n1 n2) c h1 w1 -> b c (h1 n1) (w1 n2)', n1=n1, n2=n2).contiguous() if pad_r > 0 or pad_b > 0: x = x[:, :, :H, :W].contiguous() else: x = self.v(x) x = x + self.se(self.conv_local(x)) if self.has_skip else self.se(self.conv_local(x)) x = self.proj_drop(x) x = self.proj(x) x = (shortcut + self.drop_path(x)) if self.has_skip else x return x 这是SE模块和iRMB的代码,请你根据代码帮我绘制详细的结构图
最新发布
06-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值