tensorflow 3d 分组卷积实现
只有2D想着自己弄个3D的
class Group_Conv(layers.Layer): # 分组卷积
def __init__(self, filters, stride=(1, 1, 1), kernel_size=(3, 3, 3), groups=4, padding='same', activation='relu',
name='',
**kwargs): # 里面可以自己传递想要的参数,这里我只设置了一个参数alpha
super(Group_Conv, self).__init__(**kwargs)
self.kernel = kernel_size
self.n = name
self.padding = padding
self.activation = activation
self.stride = stride
self.filters = filters
self.groups = groups
self.nb_og = self.filters // self.groups # 对输出特征图通道进行分组
self.conv3d = Conv3D(filters=self.nb_og, kernel_size=self.kernel, strides=self.stride, padding=self.padding,
activation=self.activation, name=self.n)
def call(self, x, **kwargs):
channel_axis = 1 if K.image_data_format() == 'channels_first' else -1
in_channels = K.int_shape(x)[channel_axis] # 计算输入特征图的通道数
nb_ig = in_channels // self.groups # 对输入特征图通道进行分组
gc_list = []
for i in range(self.groups):
if channel_axis == -1:
x_group = layers.Lambda(lambda z: z[:, :, :, :, i * nb_ig: (i + 1) * nb_ig])(x)
else:
x_group = layers.Lambda(lambda z: z[:, i * nb_ig: (i + 1) * nb_ig, :, :, :])(x)
# gc_list.append(MyConv(x_group , filters=nb_og, kernel_size=kernel ,strides=stride))
gc_list.append(self.conv3d(x_group)) # 对每组特征图进行单独卷积
return layers.Concatenate(axis=channel_axis)(gc_list) # 在通道上进行特征图的拼接
改了一下大神的2D实现: link.