【Intel校企合作课程】深度卷积神经网络在猫狗图像分类中的应用研究——以VGG-19模型为例

项目背景及意义

“深度学习分类挑战的典范:图像中的猫狗识别技术探索”

在数字时代中,社交网络已成为人们分享日常生活点滴的虚拟广场,其中,宠物照片的分享尤为受欢迎。猫和狗作为家庭中常见的宠物,它们的图片遍布各个角落,成为网络文化的一部分。然而,并非每个人都能毫不费力地区分这些四脚朋友,特别是当图像质量参差不齐或者宠物的特征在视觉上不够明显时。

"猫狗大战"不仅是一场挑战深度学习算法准确性的赛事,更是一项探索如何通过尖端图像分类技术来提升自动化识别精度的重要工程。利用深度学习的强大能力,我们能够开发出能够区分猫和狗的智能系统,这项技术的潜在应用场景多样,从社交平台上的智能内容标记到宠物识别应用程序、甚至是将其融入安全监控系统以增强功能性。

通过精心设计的深度学习模型,如VGG-19这样的复杂神经网络,可大幅度提高识别的准确率,对图像中模糊不清的动物进行分类将变得高效、自动化。这样的技术进步不仅展示了深度学习作为人工智能领域的革命性力量,也为相似技术应用在更广泛的领域提供了可能,体现了人工智能在现代社会越来越显著的应用价值。

1 项目简介

1.1 问题描述

在本研究项下,我们计划精心筹备并构建一个符合VGG19模型要求的综合性图像数据集。这一数据集不仅需要包含详尽精确的分类标签,还要经过一系列专业的数据预处理步骤以确保模型输入的质量。构建过程中,我们会仔细地遵循VGG19模型的经典网络架构,其包括了精确配置的卷积层、池化层和全连接层。

随着模型架构的确立,接下来将采用我们精心准备的训练集对VGG19模型进行系统训练,期间细心调校各项模型参数与超参数,以期达到最佳学习效率和效果。在模型训练阶段完成后,我们将利用独立的验证数据集对模型的性能进行全面评估。通过计算模型的准确率、损失值等关键性能指标,全方位衡量模型的识别能力和泛化性,确保其在实际应用场景中的可靠性和高效性。

1.2 预期解决方案

本项目的核心任务是设计并训练一个先进的机器学习模型,该模型能够在接收到新的图像输入时,准确判断图像是展示了一只猫还是一只狗。关键目标是确保模型具备良好的泛化能力,即使面对从未经训练的数据集中抽取的图像,也能保持高准确度。在测试数据集上的表现将是衡量模型优劣的关键指标。

为了模拟真实世界应用场景,我们将把训练有素的模型部署到一个模拟的生产环境中。在该环境中,模型的推理速度(即完成预测所需的时间)与其在二分类任务上的准确度(特别是F1分数——一种考虑精确度和召回率的性能指标)将被作为模型性能的主要评价标准。这一步骤不仅是测试模型实战能力的重要环节,同时也能为我们提供关于模型在实际部署时的运行效率与准确性的直观反馈。

1.3 数据集

数据集:百度网盘链接提取码:fly8
提取码: fly8

1.4 图像展示

下面展示数据集中的猫和狗的图像:
猫: Picture of cats

狗: Picture of dog

2 数据预处理

2.1 数据集结构

在进行本项目的研究和分析时,数据集的结构被设计得十分精细,以促进模型的有效学习和准确评估。项目的数据细分为两个关键部分:一是用于模型训练的丰富训练集,二是用于后续测试和验证模型健壮性的测试集。这两部分分别被整齐归档于两个文件夹中,名为"train"和"test"。
如下图所示:
数据集文件夹

2.2 数据探索性分析

首先取训练集中的前10到18张(共9张)图片进行展示

# 获取训练集中的九张图片
image_dir = './train'
image_files = os.listdir(image_dir)[9:18]

# 创建一个3行3列的子图布局
fig, axes = plt.subplots(3, 3, figsize=(10, 10))

# 设置图片标题的字体大小
plt.rcParams['axes.titlesize'] = 10

# 遍历每个子图,并显示图片
for i, ax in enumerate(axes.flat):
   # 加载图片
   image_path = os.path.join(image_dir, image_files[i])
   sample_image = plt.imread(image_path)

   # 显示图片
   ax.imshow(sample_image)
   ax.axis('off')
   ax.set_title(f'Image {i+1}')

# 调整子图之间的间距
plt.tight_layout()

# 展示图片
plt.show()

展示数据集

2.3 拆分数据集

对训练集进行拆分,按照8:2的比例分为训练集和验证集,并分别对训练集和验证集分为cats和dogs文件夹,利于后续训练。

import os
import random
import shutil
import numpy as np  # 导入NumPy库
from numpy.random import seed
#此代码划分训练集和数据集
def spiltTrainTest(image_folder,tarin_ratio=0.8,seed=42):
    image_file=[file for file in os.listdir(image_folder) if file.lower().endswith('.jpg')]#访问jpg
    random.seed(seed)
    random.shuffle(image_file)#打乱列表
    split=int(len(image_file)*tarin_ratio)#计算切分点
    train_set=image_file[:split]
    test_set=image_file[split:]
    return train_set,test_set
 
def moveImage_tofolders(file_list,source_folder,target_folder):
    for file_name in file_list:
        source_path=os.path.join(source_folder,file_name)#image/cat.ssss原来的路径
        target_path=os.path.join(target_folder,file_name)#train/cat.sss
        shutil.move(source_path,target_path)
 
if __name__=='__main__':
    image_folder="train"#图片文件夹
    train_set, test_set=spiltTrainTest(image_folder)
 
    train_folder="train"
    test_folder="test"
    os.makedirs(train_folder, exist_ok=True)
    os.makedirs(test_folder, exist_ok=True)
    moveImage_tofolders(train_set,image_folder,train_folder)
    moveImage_tofolders(test_set,image_folder,test_folder)

拆分结果展示:
数据集拆分结果展示

2.4 提取数据集

# 创建自定义数据集
class SelfDataset(Dataset):
    def __init__(self, root_dir, transform=None):
        self.root_dir = root_dir
        self.transform = transform
        self.classes = ['cats', 'dogs']
        self.data = self.load_data()
 
    def load_data(self):
        data = []
        for class_idx, class_name in enumerate(self.classes):
            class_path = os.path.join(self.root_dir, class_name)
            for file_name in os.listdir(class_path):
                file_path = os.path.join(class_path, file_name)
                if os.path.isfile(file_path) and file_name.lower().endswith('.jpeg'):
                    data.append((file_path, class_idx))
        return data
 
    def __len__(self):
        return len(self.data)
 
    def __getitem__(self, idx):
        img_path, label = self.data[idx]
        img = Image.open(img_path).convert('RGB')
        if self.transform:
            img = self.transform(img)
        return img, label

提取结果展示:
提取结果展示

2.5 数据增强

为了增强模型对各种尺寸和位置变动的适应能力,我们实施了transforms.RandomResizedCrop(64),这个过程随机选取并裁剪原图像的一部分,并将其缩放至统一的64x64像素大小。这个策略不但丰富了数据集的多样性,还使模型在识别不同尺度的图像对象时更为鲁棒。

此外,我们还引入了transforms.RandomHorizontalFlip来进一步扩展数据集。该方法通过随机地水平翻转图像,教会模型在这一变换下保持对物体识别的稳定性,致力于实现图像识别的方向不变性。

最后,为了确保图像数据能够被模型正确处理,我们使用transforms.ToTensor转换步骤将每个像素点的数值标准化至0到1区间,并调整图像的维度排列顺序,从原来的高度x宽度x通道数(H x W x C),变为适合模型输入的通道数x高度x宽度(C x H x W)。通过这些预处理程序,我们为构建一个强大的视觉识别系统打下了坚实的基础。

# 数据增强
transform = transforms.Compose([    transforms.RandomResizedCrop(64),    transforms.RandomHorizontalFlip(),    transforms.ToTensor(),])

3 使用卷积神经网络识别猫狗图像

3.1 卷积神经网络

卷积神经网络(CNN)是深度学习领域的一颗璀璨明星,尤其在图像和视频分析任务中大放异彩。它与传统的神经网络不同之处在于其高效的空间数据处理能力,得益于CNN结构中独有的卷积和池化机制。这种独特的架构使得网络能够捕捉到图像内丰富的空间层次信息。

一个典型的卷积神经网络包含几个相互作用的层次:众多卷积层、动态的激活函数、效率高的池化层,以及最终的全连接层。在每一卷积层中,都藏着一组精心设计的卷积核,它们就如同一把把锋利的钥匙,能够解锁并提炼出输入数据中隐藏的多样化特征。通过在输入数据上滑动卷积窗口来进行特征提取,卷积核生成了一序列的特征图,每张特征图都是对原始数据某种特征的精妙捕获。随后,通过一系列激活函数的激荡,非线性的元素被注入,使得模型可以理解更加复杂的数据模式。而池化层的加入,则如同通过筛选,保留最闪光的信息精华,同时压缩了数据维度,提高了计算效率。至于最末端的全连接层,如同指挥家一般,将各个池化层的信息交汇融合,将深层特征转化为模型所需的最终输出。

卷积神经网络是一种精密的数据处理大师,能够在保持图像空间共性的同时,精准地区分和识别各种细节特征,这使得它在视觉相关的机器学习任务中成为了不可或缺的工具。

3.2 VGG-19架构

VGG19深度卷积神经网络是由牛津大学视觉几何组(Visual Geometry Group)研发的先进图像识别模型。模型的命名中所包含的数字“19”指模型拥有19个有效的权重层,这包含了多个卷积层和全连接层。

本模型在多个图像处理任务上展现了卓越的性能,尤其在图像分类、物体检测以及语义分割等方面。VGG19的设计理念在于其结构的简洁性和规整性,由相继的卷积层组成,并在每两个连续的卷积层之间配备了池化层。所有卷积层均采用了固定尺寸的小型滤波器(例如3x3),这种一致性的设计不仅有利于特征的有效抽取,同时也保持了网络结构的洁净及易于增减的灵活性。

本研究在实施猫狗识别任务的过程中,引入了VGG19模型作为基础架构。下文附图展示了该模型的结构框图,图中详解了模型中各层的排布及连接方式。
总体架构图1
总体架构图2

3.3 VGG-19与VGG-16架构对比

VGG16与VGG19神经网络在构造上的最显著差异在于网络深度。VGG16网络结构由16层卷积层与3层全连接层构成,而VGG19则包含19层卷积层与同样的3层全连接层,进而置于VGG19一个更深层次的网络框架。

随着深度的增加,VGG19网络在特征提取能力方面获得了增强。这是由于额外卷积层的引入,它们扩展了网络的能力,以识别更复杂的模式与特征。然而,这种深度上的扩展也伴随着参数数量的增加,显著提升了模型训练的资源消耗与时间成本。再者,这种复杂度的提升可能引致过度拟合的风险,尤其是在训练样本有限的情况下。因此,在选择模型配置时,研究者须权衡深度、性能与资源消耗之间的关系。
VGG-16与VGG-19的对比图

3.4 优化函数

在本研究项目中,为了提升模型训练的准确性,我们综合运用了以下几种优化策略:

  • (1)应用了交叉熵损耗函数(Cross Entropy Loss Function,通过nn.CrossEntropyLoss()实现),此函数在分类问题上为标准选择。它通过衡量模型输出与实际标注标签之间的差异度,来指导模型的学习过程。

  • (2)采用Adam优化器(通过optim.Adam进行实例化),此优化算法基于梯度下降并配以动量历史,已在深度学习领域得到广泛认可,因其自适应性能较为出色。

  • (3)结合学习率动态调整机制,使用了ReduceLROnPlateau学习率调度器(通过optim.lr_scheduler.ReduceLROnPlateau实现)。本方法依据验证集合的性能变化进行学习率的动态调整,在模型进入训练性能平台期(plateau)时自动下调学习率,以此避免训练进程中的过拟合现象,保证了学习过程的稳定性与收敛性。

这些方法的综合运用,对于模型训练精度的提升起到了核心作用,克服了模型因超参数选择不当而引起的训练效率低下和过/欠拟合问题,促进了模型泛化性能的优化。
优化函数代码展示:

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(vgg16_model.parameters(), lr=0.001, weight_decay=1e-4)
 
 
# 添加学习率调度器
# 使用 ReduceLROnPlateau 调度器
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='max', factor=0.1, patience=3, verbose=True)
 
 
# 训练参数
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
vgg16_model.to(device)

4 在CPU上进行训练

4.1 创建VGG19模型

代码如下:

class CustomVGG19(nn.Module):
    def __init__(self):
        super(CustomVGG19, self).__init__()
        self.vgg19_model = models.vgg19(pretrained=True)
        for param in self.vgg19_model.features.parameters():
            param.requires_grad = False
        num_features = self.vgg19_model.classifier[6].in_features
        self.vgg19_model.classifier[6] = nn.Sequential(
            nn.Linear(num_features, 512),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(512, 2)
        )
 
    def forward(self, x):
        return self.vgg19_model(x)
 
# 创建 CustomVGG19 模型实例
vgg19_model = CustomVGG19()
 
# 加载权重
vgg19_model.vgg19_model.load_state_dict(torch.load('vgg19_model.pth', map_location=torch.device('cpu')))
 
# 将模型移动到CPU
device = torch.device('cpu')
vgg19_model.to(device)
 
# 重新构建优化器
optimizer = optim.Adam(vgg19_model.parameters(), lr=0.001, weight_decay=1e-4)
 
# 使用Intel Extension for PyTorch进行优化
vgg19_model, optimizer = ipex.optimize(model=vgg19_model, optimizer=optimizer, dtype=torch.float32)

4.2 直接在CPU上进行训练

代码如下:

vgg19_model.eval()
 
# Assuming you have a DataLoader for the test dataset (test_loader)
all_predictions = []
all_labels = []
start_time = time.time()
 
with torch.no_grad():
    for inputs, labels in test_loader:
        inputs, labels = inputs.to(device), labels.to(device)
        outputs = vgg19_model(inputs)
        _, predicted = torch.max(outputs, 1)
        all_predictions.extend(predicted.cpu().numpy())
        all_labels.extend(labels.cpu().numpy())
 
end_time = time.time()  # 记录结束时间
elapsed_time = end_time - start_time
print(f'测试集用的时间为: {elapsed_time:.2f} seconds')
f1 = f1_score(all_labels, all_predictions, average='binary')  # 适用于二分类问题
print(f'F1分数为: {f1:.4f}')

注:如果在CPU上直接进行推理的话,时间会非常慢。大概为70s左右
CPU上的训练结果及F1分数展示

5 在GPU上进行训练

5.1 训练步骤

为了逐步优化卷积神经网络模型参数,提升在训练和测试数据集上的性能表现,本研究设计了一个迭代优化流程,详细步骤如下:

    1. 迭代上限设定:本实验将迭代次数(Epochs)上限设定为50,初始F1分数为0,以确保模型有充足的训练周期进行参数调整。
    1. 模型训练状态设定:运用vgg19_model.train()方法,将VGG19模型置于训练模式,激活模型中的训练特定运算,例如Dropout和Batch Normalization。
    1. 训练损失计算:在训练周期内,遍历训练数据集 train_loader 的数据批量,将每批数据送入模型执行前向传播,以获得预测输出 outputs。根据输出与真实标签计算损失值 loss,并执行反向传播及优化器步骤,优化网络权重。
    1. 验证损失计算:每个训练周期结束后,利用验证数据集 val_loader 进行模型验证。执行前向计算,根据预测值 val_outputs 和真实标签确定验证损失 val_loss。
    1. 损失平均化:将训练与验证过程中积累的损失和分别除以各自数据集的批次数量,计算得出平均训练损失 avg_train_loss 和平均验证损失 avg_val_loss。
    1. 损失输出记录:通过控制台输出当前训练周期的平均训练损失和平均验证损失,以便实时监控模型优化过程。
    1. 模型性能评估:将模型置于评估状态,通过测试数据集 test_loader 进行性能测试。对测试集数据进行前向计算以获取预测输出,计算并记录测试结果的F1分数,以评估模型的泛化能力。
    1. 学习率调整:依据验证集上的F1分数,调用 scheduler.step(f1) 方法动态调整学习率,以优化模型训练进程。

以上优化流程旨在通过系统的训练、验证和测试迭代,实现对VGG19模型性能的深化优化,并确保模型在各项评估指标上达到更高标准。

5.2 查看test数据集F1分数及时间

在GPU上查看F1分数和时间时,大概F1分数达到0.9左右,时间为450s左右。
GPU上的推理结果及F1分数展示

5.3 使用验证集和测试集进行推理测试

从验证数据集中抽取一幅图像样本,将其输入至经过充分训练的模型中,执行前向传播以获得预测结果。随后,采用数据可视化的方法呈现原始图像、标注的真实类别以及模型预测的类别标签,以便深入分析模型的识别效能。

# 选择一张 test_loader 中的图片
sample_image, true_label = next(iter(test_loader))
 
# 将图片传递给模型进行预测
sample_image = sample_image.to(device)
with torch.no_grad():
    model_output = vgg19_model(sample_image)
 
# 获取预测结果
_, predicted_label = torch.max(model_output, 1)
 
# 转换为 NumPy 数组
sample_image = sample_image.cpu().numpy()[1]  # 将数据从 GPU 移回 CPU 并取出第一张图片
predicted_label = predicted_label[1].item()
print(predicted_label)
true_label = true_label[0].item()  # 直接获取标量值
print(true_label)
# 获取类别标签
class_labels = ['cat', 'dog']
 
# 显示图像
plt.imshow(np.transpose(sample_image, (1, 2, 0)))  # 转置图片的维度顺序
plt.title(f'TRUE LABEL IS: {class_labels[true_label]}, PREDICT LABEL IS: {class_labels[predicted_label]}')
plt.axis('off')
plt.show()

验证集展示1

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image  # Ensure you have the PIL library installed
 
# Assuming you have defined data_transform earlier
data_transform = transforms.Compose([    transforms.Resize(224),    transforms.CenterCrop(224),    transforms.ToTensor(),    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])
 
# 选择一张指定图像进行训练
image_path = './test1/10011.jpg'  # 替换为你的图像文件路径
sample_image = Image.open(image_path).convert('RGB')
sample_image = data_transform(sample_image)
sample_image = sample_image.unsqueeze(0)  # 添加批次维度
 
# 将图片传递给模型进行预测
sample_image = sample_image.to(device)
with torch.no_grad():
    model_output = vgg19_model(sample_image)
 
# 获取预测结果
_, predicted_label = torch.max(model_output, 1)
 
# 转换为 NumPy 数组
sample_image = sample_image.cpu().numpy()[0]  # 将数据从 GPU 移回 CPU 并取出第一张图片
predicted_label = predicted_label[0].item()
print(predicted_label)
 
# 获取类别标签
class_labels = ['cat', 'dog']
 
# 显示图像
plt.imshow(np.transpose(sample_image, (1, 2, 0)))  # 转置图片的维度顺序
plt.title(f' PREDICT LABEL IS: {class_labels[predicted_label]}')
plt.axis('off')
plt.show()

验证集展示2

6 使用oneAPI组件

6.1 Transfer Learning with oneAPI AI Analytics Toolkit进行迁移学习

代码如下:

class CustomVGG19(nn.Module):
    def __init__(self):
        super(CustomVGG19, self).__init__()
        self.vgg19_model = models.vgg19(pretrained=True)
        for param in self.vgg19_model.features.parameters():
            param.requires_grad = False
        num_features = self.vgg19_model.classifier[6].in_features
        self.vgg19_model.classifier[6] = nn.Sequential(
            nn.Linear(num_features, 512),
            nn.ReLU(),
            nn.Dropout(0.5),
            nn.Linear(512, 2)
        )
 
    def forward(self, x):
        return self.vgg19_model(x)
 

6.2 使用Intel Extension for PyTorch进行优化

代码如下:

vgg19_model = CustomVGG19()
 
# 加载权重
vgg19_model.vgg19_model.load_state_dict(torch.load('vgg19_model.pth', map_location=torch.device('cpu')))
 
# 将模型移动到CPU
device = torch.device('cpu')
vgg19_model.to(device)
 
# 重新构建优化器
optimizer = optim.Adam(vgg19_model.parameters(), lr=0.001, weight_decay=1e-4)
 
# 使用Intel Extension for PyTorch进行优化
vgg19_model, optimizer = ipex.optimize(model=vgg19_model, optimizer=optimizer, dtype=torch.float32)

6.3 使用 Intel® Neural Compressor 量化模型

代码如下:

# 检查文件是否存在
assert os.path.exists("./vgg19_optimized.pth"), "文件不存在"
 
# 尝试加载模型
model = torch.load("./vgg19_optimized.pth")
print("模型加载成功")
from neural_compressor.config import PostTrainingQuantConfig, AccuracyCriterion
from neural_compressor import quantization
import os
 
# 加载模型
model = CustomVGG19()
model.load_state_dict(torch.load('vgg19_optimized.pth'))
model.to('cpu')  # 将模型移动到 CPU
model.eval()
 
# 定义评估函数
def eval_func(model):
    with torch.no_grad():
        y_true = []
        y_pred = []
 
        for inputs, labels in train_loader:
            inputs = inputs.to('cpu')
            labels = labels.to('cpu')
            preds_probs = model(inputs)
            preds_class = torch.argmax(preds_probs, dim=-1)
            y_true.extend(labels.numpy())
            y_pred.extend(preds_class.numpy())
 
        return accuracy_score(y_true, y_pred)
 
# 配置量化参数
conf = PostTrainingQuantConfig(backend='ipex',  # 使用 Intel PyTorch Extension
                               accuracy_criterion=AccuracyCriterion(higher_is_better=True, 
                                                                   criterion='relative',  
                                                                   tolerable_loss=0.01))
 
# 执行量化
q_model = quantization.fit(model,
                           conf,
                           calib_dataloader=train_loader,
                           eval_func=eval_func)
 
# 保存量化模型
quantized_model_path = './quantized_models'
if not os.path.exists(quantized_model_path):
    os.makedirs(quantized_model_path)
 
q_model.save(quantized_model_path)

代码运行结果如下:
结果展示

6.4 使用量化后的模型在 CPU上进行推理

代码如下:

import json
from neural_compressor import quantization
 
# 指定量化模型的路径
quantized_model_path = './quantized_models'
 
# 加载 Qt 模型和 JSON 配置
vgg19_model_path = f'{quantized_model_path}/best_model.pt'
json_config_path = f'{quantized_model_path}/best_configure.json'
 
# 加载 Qt 模型
vgg19_model = torch.jit.load(vgg19_model_path, map_location='cpu')
 
# 加载 JSON 配置
with open(json_config_path, 'r') as json_file:
    json_config = json.load(json_file)
 
# 打印 JSON 配置(可选)
# print(json_config)
import torch
from sklearn.metrics import f1_score
import time
 
# 假设 test_loader 是你的测试数据加载器
# 请确保它返回 (inputs, labels) 的形式
 
 
# 将模型设置为评估模式
vgg19_model.eval()
 
# 初始化变量用于存储真实标签和预测标签
y_true = []
y_pred = []
 
# 开始推理
start_time = time.time()
 
# 设置 batch_size
batch_size = 64
 
# 使用 DataLoader 时设置 batch_size
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
 
# 在推理时处理每个批次
 
 
with torch.no_grad():
    for inputs, labels in test_loader:
        # 将输入数据移动到 CPU(如果尚未在 CPU 上)
        inputs = inputs.to('cpu')
        labels = labels.to('cpu')
 
        # 获取模型预测
        preds_probs = vgg19_model(inputs)
        preds_class = torch.argmax(preds_probs, dim=-1)
 
        # 扩展真实标签和预测标签列表
        y_true.extend(labels.numpy())
        y_pred.extend(preds_class.numpy())
 
# 计算 F1 分数
f1 = f1_score(y_true, y_pred, average='weighted')
 
# 计算推理时间
inference_time = time.time() - start_time
 
# 打印结果
print(f"测试集用的时间为: {inference_time} seconds")
print(f"F1分数: {f1}")

运行结果及F1分数展示如下:
运行结果及F1分数展示

7 课程项目总结

经过深度学习的卷积神经网络及OneAPI加速的结合,我们成功实现了一种高效的猫狗图像识别方法。对于这两方面内容的深入理解,大大提高了我们的实现能力。

在使用OneAPI优化组件的过程中,推理时间得以显著缩短,并且整个过程中F1分数始终保持在0.9左右。这一结果证明了OneAPI在模型压缩方面的卓越性能,同时也证明了其在加速过程中保证正确性的能力。

我们相信,基于深度学习的卷积神经网络及OneAPI加速将在未来的科技应用中发挥越来越重要的作用。通过不断探索与研究,我们可以进一步发掘和完善这种技术,为人类社会的进步和发展贡献力量。

  • 16
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值