转换1x1配置以减少功能

时间:2018-12-25 06:18:01

标签: tensorflow machine-learning deep-learning pytorch

我正在深度网络中使用1x1卷积来将特征 x return {...state, userList : action.data} 缩小为Bx2CxHxW。我有三个选择:

  1. x->转换(1x1)-> Batchnorm-> ReLU。代码将为BxCxHxW。参考resnet
  2. x-> BN-> ReLU->转化因此,代码将为output = ReLU(BN(Conv(x)))。参考densenet
  3. x->转化代码是output = Conv(ReLU(BN(x)))

哪个最常用于特征缩减?为什么?

1 个答案:

答案 0 :(得分:3)

由于您要端对端训练网络,因此无论使用什么配置,都将训练砝码以适应它们。

BatchNorm?
我想您需要问自己的第一个问题是您要使用public static string HashKey = "hometelaccess"; static readonly string filePath = Application.StartupPath + "/Server.txt"; public static string GetValue(string key) { key = key.ToLower(); List<KeyValue> lstKeyValue = GetLstKeyValue(); return lstKeyValue.FirstOrDefault(x => x.Key == key)?.Value.Decrypt(HashKey); } private static List<KeyValue> GetLstKeyValue() { List<KeyValue> lstKeyValue = new List<KeyValue>(); List<string> lstLine = File.ReadAllLines(filePath).ToList(); foreach (var line in lstLine) { string[] strTmp = line.Split(','); lstKeyValue.Add(new KeyValue { Key = strTmp[0], Value = strTmp[1] }); } return lstKeyValue; } public static void SaveToConfig(string key, string value) { key = key.ToLower(); if (!File.Exists(filePath)) File.Create(filePath); List<KeyValue> lstKeyValue = GetLstKeyValue(); KeyValue keyValue = lstKeyValue.FirstOrDefault(x => x.Key == key); if (keyValue == null) lstKeyValue.Add(new KeyValue { Key = key, Value = value.Encrypt(HashKey) }); else keyValue.Value = value.Encrypt(HashKey); File.WriteAllLines(filePath, lstKeyValue.Select(x => x.Key + "," + x.Value)); } } 吗?如果您的网很深,并且您担心covariate shifts,那么您可能应该拥有BatchNorm -这是选项号。 3

BatchNorm首先?
如果您的BatchNorm是另一个x层的输出,那么第一个和第二个选择之间实际上没有区别:您的网络是由...- conv-{{1 }}-conv-bn-ReLU-conv-BN -...因此,这只是将网络分为“三元组”的“人工”划分函数ReLUconvconv以及最开始和最后的函数,您可以随意拆分内容。此外,由于批处理范数是线性运算(比例+偏差),因此可以将其“折叠”到相邻的bn层中而无需更改网络,因此您基本上保留了relu-conv对。
因此,突出显示的前两个选项之间并没有太大的区别。

还有什么需要考虑的?
更改要素尺寸时,您真的需要conv吗?您可以将缩减维视为线性映射-将权重映射映射到 relu分解为较低的 rank 矩阵,该矩阵最终映射为ReLU维空间而不是x空间。如果考虑线性映射,则可能会完全省略c
有关示例,请参见fast RCNN SVD trick