卷积神经网络识别花卉并分类另保存

本文介绍如何使用预训练的卷积神经网络模型进行花卉识别,包括遇到的CUDA检查、模型加载到CPU、文件路径问题的解决办法,以及如何批量识别并保存花卉图片的过程。
摘要由CSDN通过智能技术生成

本篇博客转载自卷积神经网络训练花卉识别分类器

本篇博客的所有代码已上传至GitHub仓库,后续会更新各个文件夹及文件的详细说明,用者自取

由于卷积神经网络训练花卉识别分类器博客已将模型的训练、测试代码写好,且可以通过这篇博客获取到大神训练好的模型,这里我只简单记录一下copy并运行时遇到的问题。

一、VGG16_test.py遇到的问题及解决方法
1. 不知道电脑是否有CUDA

解决:在Terminal的python中输入下列代码

if torch.cuda.is_available():
    print("Has cuda")
else:
    print("No cuda")
2. 需要将加载模型的设备改为CPU

解决:将原代码中的代码片A对应地更改为代码片B

# 代码片A
device = torch.device("cuda:0" if torch.cuda.is_available() else 
好的,以下是一个使用 PyTorch 和自定义卷积神经网络模型实现花朵识别的代码示例。这个示例使用的是 Oxford Flowers 17 数据集,其中包含 17 种不同的花卉类别。 首先,我们需要导入必要的库和设置一些超参数: ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torchvision import transforms, datasets # 设置超参数 batch_size = 64 num_epochs = 20 learning_rate = 0.001 ``` 接下来,我们需要定义自定义卷积神经网络模型。这里我们使用了 4 个卷积层和 2 个全连接层: ```python class FlowerNet(nn.Module): def __init__(self): super(FlowerNet, self).__init__() self.conv1 = nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1) self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1) self.conv3 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1) self.conv4 = nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1) self.fc1 = nn.Linear(256 * 7 * 7, 512) self.fc2 = nn.Linear(512, 17) def forward(self, x): x = nn.functional.relu(self.conv1(x)) x = nn.functional.relu(self.conv2(x)) x = nn.functional.max_pool2d(x, 2) x = nn.functional.relu(self.conv3(x)) x = nn.functional.relu(self.conv4(x)) x = nn.functional.max_pool2d(x, 2) x = x.view(-1, 256 * 7 * 7) x = nn.functional.relu(self.fc1(x)) x = self.fc2(x) return x ``` 然后,我们需要加载数据集并进行数据增强: ```python # 加载数据集并进行数据增强 transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) train_dataset = datasets.ImageFolder('flower_photos/train', transform=transform) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_dataset = datasets.ImageFolder('flower_photos/test', transform=transform) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=True) ``` 最后,我们需要定义损失函数和优化器,并开始训练模型: ```python # 定义损失函数和优化器 net = FlowerNet() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(net.parameters(), lr=learning_rate) # 训练模型 for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): optimizer.zero_grad() outputs = net(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() if (i + 1) % 100 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format( epoch + 1, num_epochs, i + 1, len(train_loader), loss.item())) # 在测试集上测试模型 correct = 0 total = 0 with torch.no_grad(): for images, labels in test_loader: 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 test images: {} %'.format(100 * correct / total)) # 保存模型 torch.save(net.state_dict(), 'flower_net.pth') ``` 这个例子中,我们使用交叉熵损失函数和 Adam 优化器进行训练。在每个 epoch 结束时,在测试集上评估模型的准确度,并保存模型参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值