上海网站哪家好百度推广工作好干吗
深度学习模型,训练过程中,经常遇到预测的结果集中在某个值,而且在学习的过程中会变,样例如下。
主要有如下解决方案
1、更换relu ->tanh 或者其他激活函数
2、更改随机种子,估计是没有初始化好,或者调整学习率试试
3、输入的数据没有标准化,考虑对输入的特征进行分bin or标准化处理
4、增加drop out ,增加 batch normal,增加正则等
class ModelBNDropout(nn.Module):
def __init__(self, input_size, class_nums=2):
super(ModelBNDropout, self).__init__()
self.model=nn.Sequential() #序列化模块构造的神经网络
# 第一层
self.model.add_module('linear1',nn.Linear(input_size, 1024 )) #卷积层
self.model.add_module('relu1', nn.ReLU()) #激活函数使用了ReLu
self.model.add_module('bnorm1', nn.BatchNorm1d(1024))
self.model.add_module('drop1', nn.Dropout())
# L1 = 0
# L2 = 0
# for name,param in model.named_parameters():
# if 'bias' not in name:
# L1 += torch.norm(param, p=1) * 1e-5
# L2 += torch.norm(param, p=2) * 1e-3
5、使用其他模型的参数,进行权重初始化
model = torch.load('data/ckpt_xxx.model')
model_drop.fc1 = model.fc1
model_drop.fc2 = model.fc2
model_drop.fc3 = model.fc3
model_drop.fc4 = model.fc4
model_drop.fc5 = model.fc5
6、设置初始化函数
# # for m in model_drop.modules():
# # if isinstance(m, nn.Linear):
# # print('before',m.weight)
# # torch.nn.init.kaiming_uniform_(m.weight)
# # print('after',m.weight)
# # nn.init.normal_(m.weight, mean=0, std=1)
# # nn.init.zeros_(m.bias)
# print(model_res)
7、模型是不是在输出的时候加了一层sigmoid激活函数
8、终极大法:
获取模型的子模块,进行预测,看看哪一步出现 or 在每一层layer打印日志,看看在哪个层出现数据集中的情况,修该对应的层的网络结构or激活函数。
model_drop = ModelDropOut(input_size, class_nums=2)
model_drop = model_drop.to(device)
for m in model_drop.modules():
print(m)