神经投影网络 ProjectionNet 深度学习 神经投影方法来训练轻量级神经网络模型 较低的计算和内存成本在设备上执行有效的推理

神经投影网络 ProjectionNet

ProjectionNet: Learning Efficient On-Device Deep Networks Using Neural Projections

ProjectionNet 是一种联合框架,旨在训练轻量的设备端模型,这些模型可以直接在设备上进行推理,并且计算成本较低。该框架尤其适用于深度学习网络,这些网络通常很大,包括涉及许多层的参数,并经过大量数据训练,以学习可用于在推理时预测输出的有用表示形式。

ProjectionNet 的核心思想是使用复杂的前馈/循环架构(如 LSTM)作为训练模型,并结合一个简单的投影(projection)架构。这个投影架构包含动态投影操作以及一些窄带全连接层。通过这种方式,ProjectionNet 能够在保持性能的同时,显著降低模型的复杂度和内存占用。

在训练过程中,ProjectionNet 使用反向传播在 TensorFlow 上进行端到端训练。训练完成后,就可以直接使用紧凑的 ProjectionNet 模型进行推理。

ProjectionNet 的优势在于其能够在设备上高效运行深度学习模型,而无需依赖云端计算资源。这使得 ProjectionNet 在移动计算、物联网设备等领域具有广泛的应用前景。例如,在智能投影技术中,基于神经网络的 ProjectionNet 可以实现自动聚焦、三维投影、语音控制和智能识别等功能,提升用户体验和设备的智能化程度。

介绍

随着深度学习技术的快速发展,我们见证了神经网络模型在多个领域取得了显著的性能提升。然而,这些模型通常具有庞大的参数数量和计算复杂度,这要求大量的计算资源和内存来支持其训练和推理过程。在云端服务器上运行这些模型是可行的,因为它们拥有强大的计算能力和存储资源。然而,随着移动设备、物联网设备和其他边缘设备的普及,我们迫切需要将深度学习模型部署到这些资源受限的设备上。

将深度学习模型部署到资源受限的设备上带来了诸多挑战。首先,这些设备通常在低功耗模式下运行,其计算能力和内存资源远不及云端服务器。其次,由于连接性问题或隐私原因,某些应用场景可能不允许将数据发送到云端进行处理。因此,我们需要一种能够在设备上直接运行深度学习模型的方法,同时保持较低的计算成本和内存占用。

为了解决这些问题,研究者们提出了多种模型压缩和优化技术,如权重剪枝、低秩分解、量化等。这些方法可以在一定程度上减小模型的尺寸和计算复杂度,但往往会导致性能下降,难以满足特定应用场景的精度要求。因此,我们需要一种更加高效的方法,能够在保持模型性能的同时,显著降低其计算和内存需求。

在这种背景下,论文《ProjectionNet: Learning Efficient On-Device Deep Networks Using Neural Projections》介绍了一种名为ProjectionNet的联合框架。该框架旨在训练轻量级的设备端模型,这些模型可以直接在资源受限的设备上进行推理,并且具有较低的计算成本和内存占用。

ProjectionNet的核心思想是将复杂的前馈/循环架构(如LSTM)作为训练模型,并结合一个简单的投影架构。这个投影架构包含动态投影操作以及一些窄带全连接层,用于将训练模型学到的有用表示形式投影到一个低维空间中。通过这种方式,ProjectionNet能够在保持模型性能的同时,显著降低其参数数量和计算复杂度。

在训练过程中,ProjectionNet使用反向传播算法在TensorFlow等深度学习框架上进行端到端训练。训练完成后,我们可以直接使用紧凑的ProjectionNet模型进行推理。实验表明,ProjectionNet能够在多个视觉和语言分类任务中达到与常规模型相当的性能水平,同时显著降低了模型的尺寸和计算复杂度。

ProjectionNet为在资源受限的设备上部署深度学习模型提供了一种高效的方法。通过结合复杂的前馈/循环架构和简单的投影架构,ProjectionNet能够在保持模型性能的同时,显著降低其计算和内存需求,为深度学习在移动设备、物联网设备和其他边缘设备上的应用开辟了新的可能性。

众所周知,深度学习网络通常很大,包括涉及许多层的参数,并经过大量数据训练,以学习可用于在推理时预测输出的有用表示形式,所以为了达到高效率,我们使用分布式计算达到目标,这将需要多个CPU内核或图形处理单元(GPU)。随着移动端设备的普及,我们自然而然的想将这些模型应用到移动端设备上,但是,与在云上运行的高性能群集不同,这些设备在低功耗模式下运行,并且存在显着的内存限制,所以如果还是使用老方法,完全是行不通的。

即使将模型部署在云端,通过网络连接的方式进行使用,也会涉及到连接性问题(数据无法发送到服务器)或隐私原因(某些数据类型和处理需要限制在某些范围内),而且在许多实际场景中,将计算密集型操作从设备委派给云并不可行。还有就是模型压缩,降低浮点精度等等手段去缩减模型体积,其实在某些情况下,达不到应用场景的精度需要。所以需要有一个学习高效,具有低内存占用量的设备上机器学习模型的能力,这些模型可以直接在设备上运行以进行推理,并且计算成本较低

论文中介绍了一种叫ProjectionNet的联合框架,可以为不同机器学习模型架构训练轻量的设备端模型。其使用复杂的前馈/循环架构(就像 LSTM)作为训练模型,联合一个简单的投影(projection)架构——其中包含动态投影操作以及一些窄带全连接层。整个架构使用反向传播在 TensorFlow 上进行端到端训练,在训练完成后,我们就可以直接使用紧凑的 ProjectionNet 进行推理了。通过这种方法,我们可以训练尺寸很小的 ProjectionNet 模型,兼顾小尺寸(比常规模型小几个数量级)与高性能,在一些视觉和语言分类任务中达到满意的效果。

相关工作

许多相关工作通过在有限的大小或内存限制下学习有效的模型,比如简单的字典查找、特征修剪或散列的神经网络压缩的技术,以及降低的数字精度、矢量量化、网络的二值化策略、权重共享来实现神经网络的紧凑表示。这些方法大多数旨在通过使用低秩分解或哈希技巧对连接进行分组来利用网络权重中的冗余。

相反,本论文中建议学习一个简单的基于投影(projection)的网络,该网络可以有效地编码中间网络表示形式(即隐藏单元)和所涉及的操作,而不是权重。同时还为设备模型引入了新的训练范例,其中简单网络经过耦合和联合训练可以模仿现有的深度网络,而且该深度网络非常灵活,可以根据不同的体系结构或任务进行自定义。

神经投影网络(Neural Projection Networks)

ProjectionNets

神经网络是一类非线性模型,用于学习从输入 x ⃗ i \vec{x}_i x i 到输出 y i y_i yi 的映射,其中 x ⃗ i \vec{x}_i x i 表示输入特征向量或序列(在递归神经网络的情况下),而 y i y_i yi 是分类任务的输出类别或预测的序列。通常,这些网络由多层隐藏的单元或神经元组成,并在一对层之间建立连接。例如,在完全连接的前馈神经网络中,经过训练的加权连接或网络参数的数量为 O ( n 2 ) O(n^2) O(n2),其中 n n n 是每层隐藏单元的数量。而论文提出的联合优化框架,该架构结合了projection网络和trainer网络进行联合训练。如下图:
在这里插入图片描述
上图说明了神经投影网络架构,使用前馈NN作为trainer网络,这个耦合网络进行联合训练以优化组合损耗函数(公式1):
L ( θ , p ) = λ 1 ⋅ L θ ( . ) + λ 2 ⋅ L p ( . ) + λ 3 ⋅ L p ^ ( . ) L(\theta,p)=\lambda_1\cdot L_\theta(.)+\lambda_2 \cdot L^p(.)+\lambda_3 \cdot \hat{L^p}(.) L(θ,p)=λ1Lθ(.)+λ2Lp(.)+λ3Lp^(.)
其中 L θ ( . ) L_\theta(.) Lθ(.) L p ( . ) L^p(.) Lp(.) L p ^ ( . ) \hat{L^p}(.) Lp^(.),对应于以下定义的两个网络的损失函数(公式2):
L θ ( . ) = ∑ i ∈ N D ( h θ ( x ⃗ i ) , y i ^ ) L_\theta(.)=\sum_{i\in N}D(h_\theta(\vec{x}_i), \hat{y_i}) Lθ(.)=iND(hθ(x i),yi^) L p ( . ) = ∑ i ∈ N D ( h p ( x ⃗ i ) , h θ ( x ⃗ i ) ) L^p(.)=\sum_{i\in N}D(h^p(\vec{x}_i),h_\theta(\vec{x}_i)) Lp(.)=iND(hp(x i),hθ(x i)) L p ^ ( . ) = ∑ i ∈ N D ( h p ( x ⃗ i ) , y i ^ ) \hat{L^p}(.)=\sum_{i\in N}D(h^p(\vec{x}_i), \hat{y_i}) Lp^(.)=iND(hp(x

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一个使用PyTorch编写的神经网络训练获取结构光检测时投影的最优灰度的简单代码示例: ```python import torch import torch.nn as nn import torch.optim as optim import numpy as np # 定义一个卷积神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 32, 3, 1) self.conv2 = nn.Conv2d(32, 64, 3, 1) self.dropout1 = nn.Dropout2d(0.25) self.dropout2 = nn.Dropout2d(0.5) self.fc1 = nn.Linear(9216, 128) self.fc2 = nn.Linear(128, 1) def forward(self, x): x = self.conv1(x) x = nn.functional.relu(x) x = self.conv2(x) x = nn.functional.relu(x) x = nn.functional.max_pool2d(x, 2) x = self.dropout1(x) x = torch.flatten(x, 1) x = self.fc1(x) x = nn.functional.relu(x) x = self.dropout2(x) x = self.fc2(x) return x # 定义训练函数 def train(model, optimizer, criterion, train_loader, device): model.train() running_loss = 0.0 for i, (inputs, targets) in enumerate(train_loader): inputs = inputs.to(device) targets = targets.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, targets) loss.backward() optimizer.step() running_loss += loss.item() return running_loss / len(train_loader) # 定义测试函数 def test(model, criterion, test_loader, device): model.eval() running_loss = 0.0 with torch.no_grad(): for i, (inputs, targets) in enumerate(test_loader): inputs = inputs.to(device) targets = targets.to(device) outputs = model(inputs) loss = criterion(outputs, targets) running_loss += loss.item() return running_loss / len(test_loader) # 定义数据集和加载器 class GrayDataset(torch.utils.data.Dataset): def __init__(self, x, y): self.x = x self.y = y def __getitem__(self, index): return self.x[index], self.y[index] def __len__(self): return len(self.x) x = np.random.rand(100, 1, 28, 28).astype(np.float32) y = np.random.rand(100, 1).astype(np.float32) dataset = GrayDataset(x, y) train_loader = torch.utils.data.DataLoader(dataset, batch_size=10, shuffle=True) # 定义训练参数 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = Net().to(device) optimizer = optim.Adam(model.parameters(), lr=0.001) criterion = nn.MSELoss() # 训练模型 epochs = 10 for epoch in range(epochs): train_loss = train(model, optimizer, criterion, train_loader, device) test_loss = test(model, criterion, train_loader, device) print("Epoch: {}/{} | Train Loss: {:.4f} | Test Loss: {:.4f}".format(epoch+1, epochs, train_loss, test_loss)) ``` 这是一个简单的示例,您可以根据自己的实际需求进行修改和扩展。希望对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EwenWanW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值