gcn语义分割_【语义分割】large kernel matters中GCN模块的pytorch实现

这篇博客探讨了两种不同的GCN(图卷积网络)实现方式,主要区别在于 padding 的处理。第一种实现中,padding 值是直接设定的,而第二种使用了 'same' 填充,但在PyTorch 0.4.0版本中不支持字符串形式的padding。此外,作者还分享了自己尝试编写的3D版本GCN模块,该模块包含了更多的卷积层。
摘要由CSDN通过智能技术生成

GCN模块的实现比较简单,在giuhub上看到两种实现,轻微不同

class GCN(nn.Module):

def __init__(self, inplanes, planes, ks=7):

super(GCN, self).__init__()

self.conv_l1 = nn.Conv2d(inplanes, planes, kernel_size=(ks, 1),

padding=(ks/2, 0))

self.conv_l2 = nn.Conv2d(planes, planes, kernel_size=(1, ks),

padding=(0, ks/2))

self.conv_r1 = nn.Conv2d(inplanes, planes, kernel_size=(1, ks),

padding=(0, ks/2))

self.conv_r2 = nn.Conv2d(planes, planes, kernel_size=(ks, 1),

padding=(ks/2, 0))

def forward(self, x):

x_l = self.conv_l1(x)

x_l = self.conv_l2(x_l)

x_r = self.conv_r1(x)

x_r = self.conv_r2(x_r)

x = x_l + x_r

return x

class GCN(nn.Module):

def __init__(self, inchannels, channels=21, k=3):

super(GCN, self).__init__()

self.conv_l1 = Conv2D(in_channels=inchannels, out_channels=channels, kernel_size=(k, 1), padding='same')

self.conv_l2 = Conv2D(in_channels=channels, out_channels=channels, kernel_size=(1, k), padding='same')

self.conv_r1 = Conv2D(in_channels=inchannels, out_channels=channels, kernel_size=(1, k), padding='same')

self.conv_r2 = Conv2D(in_channels=channels, out_channels=channels, kernel_size=(k, 1), padding='same')

def forward(self, x):

x1 = self.conv_l1(x)

x1 = self.conv_l2(x1)

x2 = self.conv_r1(x)

x2 = self.conv_r2(x2)

out = x1 + x2

return out

两种实现不同之处在padding的方式,一种是设定值,一种是自动的。不过我发现pytorch0.4.0是不支持对padding关键字参数传入字符串的,另外,我自己写了一个3D版的,不知道对否。

class GCN(nn.Module):

def __init__(self, inplanes, planes, ks=7):

super(GCN, self).__init__()

self.conv_l1 = nn.Conv3d(inplanes, planes, kernel_size=(ks, 1, 1),

padding=(ks/2, 0, 0))

self.conv_l2 = nn.Conv3d(planes, planes, kernel_size=(1, ks, 1),

padding=(0, ks/2, 0))

self.conv_l3 = nn.Conv3d(planes, planes, kernel_size=(1, 1, ks),

padding=(0, 0, ks/2))

self.conv_c1 = nn.Conv3d(inplanes, planes, kernel_size=(1, ks, 1),

padding=(0, ks/2, 0))

self.conv_c2 = nn.Conv3d(planes, planes, kernel_size=(1, 1, ks),

padding=(0, 0, ks/2))

self.conv_c3 = nn.Conv3d(planes, planes, kernel_size=(ks, 1, 1),

padding=(ks/2, 0, 0))

self.conv_r1 = nn.Conv3d(inplanes, planes, kernel_size=(1, 1, ks),

padding=(0, 0, ks/2))

self.conv_r2 = nn.Conv3d(planes, planes, kernel_size=(ks, 1, 1),

padding=(ks/2, 0, 0))

self.conv_r3 = nn.Conv3d(planes, planes, kernel_size=(1, ks, 1),

padding=(0, ks/2, 0))

def forward(self, x):

x_l = self.conv_l1(x)

x_l = self.conv_l2(x_l)

x_l = self.conv_l3(x_l)

x_c = self.conv_c1(x)

x_c = self.conv_c2(x_c)

x_c = self.conv_c3(x_c)

x_r = self.conv_r1(x)

x_r = self.conv_r2(x_r)

x_r = self.conv_r3(x_r)

x = x_l + x_r + x_c

return x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值