赞
踩
全连接神经网络(FCNN)是最基础的神经网络结构,它由多个神经元组成,这些神经元按照层级顺序连接在一起。每一层的每个神经元都与前一层的每个神经元连接。
想象你在参加一个盛大的晚会,晚会上有三个区域:接待区、交流区和结果区。
f(x) = max(0, x)
。用于隐藏层,能够引入非线性,提升模型表现。f(x) = 1 / (1 + exp(-x))
。用于输出层,特别是在二分类任务中。我们使用MNIST数据集来训练一个简单的全连接神经网络模型。MNIST数据集包含了手写数字的图像,每个图像的大小为28x28像素,共10个类别(0-9)。
如果在下载 MNIST 数据集时遇到了问题。尝试手动下载数据集(经尝试官方的似乎会被墙,说没有权限下载)
可以手动下载 MNIST 数据集,并将其放到合适的目录下。
下载数据集:
解压文件:
.gz
文件。例如,在终端中运行:gunzip train-images-idx3-ubyte.gz
gunzip train-labels-idx1-ubyte.gz
gunzip t10k-images-idx3-ubyte.gz
gunzip t10k-labels-idx1-ubyte.gz
移动文件:
./data/MNIST/raw/
目录中。首先,我们需要对 MNIST 数据集进行预处理,将图像转换为 Tensor,并进行归一化处理。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
# 1. 数据预处理
transform = transforms.Compose([
transforms.ToTensor(), # 将图像转换为Tensor,并归一化到[0, 1]
transforms.Normalize((0.5,), (0.5,)) # 标准化
])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)
讲解:
torchvision.transforms
对 MNIST 数据集进行转换,将图像转换为 Tensor,并归一化到 [0, 1] 范围。DataLoader
中,设置批量大小和是否打乱数据。接下来,定义一个简单的全连接神经网络模型。这个模型包括三个全连接层和两个激活函数(ReLU 和 Softmax)。
# 2. 定义全连接神经网络模型
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(28*28, 128) # 第一层:输入层到隐藏层
self.fc2 = nn.Linear(128, 64) # 第二层:隐藏层到隐藏层
self.fc3 = nn.Linear(64, 10) # 第三层:隐藏层到输出层
self.relu = nn.ReLU() # ReLU激活函数
self.softmax = nn.Softmax(dim=1) # Softmax激活函数,用于输出层
def forward(self, x):
x = x.view(-1, 28*28) # 将每张图片展平为一维向量
x = self.relu(self.fc1(x)) # 第一层到ReLU
x = self.relu(self.fc2(x)) # 第二层到ReLU
x = self.fc3(x) # 第三层,输出层
return self.softmax(x) # Softmax输出
model = SimpleNN()
讲解:
SimpleNN
的神经网络类,继承自 nn.Module
。__init__
方法中定义了三个全连接层(fc1
, fc2
, fc3
)和两个激活函数(ReLU
和 Softmax
)。forward
方法中定义了数据如何流经网络层,包括展平、激活函数和最终的 Softmax 输出。然后,我们定义损失函数和优化器。这里使用交叉熵损失函数和 Adam 优化器。
# 3. 定义损失函数和优化器
criterion = nn.CrossEntropyLoss() # 交叉熵损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001) # Adam优化器
讲解:
nn.CrossEntropyLoss
作为损失函数,这适用于分类任务。optim.Adam
作为优化器来更新网络参数,设置学习率为 0.001。接下来,我们定义一个函数来训练模型。在每个 epoch 中,模型会遍历训练数据,进行前向传播、计算损失、进行反向传播并更新参数。
# 4. 训练模型
def train(model, criterion, optimizer, train_loader, epochs=5):
model.train()
for epoch in range(epochs):
running_loss = 0.0
for images, labels in train_loader:
optimizer.zero_grad() # 清空梯度
outputs = model(images) # 前向传播
loss = criterion(outputs, labels) # 计算损失
loss.backward() # 反向传播
optimizer.step() # 更新参数
running_loss += loss.item()
print(f"Epoch {epoch+1}/{epochs}, Loss: {running_loss/len(train_loader)}")
讲解:
train
函数通过指定的 epochs 训练模型。每个 epoch 中,模型会遍历训练数据,进行前向传播、计算损失、进行反向传播并更新参数。最后,我们定义一个函数来评估模型的准确性。在测试数据上评估模型的表现。
# 5. 评估模型
def evaluate(model, test_loader):
model.eval()
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = correct / total
print(f"Test Accuracy: {accuracy:.4f}")
讲解:
evaluate
函数在测试数据上评估模型的准确率。模型进入评估模式,不计算梯度,直接进行预测并计算准确率。import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
# 1. 数据预处理
transform = transforms.Compose([
transforms.ToTensor(), # 将图像转换为Tensor,并归一化到[0, 1]
transforms.Normalize((0.5,), (0.5,)) # 标准化
])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)
# 2. 定义全连接神经网络模型
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(28*28, 128) # 第一层:输入层到隐藏层
self.fc2 = nn.Linear(128, 64) # 第二层:隐藏层到隐藏层
self.fc3 = nn.Linear(64, 10) # 第三层:隐藏层到输出层
self.relu = nn.ReLU() # ReLU激活函数
self.softmax = nn.Softmax(dim=1) # Softmax激活函数,用于输出层
def forward(self, x):
x = x.view(-1, 28*28) # 将每张图片展平为一维向量
x = self.relu(self.fc1(x)) # 第一层到ReLU
x = self.relu(self.fc2(x)) # 第二层到ReLU
x = self.fc3(x) # 第三层,输出层
return self.softmax(x) # Softmax输出
model = SimpleNN()
# 3. 定义损失函数和优化器
criterion = nn.CrossEntropyLoss() # 交叉熵损失函数
optimizer = optim.Adam(model.parameters(), lr=0.001) # Adam优化器
# 4. 训练模型
def train(model, criterion, optimizer, train_loader, epochs=5):
model.train()
for epoch in range(epochs):
running_loss = 0.0
for images, labels in train_loader:
optimizer.zero_grad() # 清空梯度
outputs = model(images) # 前向传播
loss = criterion(outputs, labels) # 计算损失
loss.backward() # 反向传播
optimizer.step() # 更新参数
running_loss += loss.item()
print(f"Epoch {epoch+1}/{epochs}, Loss: {running_loss/len(train_loader)}")
# 5. 评估模型
def evaluate(model, test_loader):
model.eval()
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = correct / total
print(f"Test Accuracy: {accuracy:.4f}")
# 执行训练和评估
train(model, criterion, optimizer, train_loader)
evaluate(model, test_loader)
这个完整的代码示例展示了如何使用 PyTorch 构建、训练和评估一个简单的全连接神经网络模型。
全连接神经网络是最基础的神经网络结构,通过输入层接收数据,通过隐藏层进行特征提取和学习,最后通过输出层给出预测结果。激活函数为网络引入非线性,使其能够学习和处理复杂的模式。通过逐步构建和训练模型,我们可以解决各种数据分类和回归问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。