用Pytorch构建一个喵咪识别模型

简介: 用Pytorch构建一个喵咪识别模型

目录


一、前言


二、问题阐述及理论流程


2.1问题阐述


2.2猫咪图片识别原理


三、用PyTorch 实现


3.1PyTorch介绍


3.2PyTorch 构建模型的五要素


3.3PyTorch 实现的步骤


3.3.1.数据


3.3.2模型


3.3.3损失函数


3.3.4优化器


3.3.5迭代训练


四、我用了哪些方法防止过拟合?


4.1控制网络规模


4.2数据增强


4.3正则化


4.4K 折交叉验证


五、用自己的图片验证


5.1输入数据


5.2代码实现


5.3结果输出及分析


完整代码

一、前言

       舍友最近养了只猫咪,看起来很好看,但是你绝对想不到它拉的shi巨臭啊,哈哈哈哈,就很离谱。刚好最近在学习Pytorch,心血来潮,就用Pytorch来做个喵咪识别模型并,于是就有了本篇博文。

image.png

二、问题阐述及理论流程

2.1问题阐述

现一共有 259 张图片,总体分为两类:

 有猫咪类

47197ce88ddb479a2c4522d2f8dc61b2_2a8d256586924120b064d9bc8d167eb0.png

无猫咪类

616865526e4ffc8b2a54cb76df70bada_b56c60d4df174ec399ded386ef52250b.png

2.2猫咪图片识别原理

2524656ab1bcb366f8081391220068f4_a2336b1c3d02498ca7316f732aac2f83.png

三、用PyTorch 实现

3.1PyTorch介绍

  PyTorch 是一个开源的深度学习框架,它的底层基于 Torch ,但实现与运用全部由 python 来完成。该框架主要用于人工智能领域的科学研究与应用开发。

3.2PyTorch 构建模型的五要素

1.数据:包括数据读取,数据清洗,进行数据划分和数据预处理。


2.模型:包括构建模型模块,组织复杂网络,初始化网络参数,定义网络层。


3.损失函数:包括创建损失函数,设置损失函数超参数,要根据不同任务选择合适的损失函数。


4.优化器:包括根据梯度使用某种优化器更新参数,管理模型参数,调整学习率。


5.迭代训练:组织上述 4 个模块进行反复训练。观察训练效果,绘制 Loss/ Accuracy 曲线或者用 TensorBoard 进行可视化分析。

3.3PyTorch 实现的步骤

3.3.1.数据

在深度学习时会遇到各种不同形式的数据,如文本、图片、音频等,而每种数据又有多种文件类型。因此拿到数据,我们首先应该了解它的内部结构。


 h5py 文件是一种 " Dataset " 和 " Group " 二合一的容器:


  1. 「Dataset」: 类似数组组织的数据的集合,像 numpy 数组一样工作;

  2. 「Group」: 包含了其它 Dataset 和 其它 Group ,像字典一样工作。


读取下载好的 h5py 文件(以含有 209 张图片的测试集为例)

import h5py
f = h5py.File("/home/tian/dataset/catvnocat/train/train_catvnoncat.h5","r")#"r"代表读取模式
for key in f.keys():
    print(key)
#输出
#list_classes
#train_set_x
#train_set_y

依次打印出这三个" key "下的内容

print(f["list_classes"])
print(f["train_set_x"])
print(f["train_set_y"])
#输出
#<HDF5 dataset "list_classes": shape (2,), type "|S7">
#<HDF5 dataset "train_set_x": shape (209, 64, 64, 3), type "|u1">
#<HDF5 dataset "train_set_y": shape (209,), type "<i8">

可以得到三个 Dataset 的相关信息:


  1. list_classes:包含两个元素 ' non-cat ' 和' cat ',代表无猫和有猫这两个大类。

  2. train_set_x :一个四维张量,形状为 209 * 64 * 64 * 3。代表一共有 209 张图片,其中每张图片以像素大小为 64 * 64 的三通道矩阵存储信息。

  3. train_set_y :一个一维数组,元素全部存储着 209 张图片对应的标签,其中有猫为 1 ,无猫为 0 。

该 h5py 文件的结构如下图所示:

e4d21a43655c8e2691de3f7a3d66b792_e4b3332e7151466eb4e0b22081d4269a.png

制作数据集


 从torch.utils.data中引入Dataset,Dataset是能够表示数据集的抽象类,一般有三个方法:


1.「__init__方法」


用于类的初始化,负责创建类的实例属性并进行赋值,并在实例化类后自动执行。这里我创建的 MyData 类中包含以下属性:


Archive:文件的路径及对文件的操作,只读或写入


Image:样本中的图片或者包含全部图片信息的像素矩阵


Label:样本中的标签


Transform:可能要对数据进行的变换或增强


2.「__getitem__方法」


所有子类都必须重写该方法,该方法通过索引(index)或键(key)访问样本,返回值为 样本和标签。


3.「__len__方法」


返回数据集的大小。

from torch.utils.data import Dataset
class MyDataset(Dataset):
    def __init__(self, archive , image , label , transform = None ):
        self.Archive = h5.File(archive, 'r')
        self.Images = self.Archive[image]
        self.Labels = self.Archive[label]
        self.Transform = transform
    def __getitem__(self,index):
        image = self.Images[index]
        label = self.Labels[index]
        if self.Transform is not None:
            image = self.Transforms(image)  
        return image ,label
    def __len__(self):
        return len(self.Labels)
train_dataset = MyDataset('/home/tian/dataset/catvnocat/train/train_catvnoncat.h5','train_set_x','train_set_y',train_transformer)
test_dataset = MyDataset('/home/tian/dataset/catvnocat/test/test_catvnoncat.h5','test_set_x','test_set_y',test_transformer)

读取数据集

  从torch.utils.data引入DataLoader,它帮助我们从Dataset中加载样本数据。它联合了数据集 Dataset 和采样器 Sampler,使其本身可以像一个迭代器一样工作。前者提供数据来源,后者提供索引。

from torch.utils.data import Dataloader
train_loader = DataLoader(train_dataset, batch_size = batch_size_train, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size = batch_size_test, shuffle=False)

shuffle = True指的是将样本打乱,一般只针对训练集。

3.3.2模型

  该神经网络采用简单的 2 隐藏层全连接的方式,并在每一层采用 ReLU 函数作为激活函数,最后通过 Softmax 函数输出预测概率,以达到二分类的目的。

class Net(nn.Module):
    def __init__(self, in_dim, n_hidden_1,n_hidden_2,out_dim):
        super(Net, self).__init__()
        self.layer1 = nn.Sequential(nn.Linear(in_dim, n_hidden_1),nn.BatchNorm1d(n_hidden_1), nn.ReLU(True),nn.Dropout(0.25))
        self.layer2 = nn.Sequential(nn.Linear(n_hidden_1, n_hidden_2),nn.BatchNorm1d(n_hidden_2), nn.ReLU(True),nn.Dropout(0.25))
        self.layer3 = nn.Sequential(nn.Linear(n_hidden_2, out_dim), nn.Softmax(dim = 1))
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        return x

3.3.3损失函数

  交叉熵损失函数是二分类问题常用的损失函数,可以直接在torch.nn里直接调用,其形式为:

b041c6212fbbb29950d2377a340c7a9d_905209945777400fb9b5d133362bbf7a.png

criterion = nn.CrossEntropyLoss()

3.3.4优化器

torch.optim中直接调用随机梯度下降法 SGD:

optimizer = optim.SGD(model.parameters(), lr = learning_rate, weight_decay = 1e-4)

3.3.5迭代训练

  一切准备工作就绪,进行迭代训练。也可以根据需要绘制 Loss/ Accuracy 曲线观察 train_loss 和 val_loss,并以此为依据来调试超参数。

for epoch in range(num_epoches+1):
    model.train()    
    for data in train_loader:
        img, label = data
        img = img.view(img.size(0), -1)  
        img = Variable(img)
        label = Variable(label)
        out = model(img.to(torch.float32))
        loss = criterion(out, label)
        _, pred = torch.max(out, 1)
        acc = (pred == label).sum().item() / (len(train_dataset))
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    model.eval()
    eval_loss = 0
    eval_acc = 0        
    for data in test_loader:
        img, label = data
        img = img.view(img.size(0), -1)
        out = model(img.to(torch.float32))
        loss_1 = criterion(out, label)
        eval_loss += loss_1.data.item()*label.size(0)
        _, pred = torch.max(out, 1)
        eval_acc += (pred == label).sum().item() / len(test_dataset)
    if epoch%50 == 0:
        train_losses.append(loss.data.item())
        train_acc.append(acc)
        test_losses.append(loss_1.data.item())
        test_acc.append(eval_acc)
        print('epoch: {}'.format(epoch))
        print('Train Loss: {:.4}, Train_Acc: {:.4}'.format(loss.data.item(), acc))
        print('Test Loss: {:.4f}, Test_Acc: {:.4f}'.format(eval_loss / (len(test_dataset)),eval_acc))
fig = plt.figure()
plt.plot(train_counter, train_losses, color='blue')
plt.plot(test_counter, test_losses, '--',color='red')
plt.legend(['Train Loss', 'Test Loss'], loc='upper right')
plt.xlabel('number of training examples seen')
plt.ylabel('negative log likelihood loss')
fig = plt.figure()
plt.plot(train_counter, train_acc, color='blue')
plt.plot(test_counter, test_acc, '--',color='red')
plt.legend(['Train Acc', 'Test Acc'], loc='lower right')
plt.xlabel('number of training examples seen')
plt.ylabel('Acc')
plt.show()

「结果展示」

7540e5b60ba898e11d7def99d425f4e7_4ca86859595a4f79b2c39052e543db5a.png

可以看到,过拟合的情况没有发生,并且训练集和测试集的准确率都接近 90%,相对于原本的准确率有了较大的提高。

四、我用了哪些方法防止过拟合?

4.1控制网络规模

  当神经网络具有过多的神经元时,训练集中包含的有限信息量不足以训练隐藏层中的所有神经元,很可能导致过拟合。因此要控制网络规模,既不能太宽也不能太深。

4.2数据增强

 样本量少是造成过拟合的主要原因之一,但我们往往很难从源头上解决这一问题。数据增强通过对现有的样本(以图片为例)进行各种不同的变换(如随机自定义大小裁剪、随机翻转、随机旋转、增加色彩对比度等),然后适当增加训练迭代次数,从而达到样本量扩张的效果。


 本文采用了以下手段进行数据增强:


  1. 对输入图片随机裁剪,将原本像素大小为64的图片裁剪成像素大小为48的图片

  2. 在水平方向上对一半的图片进行随机翻转

  3. 在垂直方向上对一半的图片进行随机翻转

  4. 对图在一定角度内进行旋转
from torchvision import transforms
train_transformer = transforms.Compose([
    transforms.ToPILImage(),
    transforms.RandomResizedCrop(48),
    transforms.RandomHorizontalFlip(), 
    transforms.RandomRotation((-15, 15)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])
test_transformer = transforms.Compose([
    transforms.ToPILImage(),
    transforms.Resize(48),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])

测试集大多数情况下不进行数据增强,这里为了适应训练集数据增强后的图片大小对测试集进行了尺寸缩放,同样变为像素大小为的图片。

4.3正则化

  1. 「Drop_out」

  2.  作为常用的预防过拟合的方法之一,它的主要思想是让隐藏层的节点在每次迭代时有一定几率失效,从而避免对某个节点的强依赖,让反向传播的修正值可以更加平衡的分布到各个参数上。也在一定程度上降低了网络复杂度。

  3. 「weight_decay」

  4.  过拟合时模型会拟合很多位置较偏的点,导致拟合函数在某些小区间剧烈变化,权重 w 的绝对值很大。此方法通过控制权重 w 的大小来缓解过拟合的情况。

4.4K 折交叉验证

以模型调优的思路来缓解过拟合。在训练每种模型时,通过k折交叉验证得到k组不同的训练集和测试集,并将每组的误差平均作为衡量模型泛化能力的准则,从而选择出泛化能力最好的(即最不容易发生过拟合)的模型。

kf = KFold(n_splits = 7, shuffle=True)

五、用自己的图片验证

训练神经网络最终的目的就是为了应用,因此最后一个环节我们用自己的图片来验证“猫咪识别器”的性能如何。


5.1输入数据

有猫咪类

8c5d5cf1a09cfce61664033326787a6b_dd130fee153b4f4ca43431dfd3ff85a5.png

无猫咪类

4492fb8c521d2d5231ed0007d20c1976_751e61464dd146a682f23a24d78590e8.png

5.2代码实现

from PIL import Image
def trans_pic(img_dir,width,height):
    image = Image.open(img_dir) #打开图片
    resized_image = image.resize((width, height), Image.ANTIALIAS)
    data = np.asarray(resized_image)#转换为矩阵
    image = Image.fromarray(data)  #将之前的矩阵转换为图片
    #image.show()#调用本地软件显示图片,win10是叫照片的工具
    return data
path_cat = [r"/home/tian/Pictures/cat_1.jpg",
        r"/home/tian/Pictures/cat_2.jpg",
        r"/home/tian/Pictures/cat_3.jpg",
        r"/home/tian/Pictures/cat_4.jpg",
        r"/home/tian/Pictures/cat_5.jpg"]
path_nocat = [r"/home/tian/Pictures/nocat_1.jpg",
        r"/home/tian/Pictures/nocat_2.jpg",
        r"/home/tian/Pictures/nocat_3.jpg",
        r"/home/tian/Pictures/nocat_4.jpg",
        r"/home/tian/Pictures/nocat_5.jpg"]
for i in range(5): 
    a = test_transformer(trans_pic(path_cat[i],48,48)).view(1, -1)
    b = test_transformer(trans_pic(path_nocat[i],48,48)).view(1, -1)
    out_1 = model(a.to(torch.float32))
    out_2 = model(b.to(torch.float32))
    _, pred_1= torch.max(out_1, 1)
    _, pred_2= torch.max(out_2, 1) 
    if pred_1 == 1:
        print("第",i+1,"张猫咪图片识别正确")
    if pred_1 == 0:
        print("第",i+1,"张猫咪图片识别错误")
    if pred_2 == 1:
        print("第",i+1,"张非猫咪图片识别错误")
    if pred_2 == 0:
        print("第",i+1,"张非猫咪图片识别正确")
    print("\n")

5.3结果输出及分析

「结果输出」

第 1 张猫咪图片识别正确
第 1 张非猫咪图片识别正确
第 2 张猫咪图片识别正确
第 2 张非猫咪图片识别正确
第 3 张猫咪图片识别正确
第 3 张非猫咪图片识别错误
第 4 张猫咪图片识别正确
第 4 张非猫咪图片识别错误
第 5 张猫咪图片识别正确
第 5 张非猫咪图片识别正确

「结果分析」:


猫咪图片:都能识别正确。


非猫咪图片:第三张、第四张图片出现了识别错误。


对于风景图这种与猫咪图片差别很大的图片,识别器能轻松地辨别;


对于老虎、老鼠这些与猫咪在特征上有很多相似地方的动物,猫咪识别器显然还不具备能力将他们很好地区分开来。


 因此在图片识别领域,我们总是需要更合适的网络结构、更大规模的数据以及更合适的超参数选择。


完整代码

import numpy as np
import h5py as h5
import torch
from torch.utils.data import Dataset,DataLoader
import torch.nn.functional as F
from torch import nn, optim
from torch.autograd import Variable
from torchvision import datasets, transforms
from matplotlib import pyplot as plt
batch_size_train = 209
batch_size_test = 50
learning_rate = 0.0075
num_epoches = 3500
momentum = 0.5
train_transformer = transforms.Compose([
    transforms.ToPILImage(),
    transforms.RandomResizedCrop(48),
    transforms.RandomHorizontalFlip(),
    transforms.RandomVerticalFlip(),
    transforms.RandomRotation((-15, 15)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])
test_transformer = transforms.Compose([
    transforms.ToPILImage(),
    transforms.Resize(48), 
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])
])
class MyDataset(Dataset):
    def __init__(self, archive,image,label,transform = None):
        self.archive = h5.File(archive, 'r')
        self.images = self.archive[image]
        self.labels = self.archive[label]
        self.transform = transform
    def __getitem__(self,index):
        image = self.images[index]
        label = self.labels[index]
        if self.transform is not None:
            image = self.transform(image)  
        return image ,label
    def __len__(self):
        return len(self.labels)
train_dataset = MyDataset('/home/tian/dataset/catvnocat/train/train_catvnoncat.h5','train_set_x','train_set_y',train_transformer)
test_dataset = MyDataset('/home/tian/dataset/catvnocat/test/test_catvnoncat.h5','test_set_x','test_set_y',test_transformer)
train_loader = DataLoader(train_dataset, batch_size=batch_size_train, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size_test, shuffle=False)
class Batch_Net(nn.Module):
    def __init__(self, in_dim, n_hidden_1,n_hidden_2,out_dim):
        super(Batch_Net, self).__init__()
        self.layer1 = nn.Sequential(nn.Linear(in_dim, n_hidden_1),nn.BatchNorm1d(n_hidden_1), nn.ReLU(True),nn.Dropout(0.25))#,nn.Dropout(0.3))
        self.layer2 = nn.Sequential(nn.Linear(n_hidden_1, n_hidden_2),nn.BatchNorm1d(n_hidden_2), nn.ReLU(True),nn.Dropout(0.25))#,nn.Dropout(0.5))#,nn.Dropout(0.3))#,nn.Dropout(0.5))
        self.layer3 = nn.Sequential(nn.Linear(n_hidden_2, out_dim),nn.Softmax(dim = 1))
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        return x
#构建模型实例 
model = Batch_Net(48*48*3,90,10,2)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate,weight_decay= 1e-4)
train_losses = []
train_acc = []
train_counter = [i * len(train_loader)*50 for i in range(num_epoches // 50 + 1)]
test_losses = []
test_acc = []
test_counter = [i * len(test_loader)*50 for i in range(num_epoches // 50 + 1)]
for epoch in range(num_epoches+1):
    model.train()
    for data in train_loader:
        img, label = data
        img = img.view(img.size(0), -1)  
        img = Variable(img)
        label = Variable(label)
        out = model(img.to(torch.float32))
        loss = criterion(out, label)
        _, pred = torch.max(out, 1)
        acc = (pred == label).sum().item() / (len(train_dataset))
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    model.eval()
    eval_loss = 0
    eval_acc = 0
    for data in test_loader:
        img, label = data
        img = img.view(img.size(0), -1)
        out = model(img.to(torch.float32))
        loss_1 = criterion(out, label)
        eval_loss += loss_1.data.item()*label.size(0)
        _, pred = torch.max(out, 1)
        eval_acc += (pred == label).sum().item() / len(test_dataset)
    if epoch%50 == 0:
        train_losses.append(loss.data.item())
        train_acc.append(acc)
        test_losses.append(loss_1.data.item())
        test_acc.append(eval_acc)
        print('epoch: {}'.format(epoch))
        print('Train Loss: {:.4}, Train_Acc: {:.4}'.format(loss.data.item(), acc))
        print('Test Loss: {:.4f}, Test_Acc: {:.4f}'.format(eval_loss / (len(test_dataset)),eval_acc))
fig = plt.figure()
plt.plot(train_counter, train_losses, color='blue')
plt.plot(test_counter, test_losses, '--',color='red')
plt.legend(['Train Loss', 'Test Loss'], loc='upper right')
plt.xlabel('number of training examples seen')
plt.ylabel('negative log likelihood loss')
fig = plt.figure()
plt.plot(train_counter, train_acc, color='blue')
plt.plot(test_counter, test_acc, '--',color='red')
plt.legend(['Train Acc', 'Test Acc'], loc='lower right')
plt.xlabel('number of training examples seen')
plt.ylabel('Acc')
plt.show()
目录
相关文章
|
10天前
|
算法 PyTorch 算法框架/工具
Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)
本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。
55 2
|
12天前
|
机器学习/深度学习 自然语言处理 监控
利用 PyTorch Lightning 搭建一个文本分类模型
利用 PyTorch Lightning 搭建一个文本分类模型
32 8
利用 PyTorch Lightning 搭建一个文本分类模型
|
14天前
|
机器学习/深度学习 自然语言处理 数据建模
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
本文深入探讨了Transformer模型中的三种关键注意力机制:自注意力、交叉注意力和因果自注意力,这些机制是GPT-4、Llama等大型语言模型的核心。文章不仅讲解了理论概念,还通过Python和PyTorch从零开始实现这些机制,帮助读者深入理解其内部工作原理。自注意力机制通过整合上下文信息增强了输入嵌入,多头注意力则通过多个并行的注意力头捕捉不同类型的依赖关系。交叉注意力则允许模型在两个不同输入序列间传递信息,适用于机器翻译和图像描述等任务。因果自注意力确保模型在生成文本时仅考虑先前的上下文,适用于解码器风格的模型。通过本文的详细解析和代码实现,读者可以全面掌握这些机制的应用潜力。
29 3
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
|
28天前
|
机器学习/深度学习 PyTorch 调度
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
在深度学习中,学习率作为关键超参数对模型收敛速度和性能至关重要。传统方法采用统一学习率,但研究表明为不同层设置差异化学习率能显著提升性能。本文探讨了这一策略的理论基础及PyTorch实现方法,包括模型定义、参数分组、优化器配置及训练流程。通过示例展示了如何为ResNet18设置不同层的学习率,并介绍了渐进式解冻和层适应学习率等高级技巧,帮助研究者更好地优化模型训练。
61 4
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
|
1月前
|
机器学习/深度学习 监控 PyTorch
PyTorch 模型调试与故障排除指南
在深度学习领域,PyTorch 成为开发和训练神经网络的主要框架之一。本文为 PyTorch 开发者提供全面的调试指南,涵盖从基础概念到高级技术的内容。目标读者包括初学者、中级开发者和高级工程师。本文探讨常见问题及解决方案,帮助读者理解 PyTorch 的核心概念、掌握调试策略、识别性能瓶颈,并通过实际案例获得实践经验。无论是在构建简单神经网络还是复杂模型,本文都将提供宝贵的洞察和实用技巧,帮助开发者更高效地开发和优化 PyTorch 模型。
35 3
PyTorch 模型调试与故障排除指南
|
17天前
|
存储 并行计算 PyTorch
探索PyTorch:模型的定义和保存方法
探索PyTorch:模型的定义和保存方法
|
16天前
|
机器学习/深度学习 数据采集 自然语言处理
【NLP自然语言处理】基于PyTorch深度学习框架构建RNN经典案例:构建人名分类器
【NLP自然语言处理】基于PyTorch深度学习框架构建RNN经典案例:构建人名分类器
|
1月前
|
存储 缓存 PyTorch
使用PyTorch从零构建Llama 3
本文将详细指导如何从零开始构建完整的Llama 3模型架构,并在自定义数据集上执行训练和推理。
54 1
|
2月前
|
机器学习/深度学习 边缘计算 PyTorch
PyTorch 与边缘计算:将深度学习模型部署到嵌入式设备
【8月更文第29天】随着物联网技术的发展,越来越多的数据处理任务开始在边缘设备上执行,以减少网络延迟、降低带宽成本并提高隐私保护水平。PyTorch 是一个广泛使用的深度学习框架,它不仅支持高效的模型训练,还提供了多种工具帮助开发者将模型部署到边缘设备。本文将探讨如何将PyTorch模型高效地部署到嵌入式设备上,并通过一个具体的示例来展示整个流程。
301 1
|
2月前
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch与Hugging Face Transformers:快速构建先进的NLP模型
【8月更文第27天】随着自然语言处理(NLP)技术的快速发展,深度学习模型已经成为了构建高质量NLP应用程序的关键。PyTorch 作为一种强大的深度学习框架,提供了灵活的 API 和高效的性能,非常适合于构建复杂的 NLP 模型。Hugging Face Transformers 库则是目前最流行的预训练模型库之一,它为 PyTorch 提供了大量的预训练模型和工具,极大地简化了模型训练和部署的过程。
120 2