分组卷积(计算量)

	import torch
	import torch.nn as nn
	#分组卷积
	N,C_in,H,W,C_out = 10,4,16,16,4
	x = torch.randn(N,C_in,H,W)
	conv = nn.Conv2d(C_in,C_out,3,1,padding=0,bias=False)
	conv_group = nn.Conv2d(C_in,C_out,3,1,padding=0,bias=False,groups=2)
	y = conv(x)
	y_group = conv_group(x)
	print(y_group.size())#输出通道必须能被组数整除,形状没变,因为代表整体,最后合起来了
	# print(y.size())
	print("常规卷积参数大小:{}".format(sum(param.numel() for param in conv.parameters())))
	#conv.parameters()整个网络参数
	#for遍历网络层
	#param.numel()返回元素个数
	#param.numel() for param in conv.parameters(),列表推导式,返回list,表示每一层参数
	#几个卷积核,几个偏移量
	print("分组卷积参数大小:{}".format(sum(param.numel() for param in conv_group.parameters())))
	"""
	C_in 变为原来的一半,分组卷积计算量变为原来的1/2
	分组卷积(Group Convolution)的用途
	1.减少参数量,分成G组,则该层的参数量减少为原来的1G
	2.Group Convolution可以看成是结构化稀疏(structured sparse),
	每个卷积核的尺寸由C∗K∗K变为C/G∗K∗K,可以将其余(C−C/G)∗K∗K的参数视为0,
	有时甚至可以在减少参数量的同时获得更好的效果(相当于正则)。
	"""
	
	print(list(conv_group.parameters()))
	"""
	输入通道为4,每个卷积核有4层,每个卷积核是3*3的矩阵,共有4个3*3的矩阵(第一个核),
	输出通道为4,共4个卷积核
	每个核的权重不一样
	"""

你可能感兴趣的:(卷积,卷积,网络,卷积神经网络,深度学习,pytorch)