实现一个预测模型,模型训练的时候是用的归一化后的数据去训练,然后把预测后的数据反归一化就得到真实数据,但是有个问题就是反归一化会出现负值,而我要预测的值应该都是正数,这种情况要怎么处理?
不是很理解你的逻辑,归一化是对训练数据预处理,而对于目标值一般不会去变动,预测的时候只要对输入的数据做同样的处理再输入模型就可以了,也不需要对预测出来的数据反归一化。
看你这个代码也只是对数据做标准化处理,以及反过来的转化,貌似没有涉及到预测的代码。
所以不是很清楚你的意思
这里面估计是你在编写反转函数时可能出现问题,或者还有种原因,你用归一化的函数不满足你预测时的函数不一致。比如取一个简单的例子,在神经网络中,我们通常采用sigmod作为这个激活函数在神经网络中,而这个函数的输出的结果肯定在[0,1]之间,而当我们对数据集进行初始化的时候,采用的是内置的归一化函数,它归一化的值范围在[-1,1]。在经过预测之后,使用内置的反归一化函数,此时得出的结果与原先的值会发生偏差。因此,在反归一化的时候,最好采用激活函数的反函数来进行反归一化,这样预测的值与理论值才能匹配!
不知道题主数据,如果是图像,可以参考我之前写的归一化方式:
tensor_w, tensor_h = img_tensor.shape[2], img_tensor.shape[1]
img = torch.clamp(img_tensor, 0.0, 1.0)
img = torch.multiply(img, 255.0)
记录了原始图像的长宽,相当于放缩比例,后面预测结果再乘回放缩比例就是原图像的框高和框长。
你实现的代码是标准化,不是归一化。标准化是指数据的均值为0,方差为1,出现负数很正常。归一化是,x-x.max()/(x.max()-x.min())
加上绝对值的最大值