我正在深度网络中使用1x1卷积来将特征 x :return {...state, userList : action.data}
缩小为Bx2CxHxW
。我有三个选择:
BxCxHxW
。参考resnet output = ReLU(BN(Conv(x)))
。参考densenet output = Conv(ReLU(BN(x)))
哪个最常用于特征缩减?为什么?
答案 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
-...因此,这只是将网络分为“三元组”的“人工”划分函数ReLU
,conv
,conv
以及最开始和最后的函数,您可以随意拆分内容。此外,由于批处理范数是线性运算(比例+偏差),因此可以将其“折叠”到相邻的bn
层中而无需更改网络,因此您基本上保留了relu
-conv
对。
因此,突出显示的前两个选项之间并没有太大的区别。
还有什么需要考虑的?
更改要素尺寸时,您真的需要conv
吗?您可以将缩减维视为线性映射-将权重映射映射到 relu
分解为较低的 rank 矩阵,该矩阵最终映射为ReLU
维空间而不是x
空间。如果考虑线性映射,则可能会完全省略c
。
有关示例,请参见fast RCNN SVD trick。