全连接神经网络 + ReLU 激活函数:房价预测案例解析
✅。
·
🚀 全连接神经网络 + ReLU 激活函数:房价预测案例解析(附代码!)
在深度学习中,全连接神经网络(FCNN)是最基础的模型之一,而 ReLU(Rectified Linear Unit) 是它的黄金搭档。本文通过 房价预测 这个实际案例,带你深入理解 全连接网络 + ReLU 激活函数 的威力,并提供完整的 PyTorch 代码示例。即使是入门者,也能轻松跟上!😎
🏗️ 模型结构设计
假设我们要预测房价,输入 13 个特征(如面积、房龄、地段等),输出一个预测值。
- 输入层:接收 13 维特征。
- 隐藏层 1:全连接层(13 → 8),后面加 ReLU。
- 隐藏层 2:全连接层(8 → 4),后面加 ReLU。
- 输出层:全连接层(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 的作用,我们可以做个小实验:
- 模型 A:有 ReLU(上面的代码)。
- 模型 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 的模型表现更好,损失下降更快!
✅ 训练模型后,我们可以输入新数据,让它预测房价。
更多推荐
所有评论(0)