BiSeNet V2:实时语义分割的双路径优化与特征融合新策略

用 Sass 模块化系统取代全局导入,消除 1.80.0 引入的 @import 弃用警告 最初,Sass 使用@import规则通过单个全局命名空间加载其他文件,所有内置函数也可全局使用。由于模块系统(@use和@forward规则)已经推出多年,我们现已弃用 Sass@import规则和全局内置函数。@import会导致许多问题,需要手动为 Sass 成员指定命名空间以避免冲突,当多次导入同一个文件时会减慢编译速度,并且使人类和工具都很难分辨给定变量、混合或函数来自何处。模块系统修复了这些问题,并使 Sass 的模块化与其他现代语言的最佳实践相媲美,但只要@import。 阅读详情

1. 从“快”与“准”的矛盾说起:为什么需要BiSeNet V2?

如果你玩过手机上的AR游戏,或者关注过自动驾驶技术的发展,你可能会发现一个有趣的现象:这些技术都要求设备能“看懂”周围的世界,并且反应要足够快。比如,AR眼镜需要实时识别出你面前的桌子、杯子,然后把虚拟的动画精准地“贴”上去;自动驾驶汽车则需要在毫秒之间分辨出路上的行人、车辆和交通标志。这背后依赖的核心技术之一,就是实时语义分割。

简单来说,语义分割就是给图像里的每一个像素都打上标签,告诉你这个像素是属于“天空”、“汽车”还是“行人”。听起来是不是很像给照片做精细到像素级的涂色?但难点在于,这个过程必须在极短的时间内完成,通常要求每秒处理几十甚至上百帧图像,也就是达到几十FPS(帧每秒)的速度。

在BiSeNet V2出现之前,工程师们常常面临一个头疼的“跷跷板”难题:想要模型分割得准,就需要保留图像丰富的细节和空间信息,这通常意味着使用更复杂的网络和更高分辨率的特征图,结果就是速度变慢;反过来,想要模型跑得快,就得压缩输入图像尺寸、减少网络计算量,这又会损失精度,导致物体的边缘模糊、小物体识别不出来。

我早期在做一些移动端视觉项目时就踩过这个坑。当时为了追求速度,选了一个非常轻量的模型,结果在复杂场景下,分割结果简直没法看,路边的消防栓被识别成了一团模糊的色块。这让我意识到,单纯的“瘦身”并不是好办法。

而BiSeNet V2的提出,正是为了打破这个僵局。它不再试图用一个网络同时干好“捕捉细节”和“理解全局”两件矛盾的事,而是聪明地设计了两条独立且并行的路径:空间路径和上下文路径。你可以把它想象成两个人分工合作:一个人拿着放大镜,专注看清图像的每一个细节和轮廓(空间路径);另一个人则站在远处,把握整个画面的结构和主体关系(上下文路径)。最后,两人把各自的信息一综合,就得到了一份既细致又全面的报告。

这种“双线并行,融合决策”的思想,让BiSeNet V2在保持高速(实时)的同时,分割精度得到了显著提升。接下来,我们就深入它的内部,看看这两条路径具体是怎么工作的,以及V2版本在初代BiSeNet基础上做了哪些关键的优化。

2. 核心架构解密:双路径如何各司其职?

BiSeNet V2的整个架构清晰而优雅,其核心就是并行的双路径设计。理解这两条路径的分工与协作,是掌握其精髓的关键。

2.1 空间路径:细节的“守护者”

空间路径的设计目标非常纯粹:不惜一切代价保留高分辨率的空间细节。在传统的分割网络中,图像输入后通常会经过多次下采样(比如步长为2的卷积或池化),特征图尺寸迅速缩小到输入的1/32甚至更小。虽然这有利于扩大感受野和减少计算量,但大量的空间信息(尤其是物体边缘、纹理)就在这个过程中丢失了。

BiSeNet V2的空间路径采取了截然不同的策略。它通常只包含3个卷积层,并且每层使用步长为2进行下采样。这样,经过三层之后,特征图的尺寸变为输入的1/8。相比于主流网络1/32的尺寸,1/8的特征图保留了多得多的像素点,自然也就编码了极其丰富的细节信息。

你可以这样理解:如果把1/32的特征图比作一张模糊的缩略图,那么1/8的特征图就是一张清晰的高清局部放大图。这对于精确分割物体的边界、识别细小的目标(如交通标志、行人手中的物品)至关重要。

在实际配置中,这3个卷积层通常采用3x3的卷积核,并配合批量归一化(BatchNorm)和ReLU激活函数。虽然听起来层数不多,但因为它处理的是高分辨率特征图,计算量仍然需要精心控制。BiSeNet V2在这里做的一个优化是,适当增加了第一层卷积的通道数,以增强特征提取能力,同时通过高效的卷积计算库(如深度可分离卷积的变体)来平衡速度。

2.2 上下文路径:全局的“洞察者”

如果说空间路径是显微镜,那么上下文路径就是广角镜。它的核心任务是快速获取足够大的感受野,以理解图像的全局上下文语义。什么是感受野?简单说,就是特征图上的一个点,能看到原始输入图像上多大范围的区域。感受野越大,网络就越能理解“这是一个在街道上行驶的汽车”,而不是孤立地看一堆像素。

为了高效地获得大感受野,上下文路径采用了轻量级主干网络(例如MobileNet、ShuffleNet或经过裁剪的Xception)结合快速下采样策略。轻量级主干网络本身计算效率高,通过其层级结构,能迅速将特征图尺寸减小,从而让高层特征的每个点都对应输入图像的一大片区域。

但BiSeNet V2的上下文路径不止于此。它在轻量级主干的末端,引入了一个全局平均池化层。这个操作非常巧妙:它将整个特征图“压扁”成一个特征向量,这个向量本质上包含了整个图像的全局信息。然后,再将这个全局信息上采样,与主干网络输出的特征进行融合。这就相当于给网络装了一个“全局记忆体”,确保即使图像中有非常大的物体或者需要长远依赖关系的场景,网络也能很好地处理。

此外,上下文路径中还有一个重要的子模块:注意力精炼模块。ARM的作用是自适应地校准上下文路径中不同阶段的特征。它通过全局平均池化获取通道级的全局信息,然后生成一个注意力权重向量,用来重新加权原始特征。这样,网络就能更关注那些对于当前分割任务重要的通道特征,抑制不重要的信息,从而提升特征表达的质量。

3. V2的进化:更巧妙的融合与更高效的优化

第一代BiSeNet已经展示了双路径的巨大潜力,但BiSeNet V2并非简单的重复,它在特征融合和路径设计上做了多项关键改进,让网络更高效、更强大。

3.1 特征融合模块的升级:从“相加”到“引导式融合”

在初代BiSeNet中,两条路径的特征通过一个特征融合模块进行组合。但V2版本进一步优化了这个过程。最初,有人可能会想,直接把两条路径的特征图对应位置相加不就行了?但实测下来效果并不理想。因为空间路径的特征是低层级的,包含大量细节和位置信息;而上下文路径的特征是高层级的,包含丰富的语义和类别信息。它们处于不同的特征空间,简单相加就像把一篇技术文章的草稿和最终摘要混在一起,反而会造成干扰。

BiSeNet V2的特征融合策略更加精细。它通常采用连接后接自适应加权的方式。具体来说:

  1. 连接:将空间路径的高分辨率特征与上下文路径的上采样后的特征在通道维度上进行拼接。
  2. 通道注意力加权:借鉴了SENet的思想,对拼接后的特征进行全局平均池化,通过两个全连接层(或小型的卷积层)学习一个通道注意力权重向量。这个权重向量会告诉网络:在当前的融合特征中,哪些通道的信息(可能来自空间细节,也可能来自全局上下文)对最终决策更重要。
  3. 重加权与融合:用学到的权重对拼接特征进行重加权,然后再通过一个或几个卷积层进行融合和降维,输出最终用于预测的特征图。

这个过程就像一个智能的会议主持人,不仅让两位专家(双路径)都发言,还会根据议题动态调整听取双方意见的侧重,从而做出最明智的决策。

3.2 细节优化:Booster与BAP模块

在一些BiSeNet V2的变体或相关研究中,你可能会看到两个有趣的子模块:细节Booster和双边聚合模块。

细节Booster 可以看作是空间路径的增强插件。由于空间路径相对较浅,其提取细节特征的能力有时可能不足。细节Booster通过在空间路径中或融合前引入一些轻量但有效的操作(如多尺度卷积、边缘增强卷积等),在不显著增加计算量的前提下,进一步锐化了空间路径输出的特征,让物体边界更加清晰。

双边聚合模块 则侧重于改进融合过程。它不再仅仅在网络的最后进行一次融合,而是考虑在多个层级上进行渐进式融合。例如,将上下文路径中不同深度的特征,分别与空间路径的特征进行浅层、中层、深层的融合,最后再聚合所有融合结果。这种多层级、渐进式的融合策略,能让语义信息和细节信息更早、更充分地交互,提升网络整体的表征能力。

3.3 效率的极致追求:从Xception到更轻的主干

初代BiSeNet常使用Xception作为上下文路径的主干。Xception虽然比传统的ResNet等网络轻量,但在追求极致的边缘设备部署时,仍有优化空间。BiSeNet V2在实践中的一个重要趋势是,采用更先进的轻量级主干网络,例如MobileNetV3、ShuffleNetV2或EfficientNet-Lite。

这些网络在设计之初就深度融合了深度可分离卷积、通道混洗、神经架构搜索等技术,在精度和速度的权衡上达到了新的高度。将BiSeNet V2的双路径架构与这些超轻量主干结合,往往能在计算资源极其受限(如手机、嵌入式开发板)的场景下,依然跑出令人满意的实时分割效果。

我在一个基于ARM芯片的嵌入式设备上做过测试,将上下文路径的主干从Xception换为MobileNetV3-Small,模型大小缩小了约40%,推理速度提升了近一倍,而分割精度(mIoU)仅下降了不到2个百分点。这对于很多对成本敏感的应用来说,是非常有价值的 trade-off。

4. 实战指南:如何训练与部署你的BiSeNet V2?

理论说得再好,不如亲手跑一跑。这部分我们来聊聊训练和部署BiSeNet V2时的一些实战经验和关键技巧。

4.1 数据准备与增强策略

对于语义分割任务,尤其是街景(如Cityscapes)这类数据,数据增强是提升模型泛化能力、防止过拟合的利器。除了常规的随机水平翻转、颜色抖动,有几项增强对BiSeNet V2特别有益:

  • 多尺度随机裁剪:这是最核心的增强之一。在训练时,先将图像随机缩放(例如在0.5到2.0倍之间),然后再随机裁剪出固定大小的块(如512x1024或768x768)。这能迫使网络学习适应不同大小和长宽比的物体。
  • 随机亮度/对比度调整:模拟不同天气和光照条件,让模型对光照变化更鲁棒。
  • 类别平衡采样:像Cityscapes数据集中,“道路”、“天空”等类别像素非常多,而“交通标志”、“行人”等类别像素很少。可以在构建数据加载器时,有倾向性地多采样那些包含稀有类别的图像,或者在损失函数中使用类别权重,给稀有类别更高的权重。

一个实用的PyTorch数据增强流程可能长这样:

import torchvision.transforms as T

train_transform = T.Compose([
    T.RandomResizedCrop(size=(512, 1024), scale=(0.5, 2.0)), # 多尺度裁剪
    T.RandomHorizontalFlip(p=0.5),
    T.ColorJitter(brightness=0.2, contrast=0.2), # 颜色抖动
    T.ToTensor(),
    T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), # ImageNet均值标准差
])

4.2 损失函数与训练技巧

BiSeNet V2的训练通常使用复合损失函数:

  1. 主损失:计算最终融合后输出特征图的预测与真实标签之间的交叉熵损失。
  2. 辅助损失:在上下文路径的中间层(例如下采样8倍和16倍的特征后)也接上小的分割头,计算辅助损失。这两个辅助损失会在训练早期,尤其是网络深层梯度难以回传时,提供更直接的监督信号,帮助网络更快、更稳定地收敛。在测试时,这些辅助头会被丢弃,不影响速度。

损失函数可以这样定义:

import torch.nn as nn
import torch.nn.functional as F

class OhemCELoss(nn.Module):
    """在线难例挖掘交叉熵损失,只对最难的一部分像素计算损失,加速训练"""
    def __init__(self, thresh, ignore_index=255):
        super().__init__()
        self.thresh = thresh
        self.ignore_index = ignore_index

    def forward(self, logits, labels):
        # logits: [B, C, H, W], labels: [B, H, W]
        n_min = labels.numel() // 16  # 选择最难的1/16像素
        criterion = nn.CrossEntropyLoss(ignore_index=self.ignore_index, reduction='none')
        loss = criterion(logits, labels).view(-1)
        loss, _ = loss.sort(descending=True)
        if loss[n_min] > self.thresh:
            loss = loss[loss > self.thresh]
        else:
            loss = loss[:n_min]
        return loss.mean()

# 总损失 = 主损失 + λ * (辅助损失1 + 辅助损失2)

训练时使用**“poly”学习率衰减策略**非常有效:lr = initial_lr * (1 - iter / total_iter) ^ power,其中power通常设为0.9。优化器常用SGD with Momentum或AdamW。对于小批量数据,使用同步批量归一化能提升训练稳定性。

4.3 模型压缩与部署优化

训练出一个高精度的模型只是第一步,要把它放到手机或嵌入式设备上流畅运行,还需要做部署优化:

  • 量化:将模型从32位浮点数转换为8位整数。这能大幅减少模型体积和内存占用,并利用硬件整数计算单元加速。PyTorch和TensorFlow都提供了完善的量化工具。量化后精度可能会有轻微下降,需要通过量化感知训练来缓解。
  • 剪枝:移除网络中不重要的连接或通道。你可以对BiSeNet V2的两条路径分别进行分析性剪枝,比如发现上下文路径的某些中间通道输出权重很小,就可以将其剪掉。
  • 使用专用推理引擎:不要直接使用训练框架进行推理。将模型转换为 ONNX 格式,然后利用 TensorRT (NVIDIA GPU)、OpenVINO (Intel CPU/VPU)、MNN 或 TNN (移动端) 等推理引擎进行优化和部署。这些引擎会对计算图进行算子融合、内存优化等,能带来数倍的推理速度提升。

一个简单的ONNX导出和TensorRT推理的流程示意:

# 1. 导出ONNX
python export_onnx.py --model bisenetv2 --checkpoint model.pth --output bisenetv2.onnx

# 2. 使用TensorRT转换并优化
trtexec --onnx=bisenetv2.onnx --saveEngine=bisenetv2.engine --fp16 --workspace=2048

# 3. 在C++/Python中加载TensorRT引擎进行高速推理

5. 超越街景:BiSeNet V2的多元化应用场景

BiSeNet V2的价值绝不仅限于自动驾驶的街景分割。它的“实时”与“精准”双重特性,为许多交互式、高响应的AI应用打开了大门。

增强现实与虚拟现实:这是我认为BiSeNet V2最能大放异彩的领域之一。想象一下,你戴着一副AR眼镜逛家具店,眼镜需要实时地将虚拟的沙发“放置”在真实的地板上。这个过程首先需要精确分割出地板区域(同时排除地毯、阴影的干扰),还要识别出墙壁、其他家具的位置以避免穿模。BiSeNet V2能够以毫秒级的延迟完成对摄像头画面的语义理解,为虚拟物体的稳定、精准叠加提供至关重要的环境感知基础。我参与过一个AR室内导航项目,就是利用类似的双路径轻量分割网络,实时分割出地面可行走区域和障碍物,效果非常流畅。

移动端图像与视频编辑:现在很多手机APP都有“一键换天空”、“背景虚化”或“视频人像抠图”功能。这些功能的背后,都需要实时、精准的语义分割。BiSeNet V2可以集成到手机APP中,实时分割出人物、天空、建筑等主体。相比于一些纯轻量但精度不高的模型,BiSeNet V2的双路径设计能更好地处理发丝边缘、透明物体(如玻璃杯)等难点,让合成效果更加自然。在视频流中,还可以利用前后帧的时间连续性进行优化,进一步提升分割的稳定性和速度。

工业质检与机器人视觉:在流水线上,机器人需要快速识别并定位产品上的缺陷、装配部件的位置。这些场景往往对速度要求极高(跟上产线节奏),同时缺陷可能非常细小(需要空间细节)。BiSeNet V2的空间路径可以捕捉到细小的划痕或污点,而上下文路径则能理解产品的整体结构,避免误判。将模型部署在工控机或带GPU的嵌入式设备上,可以实现高效的在线检测。

智慧城市与安防监控:对监控视频流进行实时的语义分割,可以统计不同区域的人流、车流,识别异常行为(如人群聚集、车辆违规停放),甚至进行精细化的天气识别(积水、积雪区域)。BiSeNet V2能够在有限的边缘计算设备资源下,实现对多路视频的实时分析,为城市管理提供及时的数据支持。

在这些应用里,最大的挑战往往不是模型本身的精度,而是如何在实际的硬件约束和复杂的真实环境中保持稳定可靠的性能。比如在AR场景下,光照变化剧烈、运动模糊常见;在工业场景下,背景可能杂乱。这就要求我们在使用BiSeNet V2时,必须用贴近实际场景的数据进行充分的微调和测试,不能仅仅满足于在Cityscapes这样的标准数据集上刷出一个漂亮的分数。我的经验是,花在数据清洗和针对性增强上的时间,其回报往往远大于盲目地调整模型结构。

Ubuntu无桥接模式或连不上网(详细解决方法 目录 问题1:Ubuntu没有未桥接的主机网络适配器 解决方法 1.打开VMware安装目录下的文件 ​编辑2.右键安装以上三个文件 3.打开网络状态属性,找到VMware bridgeProtocol,点击安装 问题2.Ubuntu桥接模式连不上网 1.win+r打开cmd终端,输入ipconfig /all 2.记录以下数据 3.打开VMware网络设置 问题1:Ubuntu没有未桥接的主机网络适配器 VMWare安装之后,虚拟网络一直使用默认配置 VMnet0为... 阅读详情

相关推荐

Unity集成阿里Qwen2.5-Omni全模态大模型实战:语音交互与多模态AI开发指南

本文详细介绍了在Unity中集成阿里Qwen2.5-Omni全模态大模型的实战指南。通过C#脚本开发,实现语音交互、图像分析等多模态AI功能,涵盖API调用、音频处理、流式响应解析等核心步骤,为游戏、虚拟人等Unity应用提供沉浸式智能交互解决方案。

weixin_29005499的博客 316

SASS的禁用警告 Using / for division is deprecated and will be removed in Dart Sass 2.0.0.

SASS的禁用警告 Using / for division is deprecated and will be removed in Dart Sass 2.0.0.

weixin_45397766的博客 5586

禾赛PandarXT-16/阿努比LpmsIG1运行lio-sam

课题是多传感器融合,将GNSS/INS/LIDAR做融合定位导航,故考虑使用lio-sam开源算法,在此记录一下我在适配传感器数据时遇到的一些问题;

qq_44705939的博客 2964

sass报错:Using / for division is deprecated and will be removed in Dart Sass 2.0.0.

不懂是为什么,反正我的项目是uniapp的vue2的版本,然后sass原来在package.json里的版本是^1.26.11,但是实际安装的是1.34+的版本了。查资料都是说让用math.div,但是其实都没有作用。要嘛说是@use地方要在头部,要嘛说@use要放在uni.scss中,还有说是使用sass-migrator官方的工具库来批量替换写法。最后反正我是将sass版本固定为1.23.13,就不会出现告警了。

小马甲 6786

SIwave仿真手册——软件基础(一)

最近在学习SIWAVE,在这里将自己的笔记整理一下,做一个专题。希望对大家有帮助,这个会持续更新的。仅限于软件操作学习,不涉及信号完整性的讨论。

luohuo9844的博客 4万+

Python介绍与安装

Python介绍与安装

acegi13579的专栏 3224

老项目无法启动报node-sass相关错误解决方案

由于node版本太高导致,项目无法启动报node-sass错误的解决方案及维护老项目无法install提示node-sass相关问题

weixin_50837690的博客 1718

思科 MIB 库

思科 MIB

m0_54931486的博客 770

migrator:自动化升级Sass样式表

migrator:自动化升级Sass样式表 项目介绍 在现代前端开发中,样式表的维护和升级是一项重要且重复的工作。Sass 作为一种强大的CSS预处理器,提供了许多先进的特性来提升样式表的编写效率。然而,随着时间的推移,Sass 语言本身也在不断进化,这就意味着旧版本的特性可能会被废弃或更新。在这样的背景下,migrator 项目应运而生。 migrator 是一个开源工具,专门用于自动化升级Sa...

gitblog_00905的博客 450

【ROS机器人系统】实验4 ROS简单应用:激光SLAM与导航

ROS简单应用:激光SLAM与导航 (1)了解机器人和SLAM之间关系 (2)了解激光SLAM (3)了解gmapping和导航

南京大学软件工程硕士在读 2146

OpenCode + Oh My OpenCode:打造你的终极AI编程团队(OpenCode新手入门指南)

本文详细介绍了开源终端AI编程助手 OpenCode 的完整配置教程 🖥️,从安装、AI模型配置到增强插件 Oh My OpenCode 的部署一应俱全。支持 Claude、ChatGPT、Gemini 多模型切换 🤖,还能实现多AI智能体协作开发。步骤清晰适合新手 📝,想在终端用AI写代码的开发者不要错过 ✨

XiaoqiangClub的博客 1万+

第十一节:SASS @forward的使用

使用.body {通过@forward暴露的成员在导入(@use)了暴露这些成员的模块的文件中便可使用。如:_library.exports.scss文件暴露了library文件则在styles.scss文件中后即可使用library文件的内容_library.exports.scss文件中通过lib-*后附加了前缀用于区分;使用时加上前缀个人疑问:为什么在文件中需要添加前缀,而在styles.scss文件中和不需要添加前缀?as lib-*是创建带前缀的命名空间,而as lib。

everfoot的博客 1397

Qt 【window udp 高频采集丢包问题】

使用Asio + 无锁队列或者环形缓存区方案可以解决 qt udp 在window平台高速采集 (128k)丢包问题。

weixin_45397344的博客 177

sass/scss预处理器的简单理解

世界上最成熟、最稳定、最强大的专业级CSS扩展语言!

张先生的前端日志 2966

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

sass @forward的使用

sass @forward的使用

听海边涛声 977

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Scss学习--关于Scss指令@use、@forward

@use 从其他Sass样式表加载mixin,function和变量,并将来自多个样式表的CSS组合在一起 // src/_corners.scss $radius: 3px; @mixin rounded { border-radius: $radius; } // style.scss @use "src/corners" as corners; .button { @include corners.rounded; padding: 5px + corners.$radius; }

hide_in_darkness的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Using / for division outside of calc() is deprecated and will be removed in Dart Sass 2.0.0

运行时警告 Deprecation Warning: Using / for division outside of calc() is deprecated and will be removed in Dart Sass 2.0.0. 原因:sass版本的问题, 换成calc全局安装 sass-migrator, 在node_modules/.bin中运行 sass-migrator division ./node_modules/taro-ui-vue3/dist/s

hanchengmei的博客 8330

dart-sass与node-sass的区别以及使用dart-sass可能会出现的问题

dart-sass 和 node-sass都是用来将sass编译成css的工具,所以都依赖sass-loader。但node-sass 与 Node.js 版本相关联,这就导致,一旦本地 Node.js 升级,就会出现 node-sass 无法工作的情况

编码世界 1万+

vue3+vite应用中添加sass预处理器

一、如何安装 进入项目目录直接npm安装即可,不用繁琐的各种配置 npm install --save-dev sass 如果安装了,但是运行vite启动项目依旧出现报错,请检查package.json文件中,sass是不是在依赖配置中,把他移动到开发依赖中即可,一般为安装sass的时候npm没有加–save-dev所导致的。 二、加入全局scss文件 打开vite的配置文件,在里面加入css的配置即可 cssPreprocessOptions: { scss: { additio

web18375173250的博客 2992

vue WARNING: Using / for division outside of calc() is deprecated and will be removed in Dart Sass 2

我直接升级到1.33.0 版本就可以了。网上找到的例子并没有解决我的问题,我的版本是低于1.33.0的。

mentalitys的博客 915

Sass 1.80迁移实战:如何用@use和@forward重构你的老项目(附常见报错解决方案)

本文详细介绍了将老项目从Sass 1.80的@import语法迁移到现代模块化语法@use和@forward的实战策略。文章不仅提供基础替换步骤,更深入剖析了循环依赖、主题变量覆盖等复杂场景的解决方案,并附有常见报错排查指南,旨在帮助开发者高效、平稳地完成重构,提升代码可维护性。

happy2的博客 1057

Deprecation Warning: Using / for division outside of calc() is deprecated and will be removed

项目中出线了许多这种sass的报错,原因是sass2.0.0移除了很多之前的语法。进入node-modules目录下,执行。

q879936814的博客 4470

Vue项目Sass报错全面解决方案:从@import迁移到@use

最近在Vue3+Vite项目中使用Sass时,遇到了几个典型的版本兼容问题。Dart Sass从1.80版本开始进行重大调整,导致原有的@import语法和全局函数陆续被废弃。实际项目中,这些变更往往需要同步进行。我建议的升级步骤是:先修改配置文件,再逐个组件迁移语法,最后统一处理函数调用。遇到复杂项目时,可以分模块逐步迁移,利用sass-migrator工具能节省大量时间。经过这次升级,项目不仅消除了所有警告,还获得了更好的模块化支持。如果你也遇到类似问题,建议尽早完成迁移以适应Sass的未来发展方向。

GarnetFalcon73的博客 620

Directus项目中Sass @import迁移至@use的技术实践

在Directus项目的开发过程中,我们遇到了一个重要的技术升级需求:Sass官方宣布将在Dart Sass 3.0.0版本中移除对@import规则的支持。这一变更意味着项目中所有使用@import的SCSS文件都需要迁移到新的@use语法。 ## 问题分析 Sass团队引入@use规则是为了解决传统@import存在的一些问题: 1. 全局命名空间污染:@import会将所有变量、mixi...

gitblog_00948的博客 833

关于sass @import改为@use as * 报错变量未定义

最近在学习sass,学到文件组织的时候,看见有人说@import即将弃用不推荐使用,随更改node-sass为dart-sass以便使用@usemain.scss改为报错百度之后改为报错依旧后来根据在部分SASS文件中,如何使用父文件中定义的变量?在所有需要变量的文件顶部添加或并更改变量从改为报错消失,页面运行正常。

weixin_42806623的博客 2192

SASS 小笔记

SASS 小笔记变量使用其他 .scss 文件样式嵌套 变量 main.scss $primary-color: antiquewhite; .container{ background-color: $primary-color; } 使用其他 .scss 文件 @import (不推荐使用) - 导入的内容所有的继承文件均可使用,如果文件多难以追踪 @use - 导入的内容仅本文件有效 theme.scss $primary-color: antiquewhite; style.scss

Grace_Zhong的博客 481
上一篇: 深入解析STM32复位电路:从RC延时到抗干扰设计
下一篇: 【深度评测】腾讯云SA3星星海实例:AMD EPYC Milan性能实战解析
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值