创建ResNet18模型实例 net = ResNet18() 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4) 训练模型 for epoch in range(100): running_loss = 0.0 for i, data in enumerate(trainloader, 0): # 输入数据和标签 inputs, labels = data # 梯度清零 optimizer.zero_grad() # 前向传播、计算损失、反向传播、更新权重 outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 打印训练统计信息 running_loss += loss.item() if i % 100 == 99: print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100)) running_loss = 0.0 测试模型 correct = 0 total = 0 with torch.no_grad(): for data in testloader: # 输入数据和标签 images, labels = data # 前向传播、计算预测结果、统计准确率 outputs = net(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: %.2f %%' % (100 * correct / total))
时间: 2024-04-17 12:24:58 浏览: 182
模型评价 的损失函数 计算
这段代码创建了一个 ResNet18 模型实例,并定义了损失函数和优化器。然后使用训练集数据对模型进行训练,并使用测试集数据对模型进行评估。
- `net = ResNet18()`:创建了一个 ResNet18 模型实例,我们假设在之前的代码中已经定义了这个模型。
- `criterion = nn.CrossEntropyLoss()`:定义了交叉熵损失函数,用于衡量模型输出与真实标签之间的差异。
- `optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)`:定义了一个随机梯度下降(SGD)优化器,用于更新模型的参数。`net.parameters()` 用于获取模型的可学习参数,`lr=0.1` 是学习率,`momentum=0.9` 是动量参数,`weight_decay=5e-4` 是权重衰减(L2正则化)参数。
下面是模型的训练过程:
```python
for epoch in range(100):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 100 == 99:
print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))
running_loss = 0.0
```
- `for epoch in range(100):`:对训练数据进行100个周期的训练。
- `for i, data in enumerate(trainloader, 0):`:对训练集数据进行迭代。
- `optimizer.zero_grad()`:梯度清零,避免梯度累积。
- `outputs = net(inputs)`:进行前向传播,计算模型的输出。
- `loss = criterion(outputs, labels)`:计算模型输出与真实标签之间的损失。
- `loss.backward()`:进行反向传播,计算梯度。
- `optimizer.step()`:更新模型的参数。
- `running_loss += loss.item()`:累加当前批次的损失值。
- `if i % 100 == 99:`:每100个批次打印一次训练统计信息。
接下来是模型的测试过程:
```python
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(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: %.2f %%' % (100 * correct / total))
```
- `correct` 和 `total` 分别用于统计正确预测的样本数和总样本数。
- `with torch.no_grad():`:在测试过程中不需要计算梯度。
- `outputs = net(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: %.2f %%' % (100 * correct / total))`:打印测试集上的准确率。
以上代码段完成了对 ResNet18 模型的训练和测试过程。
阅读全文