当前位置: 首页 > news >正文

第J1周:ResNet-50算法实战与解析

🍨 本文为🔗365天深度学习训练营 中的学习记录博客
🍖 原作者:K同学啊

我的环境
语言环境:Python3.8·
编译器:Jupyter Lab
深度学习环境:Pytorchtorch1.12.1+cu113
torchvision
0.13.1+cu113

一、准备工作

在这里插入图片描述

二、导入数据

在这里插入图片描述

三、划分数据集

在这里插入图片描述
在这里插入图片描述

四、搭建网络

import torch
import torch.nn as nn
import torchsummary as summary
import torchvision.models as modelsdef identity_block(input_tensor, kernel_size, filters, stage, block):"""构建残差网络的恒等映射块Args:input_tensor: 输入张量kernel_size: 卷积核大小filters: [f1, f2, f3] 形式的过滤器数量列表stage: 阶段编号block: 块编号"""filters1, filters2, filters3 = filtersname_base = f'{stage}{block}_identity_block_'# 第一个 1x1 卷积层x = nn.Conv2d(input_tensor.size(1), filters1, 1, bias=False)(input_tensor)x = nn.BatchNorm2d(filters1)(x)x = nn.ReLU(inplace=True)(x)# 3x3 卷积层x = nn.Conv2d(filters1, filters2, kernel_size, padding=kernel_size//2, bias=False)(x)x = nn.BatchNorm2d(filters2)(x)x = nn.ReLU(inplace=True)(x)# 第二个 1x1 卷积层x = nn.Conv2d(filters2, filters3, 1, bias=False)(x)x = nn.BatchNorm2d(filters3)(x)# 添加跳跃连接x = x + input_tensorx = nn.ReLU(inplace=True)(x)return xdef conv_block(input_tensor, kernel_size, filters, stage, block, strides=(2,2)):"""构建残差网络的卷积块Args:input_tensor: 输入张量kernel_size: 卷积核大小filters: [f1, f2, f3] 形式的过滤器数量列表stage: 阶段编号block: 块编号strides: 步长元组"""filters1, filters2, filters3 = filtersname_base = f'{stage}{block}_conv_block_'# 主路径x = nn.Conv2d(input_tensor.size(1), filters1, 1, stride=strides, bias=False)(input_tensor)x = nn.BatchNorm2d(filters1)(x)x = nn.ReLU(inplace=True)(x)x = nn.Conv2d(filters1, filters2, kernel_size, padding=kernel_size//2, bias=False)(x)x = nn.BatchNorm2d(filters2)(x)x = nn.ReLU(inplace=True)(x)x = nn.Conv2d(filters2, filters3, 1, bias=False)(x)x = nn.BatchNorm2d(filters3)(x)# shortcut 路径shortcut = nn.Conv2d(input_tensor.size(1), filters3, 1, stride=strides, bias=False)(input_tensor)shortcut = nn.BatchNorm2d(filters3)(shortcut)# 添加跳跃连接x = x + shortcutx = nn.ReLU(inplace=True)(x)return xdef ResNet50(input_shape=[224,224,3], num_classes=1000):"""构建 ResNet50 模型Args:input_shape: 输入图像的形状 [H, W, C]num_classes: 分类类别数"""# 输入层inputs = torch.randn(1, input_shape[2], input_shape[0], input_shape[1])# 初始卷积块 - 修改 ZeroPadding2d 为 pad 操作x = nn.functional.pad(inputs, (3, 3, 3, 3))  # 替换 ZeroPadding2dx = nn.Conv2d(input_shape[2], 64, 7, stride=2, bias=False)(x)x = nn.BatchNorm2d(64)(x)x = nn.ReLU(inplace=True)(x)x = nn.MaxPool2d(3, stride=2, padding=1)(x)# Stage 2x = conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1,1))x = identity_block(x, 3, [64, 64, 256], stage=2, block='b')x = identity_block(x, 3, [64, 64, 256], stage=2, block='c')# Stage 3x = conv_block(x, 3, [128, 128, 512], stage=3, block='a')x = identity_block(x, 3, [128, 128, 512], stage=3, block='b')x = identity_block(x, 3, [128, 128, 512], stage=3, block='c')x = identity_block(x, 3, [128, 128, 512], stage=3, block='d')# Stage 4x = conv_block(x, 3, [256, 256, 1024], stage=4, block='a')for block in ['b', 'c', 'd', 'e', 'f']:x = identity_block(x, 3, [256, 256, 1024], stage=4, block=block)# Stage 5x = conv_block(x, 3, [512, 512, 2048], stage=5, block='a')x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b')x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c')# 分类层x = nn.AdaptiveAvgPool2d((1, 1))(x)x = torch.flatten(x, 1)x = nn.Linear(2048, num_classes)(x)# 修改模型创建和前向传播的方式class ResNet(nn.Module):def __init__(self):super(ResNet, self).__init__()# 在这里定义所有层def forward(self, x):# 定义前向传播return xmodel = ResNet()# 移除 load_weights,改用 PyTorch 的加载方式model.load_state_dict(torch.load("resnet50_pretrained.pth"))return modelmodel = models.resnet50().to(device)
model
ResNet((conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)(bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True)(maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)(layer1): Sequential((0): Bottleneck((conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True)(downsample): Sequential((0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)(1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(1): Bottleneck((conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True))(2): Bottleneck((conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True)))(layer2): Sequential((0): Bottleneck((conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True)(downsample): Sequential((0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)(1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(1): Bottleneck((conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True))(2): Bottleneck((conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True))(3): Bottleneck((conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True)))(layer3): Sequential((0): Bottleneck((conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)(bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True)(downsample): Sequential((0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)(1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(1): Bottleneck((conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True))(2): Bottleneck((conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True))(3): Bottleneck((conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True))(4): Bottleneck((conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True))(5): Bottleneck((conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True)))(layer4): Sequential((0): Bottleneck((conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)(bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True)(downsample): Sequential((0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)(1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)))(1): Bottleneck((conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True))(2): Bottleneck((conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)(bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)(bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True)))(avgpool): AdaptiveAvgPool2d(output_size=(1, 1))(fc): Linear(in_features=2048, out_features=1000, bias=True)
)

五、编写训练函数和测试函数

在这里插入图片描述
在这里插入图片描述

六、设置超参数

在这里插入图片描述

七、训练

在这里插入图片描述

在这里插入图片描述

八、可视化

在这里插入图片描述

在这里插入图片描述

八、总结

ResNet是由微软研究院提出的,应该是在2015年的ImageNet竞赛中取得了很好的成绩。残差块是它的核心概念,对吧?残差块通过跳跃连接(shortcut connections)将输入直接传递到后面的层,这样可以让网络更容易训练深层结构。那ResNet-50中的50层具体是怎么组成的呢?

ResNet有不同的版本,比如ResNet-18、34、50、101、152,数字代表层数。50层的应该比更小的版本更深,结构更复杂。那ResNet-50的结构具体是怎样的?可能由多个残差块堆叠而成,每个残差块里面有几个卷积层?

对了,ResNet中的残差块有两种类型,一种是基础的残差块,用于较浅的网络如ResNet-34,另一种是瓶颈结构(bottleneck),可能用于更深的网络如ResNet-50。瓶颈结构应该是指通过1x1的卷积层先减少通道数,再做3x3的卷积,然后再用1x1恢复通道数,这样可以减少计算量,同时保持网络深度。

所以ResNet-50可能由多个这样的瓶颈块组成。那每个阶段的块数应该是怎样的?比如,可能有四个阶段(stage),每个阶段包含不同数量的残差块。比如第一个阶段可能处理较大的特征图,之后每个阶段通过步长为2的卷积进行下采样,特征图尺寸减半,通道数增加。

比如,初始的层可能是一个7x7的卷积层,接着是池化层,然后是四个阶段的残差块。每个阶段的块数目可能是3,4,6,3,这样加起来总层数可能达到50层?需要计算一下每个块贡献的层数。瓶颈块每个块包含三个卷积层:1x1,3x3,1x1。所以每个块有3层,四个阶段的块数如果是3,4,6,3,总块数是3+4+6+3=16个块,每个块3层,就是16 * 3=48层,加上前面的7x7卷积层和池化层,还有最后的全连接层,可能总数接近50层?所以ResNet-50的结构大致如此。

另外,跳跃连接的结构可能有不同的处理方式,当输入和输出的通道数或尺寸不一致时,可能用1x1的卷积来调整通道数或进行下采样。例如,在进入每个阶段的第一个残差块时,可能需要调整shortcut连接的通道数,这时会使用一个1x1卷积,步长为2来减小尺寸并调整通道数。

那ResNet-50的创新点主要是残差学习和瓶颈结构,这样可以让网络更深而不出现梯度消失的问题。传统深层网络训练时,随着层数增加,准确率会饱和甚至下降,而残差网络通过引入跳跃连接,使得网络更容易学习恒等映射,从而让训练更深的网络变得可行。

相关文章:

第J1周:ResNet-50算法实战与解析

🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍖 原作者:K同学啊 我的环境 语言环境:Python3.8 编译器:Jupyter Lab 深度学习环境:Pytorchtorch1.12.1cu113 torchvision0.13.1cu113 一、准备工作 二、导入数据 三、划分数据…...

PCL 计算一条射线与二次曲面的交点

文章目录 一、简介二、实现代码三、实现效果一、简介 对于二次曲面而言,其一般方程可以写为: z = a 0 + a 1 x + a 2 y + a...

Executors类详解

Executors类详解 Executors 是Java中用于快速创建线程池的工具类,提供了一系列工厂方法,简化了 ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 的配置。以下是其核心方法、实现原理及使用注意事项: 1. 常用线程池工厂方法 (1) newFixedThreadPool 作用:创建固定大小…...

学习alpha

(sign(ts_delta(volume, 1)) * (-1 * ts_delta(close, 1))) 这个先用sign操作符 sign.如果输入NaN则返回NaN 在金融领域,符号函数 sign(x) 与 “基础”(Base)的组合概念可结合具体场景解读,以下从不同金融场景分析其潜在意义&…...

6种方式来探究数据集的的方法worldquant

覆盖率百分比 指金融数据字段(如股价、成交量、财务指标)在时间或空间上的有效数据比例。 时间维度:数据在历史周期内的完整度(如:某股票过去 1 年中,95% 的交易日有收盘价)。空间维度&#xf…...

MiniMax语音模型Speech-02近日登顶多个全球榜单,详细技术解析

MiniMax最新发布的Speech-02把TTS领域传统巨头OpenAI、ElevenLabs拉下马来,直接登顶智能语音权威榜单Artificial Arena,不管是WER(字错率),还是SIM(声纹相似度)等客观指标都领先国外顶级模型&am…...

JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换

关键点 JavaScript 可以轻松实现时间格式(HH:mm:ss 或 HH:mm)与十进制小时(如 17.5)的相互转换。两个函数分别处理时间字符串到十进制小时,以及十进制小时到时间字符串的转换,支持灵活的输入和输出格式。这…...

前端面经 手写Promise

核心功能 仿Promise对象需要接收包含两个变量的回调函数 构造函数 <script>class myPromise {constructor(func){const resolve (result)>{console.log(resolve执行了)}const reject (result)>{console.log(reject执行了)}func(resolve,reject)}}// Promise的…...

JavaSE基础语法之方法

方法 一、方法入门 1.方法定义 方法是一种语法结构&#xff0c;它可以把一段代码封装成一个功能&#xff0c;以便重复调用。 2.方法的格式 修饰符 返回值类型 方法名( 形参列表 ){方法体代码(需要执行的功能代码) }示例&#xff1a; public static int sum ( int a ,…...

在 Neo4j 中实现向量化存储:从文本到高效语义搜索

在当今数据驱动的时代&#xff0c;图数据库因其强大的关系表达能力和高效的查询性能&#xff0c;逐渐成为处理复杂数据结构的首选工具之一。Neo4j 作为领先的图数据库&#xff0c;不仅支持传统的图数据存储和查询&#xff0c;还通过向量化存储功能&#xff0c;为语义搜索和推荐…...

三格电子上新了——IO-Link系列集线器

一、产品概述 1.1产品用途 IO-Link系列集线器是一系列数字量输入输出I/O设备&#xff0c;可以将标准开关量信号接入到此设备。通过此集线器方便的将大量的I/O点位接入到IO-Link主站&#xff0c;进而接入到PLC控制系统。 IO-Link通信接口和8个I/O接口(16个IO点位)均采用M12规…...

记一次从windows连接远程Linux系统来控制设备采集数据方法

文章目录 0 引入1、方法2、优化Process使用 3、引用 0 引入 最近使用的探测器是老外的&#xff0c;老外的探测器需要在centos系统上&#xff0c;在这系统上有相应的指令或者软件控制&#xff0c;但是我们的软件在windwons上&#xff0c;所以目前的困难是&#xff1a;如何在Win…...

鸿蒙 ArkTS 常用的数组和字符串 操作方法

数组的常用方法 方法名功能描述concat(value0, ?value1, /* … ,*/ ?valueN)合并两个或多个数组。此方法不会更改现有数组&#xff0c;而是返回一个新数组copyWithin(target, ?start, ?end)浅复制数组的一部分到同一数组中的另一个位置&#xff0c;并返回它&#xff0c;不…...

Web性能优化的未来:边缘计算、AI与新型渲染架构

一、边缘计算与性能优化深度整合 1.1 边缘节点计算卸载策略 • 智能任务分割:将非关键路径计算卸载到边缘节点 // 客户端代码 const edgeTask = new EdgeTask(image-processing); edgeTask.postMessage(imageData, {transfer...

Python字符串常用内置函数详解

文章目录 Python字符串常用内置函数详解一、基础字符串函数1. len() - 获取字符串长度2. ord() - 获取字符的Unicode码点3. chr() - 通过Unicode码点获取字符4. ascii() - 获取字符的ASCII表示 二、类型转换函数1. str() - 将对象转为字符串2. repr() - 获取对象的官方字符串表…...

2025程序设计天梯赛补题报告

2025程序设计天梯赛补题报告 仅包含L1 L2 L1-6 这不是字符串题 题目描述 因为每年天梯赛字符串题的解答率都不尽如人意&#xff0c;因此出题组从几年前开始决定&#xff1a;每年的天梯赛的 15 分一定会有一道字符串题&#xff0c;另外一道则一定不是字符串题。 小特现在有…...

【GNN笔记】Signed Graph Convolutional Network(12)【未完】

视频链接&#xff1a;《图神经网络》 Signed Graph Convolutional Network 之前介绍的GNN模型主要集中在无符号的网络&#xff08;或仅由正链接组成的图&#xff09;上&#xff0c;符号 图带来的挑战&#xff0c;主要集中在于 否定链接&#xff0c;与正链接相比&#xff0c;它不…...

CSR、SSR与ISR的奇妙之旅

网页渲染三剑客:CSR、SSR与ISR的奇妙之旅 三种渲染方式的核心本质 CSR(客户端渲染)让浏览器成为"厨师",SSR(服务器端渲染)让服务器担任"厨师",而ISR(增量静态再生)则是一位兼具"提前备餐"和"即时烹饪"能力的"超级厨师"…...

YOLO+UI(C#)开发

接Windows目标检测程序开发&#xff08;YOLO&#xff08;python推理&#xff09;界面开发&#xff08;C#&#xff09;&#xff09; C#作为软件界面&#xff0c;推理、前处理、后处理逻辑全部python&#xff0c;接任何功能定制...

生产级JVM参数优化

Spring Boot 应用性能提升 300% 当你的 Spring Boot 应用响应迟缓&#xff0c;且已采用缓存、数据库索引和异步处理优化后&#xff0c;下一个优化方向在哪里&#xff1f;我的答案是 JVM 本身。 经过性能分析和深入研究&#xff0c;我发现合理配置 JVM 参数可以带来显著的性能…...

什么是SMBus

一、SMBus的定义与背景 基本概念 SMBus&#xff08;System Management Bus&#xff0c;系统管理总线&#xff09; 是一种基于IC&#xff08;Inter-Integrated Circuit&#xff09;协议的轻量级两线制串行通信总线&#xff0c;由Intel于1995年提出&#xff0c;主要用于低带宽系统…...

[Unity]AstarPathfindingProject动态烘焙场景

需求 项目是MMO大场景&#xff0c;按地块划分了10x10的大格子。角色移动时动态更新周边场景&#xff0c;且角色还有传送功能。 项目中寻路用了AstarPathfindingProject的Grid。因此需要动态烘焙寻路信息。 核心代码 private void bakeAStarPath(){AstarPath astarPath Astar…...

Go语言处理HTTP下载中EOFFailed

在 Go 语言中使用 HTTP 下载文件时遇到 EOF 或 Failed 错误&#xff0c;通常是由于网络连接问题、服务器中断、未正确处理响应体或并发写入冲突等原因导致的。以下是详细的解决方案&#xff1a; 1. 检查错误类型并重试 io.EOF 错误可能表示连接被服务器关闭&#xff0c;而 Fai…...

React学习(一)

React 基础概念 组件&#xff1a;React 应用的基本构建块&#xff0c;可以是类组件或函数组件。JSX&#xff1a;JavaScript 的语法扩展&#xff0c;允许在 JavaScript 中写 HTML 结构。Props&#xff1a;组件的输入参数&#xff0c;用于父组件向子组件传递数据。State&#xf…...

QML 属性动画、行为动画与预定义动画

目录 引言相关阅读本文使用的动画属性工程结构示例解析示例1&#xff1a;属性动画应用示例2&#xff1a;行为动画实现示例3&#xff1a;预定义动画 总结工程下载 引言 QML动画系统为界面元素提供了流畅的过渡效果。本文通过三个示例&#xff0c;结合属性动画(PropertyAnimatio…...

UML活动图零基础入门:1 分钟掌握核心逻辑(附实战模板)

想快速搞懂UML活动图怎么用&#xff1f;别担心&#xff01;作为软件开发和业务流程设计的动态流程图&#xff0c;UML活动图能直观展现系统操作步骤、决策逻辑和并行流程&#xff0c;是团队协作中沟通需求、优化流程的必备工具。无论是产品经理梳理业务流程&#xff0c;还是开发…...

临床决策支持系统的提示工程优化路径深度解析

引言 随着人工智能技术在医疗领域的迅猛发展,临床决策支持系统(CDSS)正经历从传统规则引擎向智能提示工程的范式转变。在这一背景下,如何构建既符合循证医学原则又能适应个体化医疗需求的CDSS成为医学人工智能领域的核心挑战。本报告深入剖析了临床决策支持系统中提示工程的…...

[模型部署] 3. 性能优化

&#x1f44b; 你好&#xff01;这里有实用干货与深度分享✨✨ 若有帮助&#xff0c;欢迎&#xff1a;​ &#x1f44d; 点赞 | ⭐ 收藏 | &#x1f4ac; 评论 | ➕ 关注 &#xff0c;解锁更多精彩&#xff01;​ &#x1f4c1; 收藏专栏即可第一时间获取最新推送&#x1f514;…...

使用 LSTM/GRU 预测设备异常的模型

LSTM(Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,旨在解决传统 RNN 在处理长序列数据时的梯度消失和梯度爆炸问题。它通过引入门控机制和单元状态来更好地控制信息的流动,使得网络能够学习到长期依赖关系。以下是其主要特点: 门控机制:包括遗忘门、输…...

八股文--JVM(1)

⭐️⭐️JVM内存模型 程序计数器&#xff1a;可以看作是当前线程所执行的字节码的行号指示器&#xff0c;用于存储当前线程正在执行的 Java 方法的 JVM 指令地址。如果线程执行的是 Native 方法&#xff0c;计数器值为 null。是唯一一个在 Java 虚拟机规范中没有规定任何 OutOf…...

BM25 算法与关键词提取在向量数据库中的实践优化

BM25 算法与关键词提取在向量数据库中的实践优化 在实际构建问答系统或语义检索场景中&#xff0c;向量数据库&#xff08;如 Weaviate&#xff09;提供了基于语义匹配的检索能力&#xff0c;然而我们发现 BM25 关键词检索效果不理想&#xff0c;甚至出现了召回率过低、查询必…...

济南超算研究所面试问题

1.自我介绍 2.java抽象类与接口的区别 3.抽象类能否实例化 4.在项目中用的抽象类偏多还是接口偏多 5.抽象类用的场景介绍一下 6.java中数据结构有哪些 7.数据的基本类型 8.引用类型&#xff0c;包装类型 9.是一个场景题&#xff0c;在查询数据库中的数据时&#xff0c;…...

“多维像素”可赋能具身智能非凡感知力——昱感微参加2025松山湖中国IC创新高峰论坛

5月13日&#xff0c;由中国半导体行业协会集成电路设计分会、芯原微电子&#xff08;上海&#xff09;股份有限公司联合主办的第十五届松山湖中国IC创新高峰论坛在东莞松山湖举行。本届松山湖论坛以“面向‘具身智慧机器人’的创新IC新品推介”为主题&#xff0c;吸引了许多知名…...

解决CLion控制台不能及时显示输出的问题

CLion 2025版本可以免费用于非商业用途了&#xff0c;下载来试用了一下&#xff0c;与JB的其它 IDE一样的资源占用比较大&#xff0c;流畅度不及VSCode。 在Windows下创建了一个简单的控制台应用程序&#xff0c;使用printf和std::cout输出字符串&#xff0c;发现CLion的控制台…...

多尺度对比度调整

一、背景介绍 受到了前面锐化算法实现的启发&#xff0c;对高频层做增强是锐化&#xff0c;那么对中低频一起做增强&#xff0c;就应该能有局域对比度增强效果。 直接暴力实现了个基本版本&#xff0c;确实有对比度增强效果。然后搜了下关键字&#xff0c;还真找到了已经有人这…...

虹桥前湾印象城MEGA品牌大会灵感迸发,共绘湾系生活新章

前言&#xff1a;当千年水韵流淌至上海前湾&#xff0c;当苏州河的生态肌理转化为商业空间的呼吸脉络……上海虹桥前湾印象城MEGA“漫漫而来”。 5月15-16日&#xff0c;以“灵感新章 Wave of Megagination”为主题的虹桥前湾印象城MEGA品牌大会成功举办&#xff0c;正式掀开长…...

新京东,正在成为一种生活方式

出品|何玺排版|叶媛 一个新京东&#xff0c;正在从“心”诞生。 2025年2月11日之前&#xff0c;如果问京东是做什么的&#xff0c;相信大多数人会回答京东是电商平台&#xff0c;卖家电数码日用百货的。现在&#xff0c;如果问京东是做什么的&#xff0c;相信大家的回答不在是…...

读论文alexnet:ImageNet Classification with Deep Convolutional Neural Networks

https://zhuanlan.zhihu.com/p/13694329885 1, 公式 卷积层输出尺寸&#xff1a; o ⌊(i 2p - k) / s⌋ 1 式中&#xff0c;i:输入尺寸&#xff1b;o:输出尺寸&#xff1b;p:padding&#xff1b;k: kernel_size&#xff1b;s: stride。⌊…⌋表示向下取整。 2, 推导过程 …...

操作系统|| 虚拟内存页置换算法

题目 写一个程序来实现 FIFO 和 LRU 页置换算法。首先&#xff0c;产生一个随机的页面引用序列&#xff0c;页面数从 0~9。将这个序列应用到每个算法并记录发生的页错误的次数。实现这个算法时要将页帧的数量设为可变。假设使用请求调页。可以参考所示的抽象类。 抽象类&…...

AGI大模型(19):下载模型到本地之ModelScope(魔搭社区)

1 安装模块 魔塔社区提供了下载的模块&#xff0c;如下&#xff1a; pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple 2 模型下载 from modelscope import snapshot_download model_dirsnapshot_download(LLM-Research/Meta-Llama-3-8B,cache_dirrD:\…...

常见面试题

1.stringbuffer和stringbuilder的区别&#xff0c;stringbuffer是通过什么实现线程安全的? StringBuffer 和 StringBuilder 都是用于处理可变字符串的类&#xff0c;但它们的主要区别在于 线程安全性。 StringBuffer 的线程安全是通过方法加锁&#xff08;synchronized&…...

【视觉任务】深度估计(Depth Estimation)介绍(2025年更新)

文章目录 1. 任务定义与意义2. 按输入类型的分类2.1 单目深度估计&#xff08;Monocular Depth Estimation&#xff09;2.2 双目与多视图深度估计&#xff08;Stereo / Multi-view&#xff09;2.3 深度相机输入&#xff08;RGB-D&#xff09;2.4 主动与被动方法 3. 核心方法概述…...

Python 在Excel单元格中应用多种字体样式

文在数据处理和报表生成场景中&#xff0c;Excel 文件的格式设置至关重要。合理的字体格式不仅能提升表格的可读性&#xff0c;还能突出关键数据。本文将详细介绍如何使用免费库Free Spire.XLS for Python&#xff0c;在 Excel 单元格中灵活应用多种字体格式&#xff0c;包括字…...

C++:字符串操作函数

strcpy() 功能&#xff1a;把一个字符串复制到另一个字符串。 #include <iostream> #include <cstring> using namespace std;int main() {char src[] "Hello";char dest[10];strcpy(dest, src);cout << "Copied string: " << …...

Spark,SparkSQL操作Mysql, 创建数据库和表

SparkSQL操作Mysql 1.查看系统内是否有mysql [roothadoop100 ~]# rpm -aq | grep mariadb mariadb-libs-5.5.68-1.el7.x86_64 2.想我上面输出了有结果的即证明有&#xff0c;使用下列命令删除即可 [roothadoop100 ~]# rpm -e --nodeps mariadb-libs 3.进入我们常用存放压缩包…...

降低学习成本,1 天掌握 Java 开发核心技能

在当今数字化浪潮中&#xff0c;Java 编程语言凭借其卓越的跨平台性与稳定性&#xff0c;在企业级系统搭建、移动端应用开发以及大数据处理等领域占据着举足轻重的地位。但不可忽视的是&#xff0c;Java 开发链条冗长&#xff0c;从需求剖析到代码落地的全流程充满挑战&#xf…...

类模板的简单实例

author: hjjdebug date: 2025年 05月 16日 星期五 15:06:00 CST description: 类模板的简单实例 文章目录 1.实例代码:2. 模板类写法2.1 模板类的构造函数.2.2 模板类中的语句 3. 模板类的实例化过程.3.1 实例化的进一步试验. 4. 怎样调试constexpr 修饰的函数&#xff1f; 类模…...

描述性统计图表

一、核心图表类型与用途 1、直方图(Histogram) (1)定义:用连续矩形表示数据分布,横轴为数据区间,纵轴为频数或频率。 (2)用途:展示数据分布形态(对称、偏态)、识别离群值。 (3)适用场景:分析连续型变量的分布特征,如收入分布、考试成绩分布。 2、箱线图(Box P…...

【Golang笔记01】Goland基础语法规则

Golang笔记&#xff1a;快速学习Golang基础语法规则 一、基础语法 1.1、环境安装 第一步需要安装go的运行环境&#xff0c;从官网下载安装包&#xff1a;https://golang.google.cn/dl/。 第二步需要安装go的开发工具&#xff0c;可以使用vscode、goland。这里推荐使用golan…...

STM32 ADC+DMA+TIM触发采样实战:避坑指南与源码解析

知识点1【TRGO的介绍】 1、TRGO的概述 TRGO&#xff1a;Trigger Output&#xff08;触发输出&#xff09;&#xff0c;是定时器的一种功能。 它可以作为外设的启动信号&#xff0c;比如ADC转换&#xff0c;DAC输出&#xff0c;DMA请求等。 对于ADC来说&#xff0c;可以通过…...