人工智能实验三
1.全神经网络
1.1 全连接神经网络:
使用 PyTorch 库,搭建全连接神经网络,自定义网络结构及参数量,对 MNIST 数据集进行
图像识别与分类。自行调整学习率,初始化,公差等参数使其达到最好效果。并输出正确率
随训练次数增加的图像,以及最后的正确率。计算总参数量,并记录训练时长。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
import matplotlib.pyplot as plt
import time
# 设定参数
batch_size = 128
learning_rate = 0.001
epochs = 20
input_size = 784 # 28x28 images
hidden_size1 = 512 # 第一隐藏层大小
hidden_size2 = 256 # 第二隐藏层大小
output_size = 10 # 10类数字
# 数据预处理和加载
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
train_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=True, download=True, transform=transform),
batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=False, transform=transform),
batch_size=batch_size, shuffle=False)
# 定义全连接神经网络
class FCNN(nn.Module):
def __init__(self):
super(FCNN, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size1)
self.fc2 = nn.Linear(hidden_size1, hidden_size2)
self.fc3 = nn.Linear(hidden_size2, output_size)
def forward(self, x):
x = x.view(-1, input_size) # Flatten the input
x = nn.ReLU()(self.fc1(x))
x = nn.ReLU()(self.fc2(x))
x = self.fc3(x)
return x
# 初始化网络和优化器
model = FCNN()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
criterion = nn.CrossEntropyLoss()
# 训练模型并记录训练时长
start_time = time.time()
train_losses = []
train_accuracies = []
for epoch in range(epochs):
model.train()
correct = 0
total = 0
running_loss = 0.0
for data, target in train_loader:
optimizer.zero_grad()
outputs = model(data)
loss = criterion(outputs, target)
loss.backward()
optimizer.step()
running_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total += target.size(0)
correct += (predicted == target).sum().item()
avg_loss = running_loss / len(train_loader)
train_losses.append(avg_loss)
accuracy = 100 * correct / total
train_accuracies.append(accuracy)
print(f'Epoch [{epoch+1}/{epochs}], Loss: {avg_loss:.4f}, Accuracy: {accuracy:.2f}%')
# 测试模型
model.eval()
correct = 0
total = 0
with torch.no_grad():
for data, target in test_loader:
outputs = model(data)
_, predicted = torch.max(outputs.data, 1)
total += target.size(0)
correct += (predicted == target).sum().item()
test_accuracy = 100 * correct / total
end_time = time.time()
# 输出结果
print(f'Test Accuracy: {test_accuracy:.2f}%')
print(f'Total Parameters: {sum(p.numel() for p in model.parameters())}')
print(f'Training Duration: {end_time - start_time:.2f} seconds')
# 绘制损失和准确率随训练次数的变化
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(train_losses, label='Training Loss')
plt.title('Training Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(train_accuracies, label='Training Accuracy')
plt.title('Training Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy (%)')
plt.legend()
plt.show()
2,卷积神经网络:
使用 PyTorch 库,搭建卷积神经网络,自定义网络结构及参数量,对 MNIST 数据集进行图
像识别与分类。自行调整学习率,初始化,公差等参数使其达到最好效果。并输出正确率随
训练次数增加的图像,以及最后的正确率。计算总参数量,并记录训练时长。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
import matplotlib.pyplot as plt
import time
import torch.nn.functional as F # 需要导入 F
# 设定参数
batch_size = 128
learning_rate = 0.001
epochs = 15
input_size = 1 # 单通道图像
output_size = 10 # 10类数字
# 数据预处理和加载
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
train_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=True, download=True, transform=transform),
batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=False, transform=transform),
batch_size=batch_size, shuffle=False)
# 定义卷积神经网络
class CNN(nn.Module):
def __init__(self):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(in_channels=input_size, out_channels=32, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.fc1 = nn.Linear(64 * 7 * 7, 128) # 64 channels, each of size 7x7 after pooling
self.fc2 = nn.Linear(128, output_size)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 64 * 7 * 7) # Flatten the output for the fully connected layer
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
# 初始化网络和优化器
model = CNN()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
criterion = nn.CrossEntropyLoss()
# 训练模型并记录训练时长
start_time = time.time()
train_losses = []
train_accuracies = []
for epoch in range(epochs):
model.train()
correct = 0
total = 0
running_loss = 0.0
for data, target in train_loader:
optimizer.zero_grad()
outputs = model(data)
loss = criterion(outputs, target)
loss.backward()
optimizer.step()
running_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
total += target.size(0)
correct += (predicted == target).sum().item()
avg_loss = running_loss / len(train_loader)
train_losses.append(avg_loss)
accuracy = 100 * correct / total
train_accuracies.append(accuracy)
print(f'Epoch [{epoch+1}/{epochs}], Loss: {avg_loss:.4f}, Accuracy: {accuracy:.2f}%')
# 测试模型
model.eval()
correct = 0
total = 0
with torch.no_grad():
for data, target in test_loader:
outputs = model(data)
_, predicted = torch.max(outputs.data, 1)
total += target.size(0)
correct += (predicted == target).sum().item()
test_accuracy = 100 * correct / total
end_time = time.time()
# 输出结果
print(f'Test Accuracy: {test_accuracy:.2f}%')
print(f'Total Parameters: {sum(p.numel() for p in model.parameters())}')
print(f'Training Duration: {end_time - start_time:.2f} seconds')
# 绘制损失和准确率随训练次数的变化
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(train_losses, label='Training Loss')
plt.title('Training Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(train_accuracies, label='Training Accuracy')
plt.title('Training Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy (%)')
plt.legend()
plt.show()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)