12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- from torch.nn import Module
- from torch.nn import Conv2d, Linear
- from torch.nn.functional import relu, max_pool2d
- import torch
- import torch.nn as nn
- class Lenet5(Module):
- def __init__(self):
- super(Lenet5, self).__init__()
- # 第一层卷积层,输入通道为1,输出通道为6,卷积核大小为5
- self.conv1 = nn.Conv2d(1, 6, kernel_size=5)
- # 最大池化层,池化核大小为2,步长为2
- self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
- # 第二层卷积层,输入通道为6,输出通道为16,卷积核大小为5
- self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
- # 全连接层,输入节点数为16*4*4,输出节点数为120
- self.fc1 = nn.Linear(16 * 4 * 4, 120)
- # 全连接层,输入节点数为120,输出节点数为84
- self.fc2 = nn.Linear(120, 84)
- # 输出层,输入节点数为84,输出节点数为10
- self.fc3 = nn.Linear(84, 10)
- def forward(self, x):
- # 第一层卷积,通过relu激活函数
- x = self.pool(relu(self.conv1(x)))
- # 第二层卷积,通过relu激活函数
- x = self.pool(relu(self.conv2(x)))
- # 展开张量,将其变成一维向量
- x = x.view(-1, 16 * 4 * 4)
- # 全连接层,通过relu激活函数
- x = relu(self.fc1(x))
- # 全连接层,通过relu激活函数
- x = relu(self.fc2(x))
- # 输出层,不使用激活函数
- x = self.fc3(x)
- return x
- # # 加载训练数据和测试数据
- # transform = transforms.Compose([
- # transforms.ToTensor(), # 转换为Tensor对象
- # transforms.Normalize((0.5,), (0.5,)) # 归一化处理
- # ])
- # trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
- # trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
- # testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
- # testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
- #
- # # 实例化LeNet-5模型和损失函数、优化器
- # net = LeNet5()
- # criterion = nn.CrossEntropyLoss() # 交叉熵损失函数
- # optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) # 随机梯度下降优化器
- #
- # # 训练网络
- # for epoch in range(10):
- # running_loss = 0.0
- # for i, data in enumerate(trainloader, 0):
- # inputs, labels = data
|