
给出的代码如下:
import torch
from keras.src.metrics.accuracy_metrics import accuracy
from sympy.physics.units import momentum
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
import matplotlib.pyplot as plt
batch_size = 64
learning_rate = 0.01
#将图像转化为张量
transforms = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
#加载数据集
train_dataset = datasets.MNIST(root='../dataset',
train=True,
transform=transforms,
download=True)
train_loader = DataLoader(train_dataset,
batch_size=batch_size,
shuffle=True)
test_dataset = datasets.MNIST(root='../dataset',
train=False,
transform=transforms,
download=False)
test_loader = DataLoader(test_dataset,
batch_size=batch_size,
shuffle=False)
#定义带有卷积层的神经网络模型
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = torch.nn.Conv2d(in_channels=1,out_channels=10,kernel_size=5,bias=False)
self.conv2 = torch.nn.Conv2d(in_channels=10,out_channels=20,kernel_size=5,bias=False)
self.conv3 = torch.nn.Conv2d(in_channels=20,out_channels=30,kernel_size=3,bias=False)
self.pooling = torch.nn.MaxPool2d(2)
self.linear1 = torch.nn.Linear(in_features=30,out_features=256,bias=True)
self.linear2 = torch.nn.Linear(in_features=256,out_features=64,bias=True)
self.linear3 = torch.nn.Linear(in_features=64,out_features=10,bias=True)
def forward(self, x):
batch_size = x.size(0)
x = self.pooling(F.relu(self.conv1(x)))
x = self.pooling(F.relu(self.conv2(x)))
x = self.pooling(F.relu(self.conv3(x)))
x = x.view(batch_size,-1)
x = self.linear1(x)
x = self.linear2(x)
x = self.linear3(x)
return x
#创建实例
model = Net()
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
model.to(device)
#定义损失函数及优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate,momentum=0.5)
#训练过程
def train(epoch):
model.train()
running_loss = 0.0
for batch_idx, data in enumerate(train_loader, 0):
inputs, target = data
inputs,target = inputs.to(device),target.to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, target)
loss.backward()
optimizer.step()
running_loss += loss.item()
if batch_idx % 300 == 299:
print(f'[{epoch + 1}, {batch_idx + 1:5d}] loss: {running_loss / 300:.3f}')
running_loss = 0.0
def test(epoch):
model.eval()
correct = 0
total = 0
with torch.no_grad():
for data in test_loader:
input,labels = data
input,labels = input.to(device),labels.to(device)
output = model(input)
_, predicted = torch.max(output.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = 100 * correct / total
print(f'Accuracy on test set: {accuracy:.3f}')
return accuracy
if __name__ == '__main__':
epochs = 10
epoch_list = []
accuracy_list = []
loss_list = []
for epoch in range(epochs):
train(epoch)
accuracy = test(epoch)
epoch_list.append(epoch + 1) # 记录epoch编号(1-10)
accuracy_list.append(accuracy) # 记录每个epoch的准确率
# 绘制准确率曲线
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(epoch_list, accuracy_list, 'b-')
plt.title('Test Accuracy vs. Epochs')
plt.xlabel('Epoch')
plt.ylabel('Accuracy (%)')
plt.grid(True)
plt.tight_layout()
plt.show()
训练训练着准确率都变成过山车了。。。



&spm=1001.2101.3001.5002&articleId=150294857&d=1&t=3&u=255e2788c0ba42b09f35eb26e7cbdfff)
1万+

被折叠的 条评论
为什么被折叠?



