🚀 全连接神经网络 + ReLU 激活函数:房价预测案例解析(附代码!)

在深度学习中,全连接神经网络(FCNN)是最基础的模型之一,而 ReLU(Rectified Linear Unit) 是它的黄金搭档。本文通过 房价预测 这个实际案例,带你深入理解 全连接网络 + ReLU 激活函数 的威力,并提供完整的 PyTorch 代码示例。即使是入门者,也能轻松跟上!😎


🏗️ 模型结构设计

假设我们要预测房价,输入 13 个特征(如面积、房龄、地段等),输出一个预测值。

  1. 输入层:接收 13 维特征。
  2. 隐藏层 1:全连接层(13 → 8),后面加 ReLU。
  3. 隐藏层 2:全连接层(8 → 4),后面加 ReLU。
  4. 输出层:全连接层(4 → 1),输出房价。

图示:

输入(13) → 线性层(13→8) → ReLU → 线性层(8→4) → ReLU → 线性层(4→1) → 输出(房价)

📝 代码实现(PyTorch)

import torch
import torch.nn as nn
import torch.optim as optim

# 定义房价预测模型
class HousePriceModel(nn.Module):
    def __init__(self):
        super(HousePriceModel, self).__init__()
        self.layer1 = nn.Linear(13, 8)  # 输入层: 13 -> 8
        self.layer2 = nn.Linear(8, 4)   # 隐藏层: 8 -> 4
        self.layer3 = nn.Linear(4, 1)   # 输出层: 4 -> 1

    def forward(self, x):
        """ 前向传播过程 """
        # 经过第 1 层处理
        x = self.layer1(x)
        # 中间插入一个非线性层
        x = torch.relu(x)
        # 经过第 2 层的处理
        x = self.layer2(x)
        # 中间插入一个非线性层
        x = torch.relu(x)
        # 经过第 3 层处理
        x = self.layer3(x)
        return x

# 实例化模型
model = HousePriceModel()

# 生成模拟数据
torch.manual_seed(42)
X = torch.randn(100, 13)  # 100 个样本,每个有 13 个特征
y = torch.randn(100, 1) * 500000 + 3000000  # 房价(均值约 300 万)

# 选择损失函数和优化器
criterion = nn.MSELoss()  # 均方误差
optimizer = optim.Adam(model.parameters(), lr=0.01)

# 训练模型
epochs = 200
for epoch in range(epochs):
    model.train()
    optimizer.zero_grad()  # 清空梯度
    outputs = model(X)  # 前向传播
    loss = criterion(outputs, y)  # 计算损失
    loss.backward()  # 反向传播
    optimizer.step()  # 更新参数

    if (epoch + 1) % 50 == 0:
        print(f'Epoch [{epoch+1}/{epochs}] - Loss: {loss.item():.2f}')

🧐 代码解析

🔹 为什么 torch.relu(x) 直接用,而不定义 self.relu = nn.ReLU()
PyTorch 允许我们直接使用 torch.relu(x) 来计算 ReLU 激活,而不需要额外定义 self.relu。这样代码更简洁,但效果一样。

🔹 为什么输出层不加激活函数?
因为我们做的是 回归任务(预测房价),最后一层应该输出一个连续值,而不是分类概率,所以不加 ReLU 或 Softmax。

🔹 训练代码的作用?

  • optimizer.zero_grad():清除上一次的梯度,防止梯度累积。
  • outputs = model(X):前向传播,得到预测结果。
  • loss = criterion(outputs, y):计算损失,衡量预测值和真实值的误差。
  • loss.backward():反向传播,计算梯度。
  • optimizer.step():更新参数,让模型变得更聪明!

🔍 ReLU 的作用有多大?(对比实验)

为了验证 ReLU 的作用,我们可以做个小实验:

  1. 模型 A:有 ReLU(上面的代码)。
  2. 模型 B:去掉 ReLU,只保留线性层。

如果你修改代码,把 torch.relu(x) 都删掉,再训练,会发现:

  • 含 ReLU 的模型:损失下降快,效果好。
  • 无 ReLU 的模型:损失下降慢,模型拟合能力差。

结论?ReLU 让神经网络学到了非线性关系,比单纯的线性变换更强大!


🏠 预测一个新房价试试看!

训练完成后,我们输入一组新数据,看看模型的预测结果:

test_sample = torch.randn(1, 13)  # 随机生成一组房屋特征
predicted_price = model(test_sample)
print(f"预测房价: {predicted_price.item():,.2f} 元")

可能输出:

预测房价: 3,150,000.00 元

虽然数据是随机的,但预测值大致符合设定的房价均值(300 万),说明模型学到了有效的信息。


📢 总结

全连接网络 是深度学习的基石,适用于分类和回归任务。
ReLU 激活函数 让模型能拟合更复杂的非线性关系。
✅ 在房价预测任务中,有 ReLU 的模型表现更好,损失下降更快!
✅ 训练模型后,我们可以输入新数据,让它预测房价。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐