前言:
{
自从上次更新第3部分之后,这个系列其实我也一直在调试,只不过结果一直不好(大多数情况下网络只从样本标签分布中获得识别参考)。今天突然想到大概是怎么回事,就在这记录一下遇到的一些问题。
}
正文:
{
自从上次更新此系列之后,我就一直在调试。为了解决误差降不下去的问题,试过了很多方法:
1,鼓励网络输出1:
{
在https://blog.csdn.net/fish_like_apple/article/details/83278161中我说网络总是给出全0,所以当时我想鼓励网络输出1。我在网络的最后一层添加了“鼓励层”。对于“鼓励层”,我做了很多尝试,总之就是使得输出到1的损失会变的更大。
结果显而易见地失败了,因为问题不在这(我记得在某个方法下,经过长时间训练后网络还是会输出全0)。
}
2,输出标准化:
{
很久之前,此网络的输出会被直接用于与标签计算均方差,导致有时损失会很大(因为输出可能会很夸张),所以自己加了一层0-1归一层,见代码1。
#代码1
def tf_max_min_normalization(input, number_of_calsses, zero_avoider = -0.0001):
'''this function is to add a max-min-normalization layer avoiding
a zero in the denominator and all-zero in the result'''
max = tf.tile(tf.expand_dims(tf.reduce_max(input, 1), 1), [1, number_of_calsses])
min = tf.tile(tf.expand_dims(tf.reduce_min(input, 1), 1), [1, number_of_calsses])
min = min + zero_avoider
return (input-min) / (max-min)
此层既可以进行归一化,又可以避免分母为0,还可以防止网络输出全0。
可是还是失败了,虽然网络不在输出全0,但是不管输入如何,网络的输出都类似。图1是部分输出。
}
实际上,问题还是在我使用的特征提取网络上。
之后我没有头绪就在谷歌上乱搜。好在我看到了[1]中的第一个回答,这时我才发现问题所在:我一直使用的特征提取网络是由一般的分类训练得到的,输出中机会不存在局部特征。
}
结语:
{
这次就先记录到这,时间有限,目前只能先注重调试。
参考资料:
{
}
}