赞
踩
import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms # 定义神经网络结构 class SimpleNN(nn.Module): def __init__(self, input_size, hidden_size, num_classes): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, num_classes) def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out # 设置超参数 input_size = 784 # MNIST数据集的输入大小是28x28=784 hidden_size = 784 num_classes = 10 learning_rate = 0.01 num_epochs = 10 # 加载MNIST数据集 train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True) test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor()) # 数据加载器 train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=100, shuffle=True) test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=100, shuffle=False) # 实例化模型 model = SimpleNN(input_size, hidden_size, num_classes) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=learning_rate) # 训练模型 total_step = len(train_loader) for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): # 将输入数据转换为一维向量 images = images.reshape(-1, 28*28) # 前向传播 outputs = model(images) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() if (i+1) % 100 == 0: print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' .format(epoch+1, num_epochs, i+1, total_step, loss.item())) # 测试模型 with torch.no_grad(): correct = 0 total = 0 for images, labels in test_loader: images = images.reshape(-1, 28*28) outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: {} %'.format(100 * correct / total)) # 获取模型参数 params = model.parameters() # 打印每个参数的名称和值 for name, param in model.named_parameters(): print(f'Parameter name: {name}') print(f'Parameter value: {param}')
以下代码测试正确率为:99.37%
import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 定义适合MNIST数据集的CNN模型 class MNISTCNN(nn.Module): def __init__(self): super(MNISTCNN, self).__init__() # 卷积块 1 self.conv_block1 = nn.Sequential( nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2) ) # 卷积块 2 self.conv_block2 = nn.Sequential( nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2) ) # 全连接层 self.fc_layer = nn.Sequential( nn.Linear(64 * 7 * 7, 512), # 假设经过前面的卷积和池化后特征图大小为7x7 nn.ReLU(), nn.Dropout(p=0.5), nn.Linear(512, 10) # MNIST有10个类别 ) def forward(self, x): x = self.conv_block1(x) x = self.conv_block2(x) # 将卷积层输出展平为一维向量 x = x.view(x.size(0), -1) # 通过全连接层 x = self.fc_layer(x) return x # 创建模型实例 model = MNISTCNN() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 加载MNIST数据集并预处理 transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]) train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) # 使用DataLoader加载批量数据 batch_size = 64 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False) # 开始训练 num_epochs = 10 for epoch in range(num_epochs): for inputs, labels in train_loader: # 前向传播 outputs = model(inputs) loss = criterion(outputs, labels) # 反向传播和优化 optimizer.zero_grad() # 清空梯度缓存 loss.backward() # 计算梯度 optimizer.step() # 更新参数 # 每个epoch结束时打印损失 print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}') # 测试模型 model.eval() # 将模型切换到评估模式(禁用Dropout和BatchNorm等) with torch.no_grad(): correct = 0 total = 0 for images, labels in test_loader: outputs = model(images) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print(f'Test Accuracy: {100 * correct / total}%')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。