反向归一化的python代码
时间: 2023-10-13 18:26:52 浏览: 152
反向归一化是将经过归一化的数据还原成原始数据的过程,其实就是对归一化公式进行逆运算。
假设我们有一个经过归一化的数据 $x_{norm}$,它的范围是 $[0, 1]$,我们想要将其还原为原始数据 $x$,它的范围是 $[a, b]$,那么反向归一化公式如下:
$x = x_{norm} \times (b-a) + a$
其中,$a$ 和 $b$ 分别为原始数据的最小值和最大值。
下面是一个简单的 Python 代码实现:
```python
def inverse_normalize(x_norm, a, b):
x = x_norm * (b - a) + a
return x
```
其中,`x_norm` 为经过归一化的数据,`a` 和 `b` 分别为原始数据的最小值和最大值。函数返回值为还原后的原始数据。
相关问题
归一化bp神经网络python代码
归一化(Normalization)是指将数据映射到一个特定的范围,通常将数据映射到[0,1]或[-1,1]区间内,以便提高训练的收敛速度和准确度。BP神经网络是一种常见的神经网络模型,用于解决分类、回归、聚类等问题,其代码实现可以使用Python语言来完成。下面是归一化BP神经网络Python代码的基本结构:
```
import numpy as np
class BPNeuralNetwork:
def __init__(self, input_dim, hidden_dim, output_dim, lr=0.1):
self.input_dim = input_dim
self.hidden_dim = hidden_dim
self.output_dim = output_dim
self.lr = lr
self.weights_ih = np.random.randn(self.hidden_dim, self.input_dim)
self.biases_ih = np.random.randn(self.hidden_dim, 1)
self.weights_ho = np.random.randn(self.output_dim, self.hidden_dim)
self.biases_ho = np.random.randn(self.output_dim, 1)
def normalize_data(self, data):
# 归一化数据
normalized_data = (data - np.min(data)) / (np.max(data) - np.min(data))
return normalized_data
def denormalize_data(self, data):
# 反归一化数据
denormalized_data = data * (np.max(data) - np.min(data)) + np.min(data)
return denormalized_data
def sigmoid(self, x):
# sigmoid激活函数
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(self, x):
# sigmoid激活函数导数
return x * (1 - x)
def forward(self, x):
# 前向传播
z1 = np.dot(self.weights_ih, x) + self.biases_ih
a1 = self.sigmoid(z1)
z2 = np.dot(self.weights_ho, a1) + self.biases_ho
y = self.sigmoid(z2)
return y, a1
def backward(self, x, y_true, y_pred, a1):
# 反向传播
delta2 = (y_true - y_pred) * self.sigmoid_derivative(y_pred)
delta1 = np.dot(self.weights_ho.T, delta2) * self.sigmoid_derivative(a1)
grad_weights_ho = np.dot(delta2, a1.T)
grad_biases_ho = delta2
grad_weights_ih = np.dot(delta1, x.T)
grad_biases_ih = delta1
return grad_weights_ih, grad_biases_ih, grad_weights_ho, grad_biases_ho
def train(self, X_train, y_train, epochs=100):
# 训练模型
for epoch in range(epochs):
loss = 0
for i in range(X_train.shape):
x = X_train[i].reshape(-1, 1)
y_true = y_train[i].reshape(-1, 1)
y_pred, a1 = self.forward(x)
loss += np.sum((y_true - y_pred) ** 2)
grad_weights_ih, grad_biases_ih, grad_weights_ho, grad_biases_ho = self.backward(x, y_true, y_pred, a1)
self.weights_ih += self.lr * grad_weights_ih
self.biases_ih += self.lr * grad_biases_ih
self.weights_ho += self.lr * grad_weights_ho
self.biases_ho += self.lr * grad_biases_ho
loss /= X_train.shape
print(f"Epoch {epoch+1} loss: {loss}")
def predict(self, X_test):
# 预测结果
predictions = []
for i in range(X_test.shape):
x = X_test[i].reshape(-1, 1)
y_pred, _ = self.forward(x)
predictions.append(y_pred)
return np.array(predictions).reshape(-1)
# 示例使用iris数据集
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[:, :2]
y = iris.target
nn = BPNeuralNetwork(input_dim=X.shape, hidden_dim=5, output_dim=1, lr=0.01)
# 归一化数据
X_norm = nn.normalize_data(X)
# 训练模型
nn.train(X_norm, y.reshape(-1, 1), epochs=1000)
# 预测结果并反归一化
X_test_norm = nn.normalize_data([[5.1, 3.5], [6.2, 3.4]])
y_pred_norm = nn.predict(X_test_norm)
y_pred_denorm = nn.denormalize_data(y_pred_norm)
print(y_pred_denorm)
```
以上是一个简单的归一化BP神经网络Python代码示例,其中包括模型初始化、归一化数据处理、前向传播、反向传播、训练模型、预测结果等步骤。
编写pytorch代码,读取一个5维的训练集,定义归一化器,对测试集进行归一化,将归一化后的数据集还原为原来的维数,调用归一化器,对验证集进行归一化
以下是一个可能的PyTorch代码实现:
```python
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
from sklearn.preprocessing import StandardScaler
# 生成一个5维随机训练集和测试集
train_data = np.random.rand(100, 5)
test_data = np.random.rand(20, 5)
# 定义归一化器
scaler = StandardScaler()
# 对训练集进行归一化
scaler.fit(train_data)
train_data_norm = scaler.transform(train_data)
# 将测试集进行归一化
test_data_norm = scaler.transform(test_data)
# 将归一化后的数据集还原为原来的维数
train_data_norm = torch.tensor(train_data_norm, dtype=torch.float32)
test_data_norm = torch.tensor(test_data_norm, dtype=torch.float32)
train_dataset = TensorDataset(train_data_norm)
test_dataset = TensorDataset(test_data_norm)
train_loader = DataLoader(train_dataset, batch_size=10, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=10, shuffle=False)
# 调用归一化器,对验证集进行归一化
val_data = np.random.rand(30, 5)
val_data_norm = scaler.transform(val_data)
# 将归一化后的验证集还原为原来的维数
val_data_norm = torch.tensor(val_data_norm, dtype=torch.float32)
# 定义一个5维的全连接神经网络
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(5, 10)
self.fc2 = nn.Linear(10, 1)
def forward(self, x):
x = self.fc1(x)
x = nn.functional.relu(x)
x = nn.functional.dropout(x, p=0.5)
x = self.fc2(x)
return x
# 定义损失函数和优化器
net = Net()
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 训练模型
for epoch in range(10):
running_loss = 0.0
for i, data in enumerate(train_loader, 0):
inputs, = data
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, torch.ones_like(outputs))
loss.backward()
optimizer.step()
running_loss += loss.item()
print('Epoch %d loss: %.3f' % (epoch + 1, running_loss / len(train_loader)))
# 在测试集上进行测试
with torch.no_grad():
for data in test_loader:
inputs, = data
outputs = net(inputs)
print(outputs)
# 在验证集上进行测试
val_data_norm = scaler.transform(val_data)
val_data_norm = torch.tensor(val_data_norm, dtype=torch.float32)
with torch.no_grad():
outputs = net(val_data_norm)
print(outputs)
```
这个代码片段首先生成了一个5维的随机训练集和测试集,使用`StandardScaler`定义了一个归一化器,对训练集进行了归一化,将测试集进行了归一化,最后将归一化后的数据集还原为原来的维数。
然后,代码片段定义了一个5维的全连接神经网络,并使用PyTorch内置的`MSELoss`作为损失函数,使用`SGD`优化器进行优化。在训练模型时,代码片段使用`DataLoader`对归一化后的数据集进行批处理,将每个批次的数据作为模型的输入,执行前向传播、计算损失、反向传播、参数更新等操作。
在测试集上进行测试时,代码片段使用`test_loader`对归一化后的测试集进行批处理,将每个批次的数据作为模型的输入,执行前向传播,输出模型的预测结果。
在验证集上进行测试时,代码片段先将验证集进行归一化,然后将归一化后的验证集还原为原来的维数,并使用训练集上的归一化器对其进行归一化,最后将归一化后的验证集作为模型的输入,执行前向传播,输出模型的预测结果。
阅读全文