【模型使用过程中算法提速问题】0 并发编程之多线程(一)

面向对象的编程(OOP)中重要概念理解

概念理解:

一个抽象的模板,定义一类东西的属性和方法。

案例理解:

比如car是一类东西(一个类),可以给car定义颜色(color)、品牌(brand)、速度(speed)等属性,可以给car定义启动(start)、停车(stop)、加速(accelarate)等方法。

代码理解:

# 定义一个父类 Car
class Car:
    def __init__(self, color, brand):
        self.color = color  # 属性:颜色
        self.brand = brand  # 属性:品牌
        self.speed = 0      # 属性:速度

    def start(self):
        print(f"{self.color}的{self.brand}启动了!")

    def accelerate(self, speed_increase):
        self.speed += speed_increase
        print(f"速度增加到 {self.speed} 公里/小时")

对象

概念理解:

基于类定义的属性和方法,建立的一个具体的实例

案例理解:

比如说对象1是一辆时速为100km/h的白色甲壳虫,对象2为一辆时速为20km/h的蓝色天籁。

代码理解:

# 创建一个 Car 的对象
my_car = Car(color="红色", brand="宝马")
my_car.start()          # 输出:红色的宝马启动了!
my_car.accelerate(100)  # 输出:速度增加到 100 公里/小时

此处首先初始化了一个对象my_car:红色的宝马

这个my_car可以使用car类中定义的所有方法(start、accelerate)

继承

概念理解:

一种代码复用的机制,子类可以继承父类的属性和行为,并添加新的特性

案例理解:

比如我们新定义一个子类sportscar,他有父类car已经定义的那些属性和方法,就称为这个子类继承了这个父类;此外,这个子类还可以增加一些属性和方法,详见以下代码案例。

代码案例:

# 定义一个子类 SportsCar,继承自 Car
class SportsCar(Car):
    def __init__(self, color, brand, turbo):
        super().__init__(color, brand)  # 继承父类的属性
        self.turbo = turbo  # 新增属性:涡轮增压

    def drift(self):
        print(f"{self.color}的{self.brand}正在漂移!")

# 创建一个 SportsCar 的对象
my_sports_car = SportsCar(color="蓝色", brand="法拉利", turbo=True)
my_sports_car.start()       # 输出:蓝色的法拉利启动了!
my_sports_car.accelerate(200)  # 输出:速度增加到 200 公里/小时
my_sports_car.drift()       # 输出:蓝色的法拉利正在漂移!

_init_:

是python的类中第一个方法,它是唯一一个特殊的方法,被称为构造方法(Constructor)。它的作用就是给这一类东西初始化一些属性,当你基于这个类建立一个具体的东西(也就是对象)时,这个方法会自动执行,以确保这个具体的东西拥有这类东西已经定义好的那些基本属性(比如颜色、品牌等)。

self:

这是一个关键字,是类方法的第一个参数,用于在类的方法中引用 当前对象本身。

super():

这是一个内置函数,用于调用父类的方法,实现代码复用。它通常用于子类的 __init__ 方法中,以便初始化父类的属性。

最后,以一个基于深度学习的图像识别模型训练工程案例代码,来直观展示这些类和对象的概念的运行原理和用法:

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader

# 定义数据加载器类
class DatasetLoader:
    def __init__(self, batch_size=64, num_workers=2):
        self.batch_size = batch_size
        self.num_workers = num_workers
        self.transform = transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
        ])

    def load_cifar10(self):
        # 下载和加载训练集
        train_set = torchvision.datasets.CIFAR10(
            root='./data', train=True, download=True, transform=self.transform
        )
        train_loader = DataLoader(
            train_set, batch_size=self.batch_size, shuffle=True, num_workers=self.num_workers
        )

        # 下载和加载测试集
        test_set = torchvision.datasets.CIFAR10(
            root='./data', train=False, download=True, transform=self.transform
        )
        test_loader = DataLoader(
            test_set, batch_size=self.batch_size, shuffle=False, num_workers=self.num_workers
        )

        return train_loader, test_loader

# 定义基础图像分类器类
class ImageClassifier:
    def __init__(self, num_classes=10, learning_rate=0.001):
        self.num_classes = num_classes
        self.learning_rate = learning_rate
        self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        self.model = self._build_model().to(self.device)
        self.criterion = nn.CrossEntropyLoss()
        self.optimizer = optim.Adam(self.model.parameters(), lr=self.learning_rate)

    def _build_model(self):
        # 定义一个简单的卷积神经网络
        return nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Flatten(),
            nn.Linear(64 * 8 * 8, 512),
            nn.ReLU(),
            nn.Linear(512, self.num_classes)
        )

    def train(self, train_loader, num_epochs=10):
        self.model.train()
        for epoch in range(num_epochs):
            running_loss = 0.0
            for images, labels in train_loader:
                images = images.to(self.device)
                labels = labels.to(self.device)

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

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

                running_loss += loss.item()
            print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}")

    def evaluate(self, test_loader):
        self.model.eval()
        correct = 0
        total = 0
        with torch.no_grad():
            for images, labels in test_loader:
                images = images.to(self.device)
                labels = labels.to(self.device)

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

        accuracy = 100 * correct / total
        print(f"Accuracy of the model on the test images: {accuracy:.2f}%")

# 定义高级图像分类器类(继承自 ImageClassifier)
class AdvancedImageClassifier(ImageClassifier):
    def __init__(self, num_classes=10, learning_rate=0.001, use_data_augmentation=True):
        super().__init__(num_classes, learning_rate)
        self.use_data_augmentation = use_data_augmentation
        self.scheduler = optim.lr_scheduler.StepLR(self.optimizer, step_size=5, gamma=0.1)

    def _build_model(self):
        # 定义一个更复杂的卷积神经网络
        return nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(128),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Flatten(),
            nn.Linear(128 * 8 * 8, 1024),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(1024, self.num_classes)
        )

    def train(self, train_loader, num_epochs=10):
        # 添加数据增强
        if self.use_data_augmentation:
            print("Using data augmentation...")
            train_loader.dataset.transform = transforms.Compose([
                transforms.RandomHorizontalFlip(),
                transforms.RandomRotation(10),
                transforms.ToTensor(),
                transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
            ])

        super().train(train_loader, num_epochs)

        # 使用学习率调度器
        for epoch in range(num_epochs):
            self.scheduler.step()

# 主函数
if __name__ == "__main__":
    # 加载数据
    dataset_loader = DatasetLoader(batch_size=128)
    train_loader, test_loader = dataset_loader.load_cifar10()

    # 创建基础分类器并训练
    print("Training basic classifier...")
    basic_classifier = ImageClassifier(num_classes=10, learning_rate=0.001)
    basic_classifier.train(train_loader, num_epochs=10)
    basic_classifier.evaluate(test_loader)

    # 创建高级分类器并训练
    print("\nTraining advanced classifier with data augmentation and learning rate scheduling...")
    advanced_classifier = AdvancedImageClassifier(num_classes=10, learning_rate=0.001)
    advanced_classifier.train(train_loader, num_epochs=10)
    advanced_classifier.evaluate(test_loader)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值