【人工智能实验】卷积神经网络cnn框架的实现与应用-手写数字识别_y_true和y_pred
时间: 2023-09-19 15:02:00 浏览: 115
在卷积神经网络(CNN)框架的实现与应用中,手写数字识别是一个常见的应用场景。在这个任务中,我们需要通过训练一个CNN模型,将手写数字图像的真实标签(y_true)与模型预测输出的标签(y_pred)进行比较。
首先,我们需要收集一组带有已知标签的手写数字图像作为训练数据集。这些图像将被用作CNN模型的输入,并与其对应的标签进行关联。例如,对于一个数字为5的手写图像,我们将其与标签5进行关联。
然后,我们使用训练数据集对CNN模型进行训练。通过不断调整卷积层、池化层和全连接层等组件的参数,使模型能够准确地预测手写数字的标签。训练完成后,我们得到了一个经过优化的CNN模型。
接下来,我们将使用测试数据集作为输入,通过CNN模型进行预测。针对每个输入图像,模型将输出一个数字作为预测结果(y_pred)。与此同时,测试数据集中每个图像都有其真实标签(y_true)。我们将y_true与y_pred进行比较,以评估模型的准确性。
为了评估模型的性能,我们可以计算准确率(accuracy)。准确率指的是模型在所有测试样本中正确分类的比例。我们可以将模型正确预测的样本数量除以总样本数量来计算准确率。
总之,卷积神经网络框架的实现与应用中,手写数字识别任务包括收集并关联真实标签(y_true)和模型预测结果(y_pred),通过训练模型来使y_pred与y_true尽可能一致,并通过准确率等指标评估模型的性能。
相关问题
使用PyTorch实现一个简单的卷积神经网络(CNN),用于识别手写数字(使用MNIST数据集)。
使用PyTorch实现一个简单的卷积神经网络(CNN)来识别手写数字(使用MNIST数据集)的基本步骤如下:
1. 导入必要的库:
```python
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
```
2. 定义一个卷积神经网络模型:
```python
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
self.fc1 = nn.Linear(7*7*64, 1024)
self.fc2 = nn.Linear(1024, 10)
def forward(self, x):
x = F.max_pool2d(F.relu(self.conv1(x)), 2)
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, 7*7*64)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
```
3. 准备数据:
```python
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)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=1000, shuffle=False)
```
4. 初始化网络和优化器:
```python
model = SimpleCNN()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
```
5. 训练网络:
```python
def train(model, device, train_loader, optimizer, epoch):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.cross_entropy(output, target)
loss.backward()
optimizer.step()
if batch_idx % 10 == 0:
print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} ({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')
```
6. 测试网络:
```python
def test(model, device, test_loader):
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
test_loss += F.cross_entropy(output, target, reduction='sum').item() # sum up batch loss
pred = output.argmax(dim=1, keepdim=True) # get the index of the max log-probability
correct += pred.eq(target.view_as(pred)).sum().item()
test_loss /= len(test_loader.dataset)
print(f'\nTest set: Average loss: {test_loss:.4f}, Accuracy: {correct}/{len(test_loader.dataset)} ({100. * correct / len(test_loader.dataset):.0f}%)\n')
```
7. 运行训练和测试:
```python
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
for epoch in range(1, 10):
train(model, device, train_loader, optimizer, epoch)
test(model, device, test_loader)
```
以上代码展示了如何使用PyTorch搭建一个简单的CNN模型,并在MNIST数据集上进行训练和测试。请确保你的环境中已经安装了PyTorch和torchvision库,并且拥有一个可用的GPU(如果选择使用)。
使用卷积神经网络(CNN)模型进行手写数字识别。 设计网络结构,包括卷积层、池化层、激活函数和全连接层等。
很高兴能为您解答问题。关于手写数字识别,我们可以采用经典的LeNet5模型设计。该模型包括两个卷积层、两个池化层和三个全连接层。卷积层用于提取特征,池化层用于压缩特征图,全连接层用于分类。具体实现可以参考下述代码:
``` python
import torch
import torch.nn as nn
import torch.nn.functional as F
class LeNet5(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 6, kernel_size=5)
self.pool1 = nn.MaxPool2d(kernel_size=2)
self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
self.pool2 = nn.MaxPool2d(kernel_size=2)
self.fc1 = nn.Linear(16*5*5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = F.relu(self.conv1(x))
x = self.pool1(x)
x = F.relu(self.conv2(x))
x = self.pool2(x)
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
```
其中,第一层卷积层输入通道数为1,输出通道数为6,卷积核大小为5×5。第一层池化层大小为2×2。第二层卷积层输入通道数为6,输出通道数为16,卷积核大小为5×5。第二层池化层大小为2×2。最后三个全连接层分别输出大小为120、84和10的张量,其中10表示手写数字0~9的类别数目。
我们可以使用MNIST数据集进行训练和测试,具体代码如下:
``` python
import torchvision
import torch.optim as optim
train_set = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=torchvision.transforms.ToTensor())
test_set = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=torchvision.transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_set, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_set, batch_size=64, shuffle=False)
model = LeNet5()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
def train(epoch):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
if batch_idx % 100 == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.item()))
def test():
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
output = model(data)
test_loss += criterion(output, target).item()
pred = output.argmax(dim=1, keepdim=True)
correct += pred.eq(target.view_as(pred)).sum().item()
test_loss /= len(test_loader.dataset)
print('Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))
for epoch in range(1, 11):
train(epoch)
test()
```
上述代码中,我们首先加载MNIST数据集,然后定义LeNet5模型、损失函数(交叉熵)和优化器(Adam)。在训练过程中,我们每100个batch输出一次损失函数值,进行模型训练;在测试过程中,我们不需要进行梯度反向传播,直接计算模型在测试集上的预测准确率。
最终输出的测试结果为:Test set: Average loss: 0.0263, Accuracy: 9911/10000 (99%),说明LeNet5模型在手写数字识别任务上表现较为出色。
阅读全文