用pytorch写一个菜品识别卷积神经网络
时间: 2023-11-23 07:27:21 浏览: 146
通过pytorch搭建卷积神经网络完成手写识别任务,并将训练好的模型以多种方式部署到TensorRT中加速
好的,下面是一个简单的菜品识别卷积神经网络的 PyTorch 实现。我们使用一个简单的卷积神经网络架构,包含几个卷积层和全连接层。
首先需要导入 PyTorch 和其他必要的库:
```python
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
```
然后定义一个继承自 `nn.Module` 的类来实现卷积神经网络:
```python
class DishClassifier(nn.Module):
def __init__(self, num_classes=10):
super(DishClassifier, self).__init__()
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)
self.conv3 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.fc1 = nn.Linear(64 * 4 * 4, 512)
self.fc2 = nn.Linear(512, num_classes)
self.relu = nn.ReLU()
def forward(self, x):
x = self.conv1(x)
x = self.relu(x)
x = self.pool(x)
x = self.conv2(x)
x = self.relu(x)
x = self.pool(x)
x = self.conv3(x)
x = self.relu(x)
x = self.pool(x)
x = x.view(-1, 64 * 4 * 4)
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
```
这个模型包含三个卷积层,每个卷积层后面跟着一个 ReLU 激活函数和一个池化层,最后是两个全连接层。输入图像的尺寸为 3x32x32。
接下来,我们需要加载数据集。这里使用 CIFAR-10 数据集,该数据集包含 10 种不同的菜品图像。
```python
transform = transforms.Compose([
transforms.Resize((32, 32)),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=256, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=256, shuffle=False)
```
我们使用 `transforms` 模块对图像进行预处理,将其缩放到 32x32,转换为 PyTorch 张量,并对像素值进行标准化。然后使用 `CIFAR10` 类加载数据集。
现在我们就可以训练模型了:
```python
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = DishClassifier(num_classes=10).to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
for epoch in range(10):
running_loss = 0.0
for i, (images, labels) in enumerate(train_loader):
images = images.to(device)
labels = labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 100 == 99:
print(f'Epoch {epoch + 1}, batch {i + 1}: loss {running_loss / 100:.3f}')
running_loss = 0.0
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
images = images.to(device)
labels = labels.to(device)
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Epoch {epoch + 1}: accuracy {correct / total:.3f}')
```
我们使用交叉熵损失函数和 Adam 优化器进行训练。在每个 epoch 中,我们遍历训练集中的所有批次,并计算模型的输出和损失。然后根据损失计算梯度并更新模型参数。
每 100 个批次,我们打印一次损失值。在每个 epoch 结束时,我们评估模型在测试集上的准确率。
这个示例只是一个简单的卷积神经网络,可以根据具体问题和数据集进行修改。
阅读全文