1. 如果搭网络目标是做预测(或回归),训练时,不仅需要对训练数据归一化,而且要对验证数据进行归一化。在评价预测结果时,应当考虑是否需要进行反归一化。因为有些定量指标只对归一化前的结果work。(犯了个低级错误:a. 训练时,对训练数据进行归一化,而对验证数据未进行归一化;b. 有些指标比如SSIM是计算两个非负图像的结构相似性,如果用于归一化后数据的计算,比如Z-score归一化,由于数据中有负值,计算的SSIM指标就有问题,应当进行反归一化)
2. 训练好的网络,即train loss下降至趋于水平、验证精度升高至趋于水平,这时如果测试时表现不好,可以检查下测试代码是否有错误(debug)。(犯了个低级错误:训练时候没有归一化,测试时候又进行了归一化,导致测试结果一直不好)
3. 训练时,发现loss有下降,但验证精度一直不变,可能是学习率设置过大,导致loss有下降,但精度的评价由于方式不太相同,一直不能找到最优解,可以适当调小学习率。
4. 模型一直train不好的时候,可以回头看看数据,包括训练数据、验证数据和测试数据,再重新审视下网络的目标是什么。具体地,网络的输入数据及其分布、网络的输出数据及其分布,这里的输入数据和输出数据是指样本里的,这时需要再结合网络,看看网络能够输出什么数据以及它能够输出的数据的特点。
比如:
我想用网络做一个复杂的拟合,样本就是成对的(x,y),其中x和y都是向量;损失函数设置成MSE。为了让向量x和y中的每一个特征都同等重要,对它们做一个z-score归一化再输入网络中,这时数据分布就变成均值为0、方差为1的情况;那如果我在网络的最后一层用上sigmoid激活函数,那明显这个model就不可能train好(这个问题卡了我两天,虽然把model简化到一个很简的形式,因为参数少了,model泛化能力强了,loss曲线能看了,貌似train好了,但一用发现拟合的有问题,在一些低值区域直接拉成直线,类似下面绿色线这样,橙色的是目标曲线),因为sigmoid函数的输出一定在0到1之间,而将目标y归一化后它的值存在负值。