代码满足手动生成回归任务的数据集,要求:生成单个数据集数据集的大小为10000且训练集大小为7000,测试集大小为3000。数据集的样本特征维度p为500,且服从如下的高维线性函数y = 0.028 + Σ(0.0056 * xi) + ε 。手动生成前馈神经网络(不用torch.nn库)解决这个回归问题,分析实验结果并绘制训练集和测试集的loss曲线
时间: 2024-04-22 20:27:58 浏览: 401
你可以按照以下步骤生成回归任务的数据集并使用前馈神经网络进行训练和分析结果。
步骤1:导入所需库
首先,导入所需的库,包括numpy、matplotlib和random。
```python
import numpy as np
import matplotlib.pyplot as plt
import random
```
步骤2:生成数据集
根据给定的要求,生成数据集。样本特征维度为p=500,数据集大小为10000。
```python
p = 500
dataset_size = 10000
# 生成特征矩阵X
X = np.random.rand(dataset_size, p)
# 生成标签y
epsilon = np.random.normal(0, 0.1, size=(dataset_size,))
y = 0.028 + np.sum(0.0056 * X, axis=1) + epsilon
```
步骤3:划分训练集和测试集
根据给定的要求,将生成的数据集划分为训练集(大小为7000)和测试集(大小为3000)。
```python
train_size = 7000
test_size = 3000
train_X = X[:train_size]
train_y = y[:train_size]
test_X = X[train_size:]
test_y = y[train_size:]
```
步骤4:定义前馈神经网络模型
定义一个简单的前馈神经网络模型,包含一个隐藏层和一个输出层。
```python
class FeedForwardNN:
def __init__(self, input_dim, hidden_dim, output_dim):
self.hidden_weights = np.random.randn(input_dim, hidden_dim)
self.hidden_bias = np.zeros(hidden_dim)
self.output_weights = np.random.randn(hidden_dim, output_dim)
self.output_bias = np.zeros(output_dim)
def forward(self, X):
hidden_layer = np.dot(X, self.hidden_weights) + self.hidden_bias
hidden_layer = np.maximum(0, hidden_layer) # ReLU激活函数
output_layer = np.dot(hidden_layer, self.output_weights) + self.output_bias
return output_layer
def backward(self, X, y, learning_rate=0.001):
hidden_layer = np.dot(X, self.hidden_weights) + self.hidden_bias
hidden_layer = np.maximum(0, hidden_layer) # ReLU激活函数
output_layer = np.dot(hidden_layer, self.output_weights) + self.output_bias
# 计算损失和梯度
loss = np.mean((output_layer - y) ** 2)
output_grad = 2 * (output_layer - y) / len(y)
hidden_grad = np.dot(output_grad, self.output_weights.T)
hidden_grad[hidden_layer <= 0] = 0
# 更新权重和偏置
self.output_weights -= learning_rate * np.dot(hidden_layer.T, output_grad)
self.output_bias -= learning_rate * np.sum(output_grad, axis=0)
self.hidden_weights -= learning_rate * np.dot(X.T, hidden_grad)
self.hidden_bias -= learning_rate * np.sum(hidden_grad, axis=0)
return loss
```
步骤5:训练模型并绘制loss曲线
使用训练集训练模型,并在测试集上进行验证。记录每个epoch的loss,并绘制loss曲线。
```python
# 定义模型和训练参数
model = FeedForwardNN(p, 100, 1)
epochs = 100
learning_rate = 0.001
train_losses = []
test_losses = []
# 训练模型
for epoch in range(epochs):
# 在训练集上进行训练
train_loss = model.backward(train_X, train_y, learning_rate)
train_losses.append(train_loss)
# 在测试集上计算验证损失
test_loss = np.mean((model.forward(test_X) - test_y) ** 2)
test_losses.append(test_loss)
# 绘制loss曲线
plt.plot(range(epochs), train_losses, label='Train Loss')
plt.plot(range(epochs), test_losses, label='Test Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
```
这样,你就可以生成数据集、训练模型并绘制训练集和测试集的loss曲线了。根据loss曲线,可以分析模型的训练情况和泛化能力。
阅读全文