神经网络归一化过程(详细实例、公式、代码)

原创文章,转载请说明来自:《老饼讲解-BP神经网络


目录

一. 归一化与反归一化

二. 例子实讲

三. 完整代码例子

四.网络表达式的反归一化


为了方便网络训练得更优秀,一般会先将输入输出数据归一化,再进行训练。训练完后,在用网络预测时,还需要将网络的预测值反归一化。

本文讲述神经网络的归一化和反归一化

一. 归一化与反归一化

训练前,为避免各个输入变量的数量级差异过大,影响求解算法的效果,一般会先将数据归一化到[-1,1]的区间。

PASS: 归一化的好处不仅仅是为了避免数量级的影响。详细可以看文章​ 《 神经网络为什么要归一化》 ​

(1) 训练前数据的归一化公式

(2) 使用时将 y 反归一化

由于我们用的是归一化后的数据进行训练的。所以网络是针对归一化后的数据的。

因此,我们在使用训练好的网络时作预测时,输入输出都要做数据转换,需要:

(1) 预测时将输入归一化

(2) 将输出反归一化

                                                      输出的反归一函数:

二. 例子实讲

1.训练前数据进行归一化

设我们原始数据如下:

x15-238
x24216
y052-5

可知x_1的最大值为8,最小值为-2,则x_1归一化后的值如下:

原始数据:x15-238
归一化后:(x1-(-1)) / (8-(-2))-10.4-101

同样处理 x_2 和 y,得到归一化后的数据如下:

归一化后的数据
x10.4-101
x20.2-0.6-11
y010.4-1

2. 训练后使用时反归一化

例如,要预测 x1 = 2, x2 = 3, 操作如下:

(1) 先将 x1,x2 归一化再输入网络

在做归一化时候我们知道 : x1 的最大值为8,最小值为 -2,x2的最大值为6,最小值为1,

那么x1,x2归一化后的值为:

预测时输入网络的值为: sim(net,[-0.2,-0.2]) 

(2)假设上面的网络输出是0.5,但这是针对归一化数据的,要获得真实的预测值,我们需要反归一化。

我们在归一化时,知道: y的最大值为5,最小值为-5,

则反归一后的 y:

三. 完整代码例子

x1 = linspace(-3,3,100);           % 在[-3,3]之间线性生成100个数据
x2 = linspace(-2,1.5,100);         % 在[-2,1.5]之间线性生成100个数据
y = sin(x1)+0.2*x2.*x2;            % 生成y

inputData  = [x1;x2];              % 将x1,x2作为输入数据
outputData = y;                    % 将y作为输出数据

%归一化处理:
inputMax = max(inputData,[],2);    % 输入的最大值
inputMin = min(inputData,[],2);    % 输入的最小值

outputMax = max(outputData,[],2);  % 输出的最大值
outputMin = min(outputData,[],2);  % 输出的最小值

[varNum,sampleNum] = size(inputData);
inputDataNorm  = inputData;        % 初始化inputDataNorm
outputDataNorm = outputData;       % 初始化outputDataNorm

%进行归一化
for i = 1 : sampleNum
 inputDataNorm(:,i)  = 2*(inputData(:,i)-inputMin)./(inputMax-inputMin)-1;   
 outputDataNorm(:,i) = 2*(outputData(:,i)-outputMin)./(outputMax-outputMin)-1;      
end

%使用用输入输出数据(inputDataNorm、outputDataNorm)建立网络,隐节点个数设为3.其中输入层到隐层、隐层到输出层的节点分别为tansig和purelin,使用trainlm方法训练。
net = newff(inputDataNorm,outputDataNorm,3,{'tansig','purelin'},'trainlm');

%设置一些常用参数
net.trainparam.goal = 0.0001;     % 训练目标:均方误差低于0.0001
net.trainparam.show = 400;        % 每训练400次展示一次结果
net.trainparam.epochs = 15000;    % 最大训练次数:15000.

[net,tr] = train(net,inputDataNorm,outputDataNorm);%调用matlab神经网络工具箱自带的train函数训练网络

figure;

%训练数据的拟合效果
simoutNorm = sim(net,inputDataNorm);
%反归一化:

simout=(simoutNorm+1).*(outputMax-outputMin)/2+outputMin;

title('神经网络预测结果')
hold on
t=1:length(simout);
plot(t,outputData,t,simout,'r')%画图,对比原来的y和网络预测的y

四.网络表达式的反归一化

神经网络归一化后,训练得到的模型系数都是对应归一化数据的。要想得到对应原始数据的模型系数,则需要对模型系数反归一化,具体见​《网络表达式的反归一化》​


  相关文章

​《BP神经网络梯度推导》

​​​​​​《matlab实现BP神经网络的代码-逐行讲解》

### 归一化的概念与实现 #### 数据归一化简介 数据归一化是一种常用的预处理技术,旨在将不同范围内的数值调整到同一范围内。这种方法可以有效提升机器学习模型的训练效率和准确性[^2]。 #### 最大最小值归一化(Min-Max Normalization) 最大最小值归一化通过线性变换将数据映射到指定区间(通常是[0, 1]),其公式如下: \[ X' = \frac{X - X_{min}}{X_{max} - X_{min}} \] 其中 \(X\) 是原始数据,\(X'\)归一化后的数据,\(X_{min}\) 和 \(X_{max}\) 分别表示数据中的最小值和最大值。 以下是基于 Python 的 Min-Max 归一化代码示例: ```python import numpy as np def min_max_normalization(data): data_min = np.min(data) data_max = np.max(data) normalized_data = (data - data_min) / (data_max - data_min) return normalized_data # 示例数据 data = np.array([10, 20, 30, 40, 50]) normalized_data = min_max_normalization(data) print("Original Data:", data) print("Normalized Data:", normalized_data) ``` 上述代码实现了简单的 Min-Max 归一化逻辑,适用于单维数组或多维数组的情况。 --- #### 层归一化(Layer Normalization) 层归一化是另一种归一化方法,在 Transformer 架构中被广泛采用。它的核心思想是在神经网络的一个层内对所有激活值进行归一化操作。具体计算方式如下: \[ y_i = \alpha \cdot \frac{x_i - \mu}{\sigma} + \beta \] 其中: - \(x_i\) 表示输入向量中的第 i 个元素; - \(\mu\) 和 \(\sigma\) 分别代表当前层内所有激活值的均值和标准差; - \(\alpha\) 和 \(\beta\) 是可学习参数,用于缩放和平移归一化结果[^1]。 下面是层归一化的 PyTorch 实现代码: ```python import torch import torch.nn as nn class LayerNorm(nn.Module): def __init__(self, features, eps=1e-6): super(LayerNorm, self).__init__() self.a_2 = nn.Parameter(torch.ones(features)) self.b_2 = nn.Parameter(torch.zeros(features)) self.eps = eps def forward(self, x): mean = x.mean(-1, keepdim=True) std = x.std(-1, keepdim=True) return self.a_2 * (x - mean) / (std + self.eps) + self.b_2 # 测试层归一化模块 ln = LayerNorm(5) input_tensor = torch.tensor([[1.0, 2.0, 3.0, 4.0, 5.0]]) output_tensor = ln(input_tensor) print("Input Tensor:", input_tensor) print("Output Tensor after Layer Norm:", output_tensor) ``` 此代码展示了如何构建并应用自定义的层归一化模块。 --- #### 图像归一化 对于图像数据,通常会将其像素值从 [0, 255] 范围归一化至 [-1, 1] 或 [0, 1]。OpenCV 提供了一个便捷函数 `cv2.normalize` 来完成这一任务[^4]。 下面是一个 OpenCV 中的图像归一化示例: ```python import cv2 import matplotlib.pyplot as plt # 读取图像 image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE) # 定义归一化参数 alpha = 0 # 输出范围下限 beta = 1 # 输出范围上限 norm_type = cv2.NORM_MINMAX # 应用归一化 normalized_image = cv2.normalize(image, None, alpha, beta, norm_type) # 显示结果 plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1), plt.imshow(image, cmap='gray'), plt.title('Original Image') plt.subplot(1, 2, 2), plt.imshow(normalized_image, cmap='gray'), plt.title('Normalized Image') plt.show() ``` 该代码片段演示了如何利用 OpenCV 对灰度图像执行归一化操作。 ---
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老饼讲解-BP神经网络

请老饼喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值