基于Pytorch和Inception10实现图片分类

上一篇已经基于Pytorch实现了Vgg16的图片分类任务,这次写一下Inception10网络。目前很多开源的代码都是基于Tensorflow实现的,所以我用Pytorch实现了一下,基本思路差不多,只是函数的用法稍微有些不一样,如果大家发现有什么问题欢迎指正,一起交流学习。

首先引入需要的库,并创建一个conv_bn_activ类

import torch.nn as nn
import torch

class conv_bn_activ(nn.Module):  # 将卷积、BN和激活函数封装在一起,在减少代码量的同时便于阅读和理解
    def __init__(self, in_ch, out_ch, kenel_size=3, stride=1, padding=1):
        super(conv_bn_activ, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(in_ch, out_ch, kenel_size, stride, padding),
            nn.BatchNorm2d(out_ch),
            nn.ReLU(),
        )

    def forward(self, x):
        x = self.model(x)
        return x

然后利用这个类创建如上图所示的InceptionNet的基本单元

class inception_block(nn.Module):  # 创建InceptionNet的基本单元
    def __init__(self, in_ch, out_ch, stride=1):
        super(inception_block, self).__init__()
        self.c1 = conv_bn_activ(in_ch, out_ch, 1, stride, padding=0)
        self.c2_1 = conv_bn_activ(in_ch, out_ch, 1, stride, padding=0)
        self.c2_2 = conv_bn_activ(out_ch, out_ch, 3, stride=1, padding=1)
        self.c3_1 = conv_bn_activ(in_ch, out_ch, 1, stride, padding=0)
        self.c3_2 = conv_bn_activ(out_ch, out_ch, 5, stride=1, padding=2)
        self.c4_1 = nn.MaxPool2d(3, stride=1, padding=1)
        self.c4_2 = conv_bn_activ(in_ch, out_ch, 1, stride, padding=0)

    def forward(self, x):
        x1 = self.c1(x)
        x2_1 = self.c2_1(x)
        x2_2 = self.c2_2(x2_1)
        x3_1 = self.c3_1(x)
        x3_2 = self.c3_2(x3_1)
        x4_1 = self.c4_1(x)
        x4_2 = self.c4_2(x4_1)
        x = torch.cat([x1, x2_2, x3_2, x4_2], dim=1)  # 在通道维度上进行拼接
        return x

最后利用基本单元搭建Inception10网络

class Inception10(nn.Module):  # 搭建Inception10网络
    def __init__(self, num_block, num_class):
        super(Inception10, self).__init__()
        self.c1 = conv_bn_activ(3, 16)
        self.in_ch = 16
        self.out_ch = 16
        self.num_block = num_block
        self.num_class = num_class
        self.blocks = nn.Sequential()
        for block_i in range(num_block):
            for layer_i in range(2):
                if layer_i == 0:
                    block = inception_block(self.in_ch, self.out_ch, stride=2)  # 通过步长为2的卷积进行下采样
                else:
                    block = inception_block(self.out_ch*4, self.out_ch, stride=1)
                self.blocks.add_module('{}_{}'.format(block_i, layer_i), block)
            self.in_ch = self.out_ch*4
            self.out_ch *= 2  # 增大输出维度
        self.p1 = nn.AdaptiveAvgPool2d(1)
        self.fc1 = nn.Sequential(
            nn.Linear(self.out_ch*2, self.num_class),
            nn.Softmax(dim=1)
        )

    def forward(self, x):
        x = self.c1(x)
        x = self.blocks(x)
        x = self.p1(x).view(64, self.out_ch*2)
        x = self.fc1(x)
        return x

网络搭建好后就可以开始对CIFAR10数据集进行训练和测试了(当然也可以使用其他的分类数据集),训练和测试的代码可以参考我的上一篇文章,只需要将引入的网络从Vgg16改成Inception10即可。


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
图像识别水果分类算法可以使用卷积神经网络(CNN)来实现。下面是基于 PyTorch 的图像识别水果分类算法的设计和实现步骤: 1. 数据集准备:收集各种水果的图片,并将图片标记为相应的类别。将数据集分为训练集、验证集和测试集。 2. 数据预处理:对图片进行预处理,如缩放、剪裁、旋转等操作,并将像素值归一化到0-1之间。 3. 模型构建:使用 PyTorch 构建一个卷积神经网络模型。可以使用预训练的模型,如 ResNet、Inception 等,也可以自己设计模型。 4. 模型训练:使用训练集进行模型训练,并使用验证集进行模型调优。可以使用交叉验证等技术来防止过拟合。 5. 模型评估:使用测试集评估模型的性能,包括分类准确率、混淆矩阵等指标。 6. 模型应用:使用训练好的模型进行水果图片分类预测。 下面是一个简单的基于 PyTorch 的水果分类算法实现代码: ```python import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms # 数据预处理 transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 加载数据集 trainset = torchvision.datasets.ImageFolder(root='./fruits-360/Training', transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True) testset = torchvision.datasets.ImageFolder(root='./fruits-360/Test', transform=transform) testloader = torch.utils.data.DataLoader(testset, batch_size=32, shuffle=False) # 构建模型 model = torchvision.models.resnet18(pretrained=True) for param in model.parameters(): param.requires_grad = False num_ftrs = model.fc.in_features model.fc = nn.Linear(num_ftrs, 131) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.fc.parameters(), lr=0.001) # 训练模型 for epoch in range(10): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(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 = model(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: %d %%' % ( 100 * correct / total)) ``` 这里以 ResNet-18 作为卷积神经网络模型,使用水果数据集进行训练和测试,最终获得了较高的分类准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值