神经网络稀疏训练
對于每一個通道都引入一個縮放因子,然后和通道的輸出相乘。接著聯合訓練網絡權重和這些縮放因子,最后將小縮放因子的通道直接移除,微調剪枝后的網絡,特別地,目標函數被定義為:
其中(x,y)代表訓練數據和標簽,是網絡的可訓練參數,第一項是CNN的訓練損失函數。是在縮放因子上的乘法項,是兩項的平衡因子。論文的實驗過程中選擇,即正則化,這也被廣泛的應用于稀疏化。次梯度下降法作為不平滑(不可導)的L1懲罰項的優化方法,另一個建議是使用平滑的L1正則項取代L1懲罰項,盡量避免在不平滑的點使用次梯度。
這里的縮放因子就是BN層的gamma參數。
在train.py的實現中支持了稀疏訓練,其中下面這2行代碼即添加了稀疏訓練的稀疏系數,注意是作用在BN層的縮放系數上的:
parser.add_argument('--sparsity-regularization', '-sr', dest='sr', action='store_true',help='train with channel sparsity regularization') parser.add_argument('--s', type=float, default=0.01, help='scale sparse rate') class BNOptimizer():@staticmethoddef updateBN(sr_flag, module_list, s, prune_idx):if sr_flag:for idx in prune_idx:# Squential(Conv, BN, Lrelu)bn_module = module_list[idx][1]bn_module.weight.grad.data.add_(s * torch.sign(bn_module.weight.data)) # L1link
總結
- 上一篇: 解决Cannot convert a s
- 下一篇: 向量与向量的叉积和向量与矩阵的叉积数学表