目录
用 PyTorch/TensorFlow 搭建简单全连接神经网络
用 PyTorch/TensorFlow 搭建简单全连接神经网络
在本篇博客中,我们将介绍如何使用两大深度学习框架——PyTorch 和 TensorFlow,构建一个简单的全连接神经网络。该网络包含输入层、一个隐藏层和输出层,适合初学者理解神经网络的基本构建模块及训练流程。
网络结构概述
我们的全连接神经网络(Fully Connected Neural Network,FCNN)由以下部分构成:
- 输入层:接收数据特征向量(例如,长度为 10 的向量)。
- 隐藏层:通过一个全连接层将输入进行非线性映射,通常会使用激活函数(如 ReLU)来增加模型的表达能力。
- 输出层:根据具体任务输出预测结果,例如回归任务输出单个连续值。
这种结构虽然简单,但能帮助我们理解前向传播、反向传播及梯度下降等基本概念。
1. 使用 PyTorch 构建网络
PyTorch 提供了灵活的动态计算图和简洁的 API,非常适合快速原型开发。下面是一个完整示例:
import torch
import torch.nn as nn
import torch.optim as optim
# 定义一个简单的全连接神经网络
class SimpleFCNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleFCNN, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size) # 输入层到隐藏层
self.relu = nn.ReLU() # 激活函数
self.fc2 = nn.Linear(hidden_size, output_size) # 隐藏层到输出层
def forward(self, x):
out = self.fc1(x)
out = self.relu(out)
out = self.fc2(out)
return out
# 超参数设置
input_size = 10 # 输入特征数量
hidden_size = 5 # 隐藏层节点数
output_size = 1 # 输出节点数
learning_rate = 0.001
num_epochs = 100
# 实例化模型、定义损失函数和优化器
model = SimpleFCNN(input_size, hidden_size, output_size)
criterion = nn.MSELoss() # 均方误差损失,用于回归问题
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
# 构造一些模拟数据
x_train = torch.randn(100, input_size)
y_train = torch.randn(100, output_size)
# 训练模型
for epoch in range(num_epochs):
outputs = model(x_train)
loss = criterion(outputs, y_train)
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向传播
optimizer.step() # 更新参数
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
解析:
- 模型定义:我们创建了一个继承自
nn.Module
的类SimpleFCNN
,其中nn.Linear
用于构建全连接层,nn.ReLU
作为激活函数。 - 训练循环:每个 epoch 中,我们计算模型输出与真实标签之间的均方误差(MSE),然后利用
optimizer
对参数进行梯度下降更新。
2. 使用 TensorFlow 构建网络
TensorFlow 通过 Keras 接口提供了直观且高层次的 API 来搭建模型,适合快速搭建原型。下面是使用 TensorFlow 的示例代码:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 超参数设置
input_size = 10 # 输入特征数量
hidden_size = 5 # 隐藏层节点数
output_size = 1 # 输出节点数
learning_rate = 0.001
num_epochs = 100
batch_size = 10
# 构建顺序模型
model = Sequential([
Dense(hidden_size, activation='relu', input_shape=(input_size,)), # 输入层到隐藏层
Dense(output_size) # 输出层
])
# 编译模型:指定优化器和损失函数(这里依然使用均方误差)
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate),
loss='mse')
# 构造一些模拟数据
import numpy as np
x_train = np.random.randn(100, input_size)
y_train = np.random.randn(100, output_size)
# 训练模型
history = model.fit(x_train, y_train, epochs=num_epochs, batch_size=batch_size, verbose=2)
解析:
- 模型构建:我们使用
Sequential
模型,添加了一个带 ReLU 激活函数的全连接层,以及一个输出层。 - 模型编译:在编译时选择了 Adam 优化器和 MSE 损失函数。
- 模型训练:调用
model.fit
函数开始训练,Keras 会自动管理训练过程及日志输出。
总结
本博客展示了如何使用 PyTorch 和 TensorFlow 两种不同的深度学习框架构建一个简单的全连接神经网络。两种实现虽然在 API 设计和风格上有所不同,但核心思想是一致的:
- 网络结构:输入层、隐藏层和输出层的搭建。
- 前向传播:数据通过层层传递得到输出。
- 损失函数与优化:计算输出与真实标签之间的误差,并利用优化器更新网络参数。
通过这两个示例,读者可以选择自己更熟悉的框架进行实验,同时也能对比两种框架的差异。希望这篇博客能帮助大家更好地理解全连接神经网络的搭建与训练过程,迈出深度学习实践的第一步!
欢迎在评论区分享你的疑问或改进建议。Happy Coding!