首页 > 其他分享 >深度学习(MobileNetV1)

深度学习(MobileNetV1)

时间:2023-09-18 22:34:59浏览次数:48  
标签:__ checkpoint torch nn self MobileNetV1 学习 state 深度

整体网络结构如下:

最关键的改进是使用了一个叫深度可分离卷积的结构,将原始的3*3卷积升通道的操作分解成了两部分:

第一部分是保持通道不变的情况下做3*3卷积。

第二部分是使用1*1的卷积做通道提升操作。

结果就是能够减少很多的运算量。

下面依然是一个猫狗大战的训练程序,并且增加了断点续练的部分处理。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from PIL import Image
import torchvision.transforms as transforms
import os

class DepthwiseSeparableConv(nn.Module):
    def __init__(self, in_channels, out_channels, stride=1):
        super(DepthwiseSeparableConv, self).__init__()
        self.depthwise = nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=stride,
                                   padding=1, groups=in_channels, bias=False)
        self.bn1 = nn.BatchNorm2d(in_channels)
        self.pointwise = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1,
                                   padding=0, bias=False)
        self.bn2 = nn.BatchNorm2d(out_channels)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        x = self.depthwise(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.pointwise(x)
        x = self.bn2(x)
        x = self.relu(x)
        return x


class MobileNet(nn.Module):
    def __init__(self, num_classes=1000):
        super(MobileNet, self).__init__()

        self.layers = nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=3, stride=2, padding=1),
            nn.BatchNorm2d(32),
            nn.ReLU(inplace=True),
            DepthwiseSeparableConv(32, 64, 1),
            DepthwiseSeparableConv(64, 128, 2),
            DepthwiseSeparableConv(128, 128, 1),
            DepthwiseSeparableConv(128, 256, 2),
            DepthwiseSeparableConv(256, 256, 1),
            DepthwiseSeparableConv(256, 512, 2),
            # Repeat 5 times
            *[DepthwiseSeparableConv(512, 512, 1) for _ in range(5)],
            DepthwiseSeparableConv(512, 1024, 2),
            DepthwiseSeparableConv(1024, 1024, 1),
            nn.AdaptiveAvgPool2d(1)
        )

        self.classifier = nn.Sequential(
            nn.Dropout(0.5),
            nn.Linear(1024, num_classes)
        )

    def forward(self, x):
        out = self.layers(x)
        out = out.view(out.size(0), -1)
        out = self.classifier(out)
        return out


# 自定义数据集类
class CustomDataset(Dataset):
    def __init__(self, image_folder, transform=None):
        self.image_folder = image_folder
        self.transform = transform

    def __len__(self):
        return 20000

    def __getitem__(self, index):
        image_name = str(index+1)+".jpg"
        image = Image.open(self.image_folder + '/' +
                           image_name).convert('RGB')
        image = self.transform(image)

        if index < 10000:
            return image, 0  # cat
        else:
            return image, 1  # dog
        

num_epochs = 10

# 创建MobileNet模型和优化器
model = MobileNet(num_classes=2)

# 加入L2正则化操作
regularization = 0.001
for param in model.parameters():
    param.data = param.data + regularization * torch.randn_like(param)

optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()

# 定义检查点路径和文件名
checkpoint_dir = './checkpoints'
checkpoint_file = 'checkpoint.pt'

# 检查检查点目录是否存在,如果不存在则创建
if not os.path.exists(checkpoint_dir):
    os.makedirs(checkpoint_dir)

# 检查是否存在之前的检查点,如果存在则加载模型和优化器状态
if os.path.isfile(os.path.join(checkpoint_dir, checkpoint_file)):
    checkpoint = torch.load(os.path.join(checkpoint_dir, checkpoint_file))
    model.load_state_dict(checkpoint['model_state_dict'])
    optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
    start_epoch = checkpoint['epoch']

    if torch.cuda.is_available():
        for state in optimizer.state.values():
            for k, v in state.items():
                if torch.is_tensor(v):
                    state[k] = v.cuda()
else:
    start_epoch = 0


# 定义训练和测试数据集的转换方式
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])


# 加载数据集并进行训练
train_dataset = CustomDataset('./cat_vs_dog/train2', transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

model.to(device)

for epoch in range(start_epoch, num_epochs):
    model.train()
    running_loss = 0.0
    correct = 0
    total = 0
    for images, labels in train_loader:

        images = images.to(device)
        labels = labels.to(device)

        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

    print(f"Epoch [{epoch + 1}/{num_epochs}], Loss: {running_loss / len(train_loader):.4f}, Accuracy: {(100 * correct / total):.2f}%")

       # 保存检查点
    checkpoint = {
        'epoch': epoch + 1,
        'model_state_dict': model.state_dict(),
        'optimizer_state_dict': optimizer.state_dict()
    }
    torch.save(checkpoint, os.path.join(checkpoint_dir, checkpoint_file))

print('Training finished.')

# 保存模型
torch.save(model.state_dict(), 'mobilenet.pth')

标签:__,checkpoint,torch,nn,self,MobileNetV1,学习,state,深度
From: https://www.cnblogs.com/tiandsp/p/17688491.html

相关文章

  • qemu源码分析(6)--Apple的学习笔记
    一,前言由于看到了类似的写法,都用到了object_dynamic_cast_assert函数,所以分析下。二,源码分析看到如下代码的写法,很眼熟CortexMBoardState*board=CORTEXM_BOARD_STATE(machine);machine的类型是MachineState*#defineCORTEXM_BOARD_STATE(obj)\OBJECT_CHECK(CortexMBoardSt......
  • 流形-流形学习算法
      流形是指连在一起的区域:是一组点的集合,且每个点都有邻域。(也就意味着流形中某个元素可以通过某种方式移动到其邻域位置)  在机器学习中,我们允许流形的维数从一个点到另一个点有所变化。(这通常发生在流形与自身相交的情况。例如数字8,流形大多数位置只有一维,但在中心相交的时......
  • python学习计划
    首先我要去购买《Python编程,从入门到实践》这本书来学习python这门课程首先第一个月我要学习python的基础知识第一周:了解Python的基础,包括变量、数据类型、运算符和基本输入/输出。第二周:学习条件语句(if、elif、else)和循环(for、while)。第三周:掌握Python的函数和参数传递。第......
  • Spring Cloud Alibaba 学习实践(一)
    SpringCloudAlibaba学习实践(一)一、环境准备(使用Docker搭建基本环境)使用VMware虚拟机搭建的CentOS7作为基础的环境Linux系统的固定IP设定为192.168.10.20Linux系统的登录用户为root1.1.Docker安装Docker官网教程参考1.1.1.检查和卸载旧版本docker$yumremov......
  • R学习(1)
    R官方网址下载教程就不说了,很简单用这个来设置代码路径setwd("C:/08_CS/Project/R/Sep")#改成你的getwd()现在打开R控制台,并将工作目录设置为保存你下载的位置(或你的工作路径)。加载CSV文件本教程的数据在data文件夹里了。这是美国人口普查局美国社区调查的州级数据......
  • Python学习笔记
    Python语言是一种解释性、面向对象、动态数据类型的高级程序设计语言创始人:吉多,荷兰人时间:1989编写的,1991公开发行Python语言特点开源、免费面向过程、面向对象、交互式编程面向过程:以事情或解决问题的过程为中心,主要考虑解决问题的思路和步骤面向对象:以事务为中心,主要考虑解决问......
  • 学习C语言的第五天
    分支语句if分支语句,我第二天的文章好像把它放在循环里了。。。和if搭配使用的是else,比如:if(1)  printf("真");else  printf("假"); //这种都是用于两个分支的如果有三个或者三个以上的分支,可使用if,elseif,else写代码的一个小tip当判断一个变量的值的时候,把常数写在后面,变......
  • 数论——欧几里得算法和扩展欧几里得算法 学习笔记
    数论——欧几里得算法和扩展欧几里得算法引入最大公约数最大公约数即为GreatestCommonDivisor,常缩写为gcd。一组整数的公约数,是指同时是这组数中每一个数的约数的数。\(\pm1\)是任意一组整数的公约数;一组整数的最大公约数,是指所有公约数里面最大的一个。最小公倍数最......
  • AI驱动的未来:深度学习在云原生应用中的创新应用探索
    人工智能(AI)和云原生技术是当今科技领域最令人振奋的发展方向之一。将深度学习与云原生应用相结合,为我们开辟了一条通向AI驱动未来的道路。本文将深入探讨深度学习在云原生应用中的创新应用,以及这一融合的未来前景。云原生应用和深度学习简介首先,让我们简要了解云原生应用和深度......
  • openGauss学习笔记-73 openGauss 数据库管理-创建和管理索引
    openGauss学习笔记-73openGauss数据库管理-创建和管理索引73.1背景信息索引可以提高数据的访问速度,但同时也增加了插入、更新和删除操作的处理时间。所以是否要为表增加索引,索引建立在哪些字段上,是创建索引前必须要考虑的问题。需要分析应用程序的业务处理、数据使用、经常被......