首先介绍单层网络实行的权重共享袁力介绍
 
简单从共享的角度来说:权重共享即filter的值共享
 
卷积神经网络两大核心思想:
 
1.网络局部连接(Local Connectivity)
 
2.卷积核参数共享(Parameter Sharing)
 
两者的一个关键作用就是减少参数数量,使运算变得简洁、高效,能够在超大规模数据集上运算。
 
下面来用最直观的图示,来阐明两者的作用。
 
CNN的正确打开方式,如下所示  概括为:一个 的卷积核在图像上扫描,进行特征提取。通常,  ,  的卷积核较为常用,如果channels为 [公式] 的话(32,64是较为常用的通道数),那么参数总量为 。
 
不进行parameter sharing 
如果不用parameter sharing实现上图的运算,卷积核结构就会变成下图所示
 
 这个是不难发现:卷积核的参数数量与图像像素矩阵的大小保持一致,即  例如:Inception V3的输入图像尺寸是192192的,**如果把第一层3332的卷积核去掉参数共享,那么参数数目就会变成192192*32,约为120万个参数,是原来288个参数的50万倍。**
 
不进行local connectivity 如果不用局部连接,那当然就是全连接网络了(fully connect),即每个元素单元与隐层的神经原进行全连接,网络结构如下所示。  
此时参数量变为  ,因为像素矩阵很大,所以也会选择较多的隐含层节点,这时一个单隐层的参数数目通常就超过了1千万个,导致网络很难进行训练。
 
 
以下是pytorch对多层网络实行的权重共享代码
 
import torch
import torch
.nn 
as nn
import random
import matplotlib
.pyplot 
as plt
 
def plot_curve(data
):
    fig 
= plt
.figure
()
    plt
.plot
(range(len(data
)), data
, color
='blue')
    plt
.legend
(['value'], loc
='upper right')
    plt
.xlabel
('step')
    plt
.ylabel
('value')
    plt
.show
()
 
 
class DynamicNet(nn
.Module
):
    def __init__(self
, D_in
, H
, D_out
):
        super(DynamicNet
, self
).__init__
()
        self
.input_linear 
= nn
.Linear
(D_in
, H
)
        self
.middle_linear 
= nn
.Linear
(H
, H
)
        self
.output_linear 
= nn
.Linear
(H
, D_out
)
 
    def forward(self
, x
):
        h_relu 
= self
.input_linear
(x
).clamp
(min=0)
        
        for _ 
in range(random
.randint
(0, 3)):
            h_relu 
= self
.middle_linear
(h_relu
).clamp
(min=0)
        y_pred 
= self
.output_linear
(h_relu
)
        return y_pred
 
 
N
, D_in
, H
, D_out 
= 64, 1000, 100, 10
 
x 
= torch
.randn
(N
, D_in
)
y 
= torch
.randn
(N
, D_out
)
 
model 
= DynamicNet
(D_in
, H
, D_out
)
criterion 
= nn
.MSELoss
(reduction
='sum')
optimizer 
= torch
.optim
.SGD
(model
.parameters
(), lr
=1e-4, momentum
=0.9)
 
loss_list 
= []
for t 
in range(500):
    
    y_pred 
= model
(x
)
    
    loss 
= criterion
(y_pred
, y
)
    loss_list
.append
(loss
.item
())
    
    optimizer
.zero_grad
()
    loss
.backward
()
    optimizer
.step
()
 
plot_curve
(loss_list
)