你好!这是一个非常棒且非常重要的问题,在音频机器学习项目中,选择合适的采样率是平衡计算效率和模型性能的关键。

直接回答你的问题:将音频下采样到 800 Hz 对于绝大多数音频分类任务来说都太低了,几乎肯定会丢失大量关键信息,导致模型性能急剧下降。

下面我为你详细解释原因,并提供一个科学的选择框架。

为什么 800 Hz 不合适?—— 奈奎斯特采样定理

根据奈奎斯特-香农采样定理,要无损地重建一个信号,采样频率必须至少是信号最高频率分量的两倍

  • 800 Hz 的采样率:意味着能无损表示的最高频率是 400 Hz
  • 人类语音:虽然语音的基础频率(F0,即音调)较低(男性100Hz,女性200Hz),但承载着辅音和语义信息的共振峰(Formants) 频率很高。通常前三个共振峰(F1, F2, F3)对于区分声音至关重要,而 F2 和 F3 经常可以达到 3000 Hz 以上。
  • 疾病音频(如咳嗽、呼吸音):许多病理性的声音恰恰包含高频成分。
    • 咳嗽声:可能包含高频的爆破音。
    • 喘息声(Wheezing):是一种高频的乐音,其频率通常在 400 Hz 到 1600 Hz 甚至更高
    • 干啰音(Rhonchi):是一种低频的鼾音。
    • 爆裂音(Crackles):分为粗爆裂音和细爆裂音,其中细爆裂音是非常短暂的高频声音。

结论:如果你使用 800 Hz 采样率,所有高于 400 Hz 的频率信息都会因混叠失真而丢失。这意味着你将过滤掉几乎所有喘息声和细爆裂音,而这些正是诊断肺部疾病(如哮喘、COPD、肺炎)的关键生物标志物。你的模型将无法学习到这些特征。


那么,下采样到多少赫兹比较合适?

这是一个权衡艺术,但有一些通用的准则和常见的实践:

1. 确定任务所需的频率范围
  • 语音识别(ASR):关注的是语义内容,而不是音色或细微声音。8 kHz 是一个经典标准(覆盖 ~4 kHz),因为电话语音就是在这个范围内传输的,它已经足够清晰地捕捉绝大部分语音信息。
  • 音频事件检测(Audio Event Detection):如关门声、汽车喇叭声。范围取决于具体事件,但通常 8 kHz - 16 kHz 是常见的。
  • 音乐信息检索(MIR):需要高频来捕捉旋律、和声和音色,通常保持 22.05 kHz 或 44.1 kHz
  • 医学音频分类(你的任务):这是要求最高的场景之一。为了保留关键的病理高频声音,你需要比语音识别更高的采样率。
2. 常用医学音频研究的采样率

在学术论文中,处理呼吸音、咳嗽声等生物声学信号时,常见的采样率选择是:

  • 16 kHz:这是一个非常好的起点和底线。它能覆盖到 8 kHz 的频率,足以捕捉大部分喘息声和大部分的咳嗽声特征。对于许多计算资源有限的模型来说,这是一个不错的平衡点。
  • 44.1 kHz / 48 kHz黄金标准。如果你的原始数据就是这个质量,并且你的模型能够处理这个长度的序列,尽量保留。这确保了所有可能的高频信息都被完整捕获。
  • 8 kHz:这通常是最低限度,可能会丢失有价值的信息,尤其是在区分细微的病理声音时。只有在初步实验或极度关注计算效率,且已证实性能可以接受时,才考虑使用。
3. 一个实用的建议工作流
  1. 从 16 kHz 开始:将你的数据下采样到 16 kHz。这是目前非常普遍的语音和音频研究采样率,也是一个安全的起点。它的序列长度是 8 kHz 的两倍,但比 44.1 kHz 短了约 2.75 倍,已经能大幅减少计算量。
  2. 进行实验比较
    • 16 kHz 的数据训练你的模型,并在验证集/测试集上得到基准性能。
    • 然后,额外做一组实验,将数据进一步下采样到 8 kHz,用相同的模型和参数训练,比较性能。
    • 如果性能下降非常微小,说明你的任务可能对超高频信息不敏感,你可以放心地使用 8 kHz 来加速。
    • 如果性能显著下降,说明你需要 16 kHz 或更高的采样率。这时不应该再降低采样率,而应该从模型侧想办法处理长序列。

除了降低采样率,还有哪些处理长序列的方法?

降低采样率不是解决长序列问题的唯一方法。你可以结合以下策略:

  1. 特征提取而非输入raw波形

    • 不要直接将成千上万个采样点输入模型。可以先计算音频的频谱图(Spectrogram)梅尔频谱图(Mel-Spectrogram)MFCCs
    • 这些特征是二维的(时间帧 x 频率),并且非常压缩。一个 10 秒的音频,原始波形在 16kHz 下有 160,000 个点,但转换成频谱图后可能只有几百个时间帧,极大地缩短了序列长度。这是最主流、最有效的方法。时序模型(如CNN+RNN或Transformer)处理这些特征序列效果非常好。
  2. 分层/池化模型

    • 使用卷积神经网络(CNN)的第一层来对原始波形进行降维局部特征提取。卷积和池化操作天然地可以减少序列长度。
  3. 模型结构优化

    • 使用更擅长处理长序列的模型架构,如Transformer(具有自注意力机制)或WaveNet(使用膨胀因果卷积)。虽然计算量依然大,但它们设计之初就是为了解决长序列问题。
  4. 分段处理

    • 将长音频裁剪成固定长度(如 2-4 秒)的片段,分别输入模型进行预测,然后对片段的预测结果进行集成(如投票或平均)得到最终结果。

总结与最终建议

  • 绝对不要下采样到 800 Hz。这会破坏数据,让你的项目从一开始就注定失败。
  • 首推采样率:从 16 kHz 开始。它在计算量和信息保留之间取得了很好的平衡。
  • 基准对比:务必进行 16 kHz vs 8 kHz 的对比实验,用数据来决定最佳采样率。
  • 最佳实践不要直接输入原始波形,优先考虑提取梅尔频谱图等特征作为模型的输入。这不仅能大幅缩短序列长度,而且这些特征通常更有利于模型学习。

希望这个详细的解释能帮助你做出正确的决策!祝你的项目顺利!

在音频疾病分类任务中,下采样频率的选择核心是**“保留疾病相关的关键语音/音频特征”与“减少数据冗余、降低计算量”的平衡**。需要先明确:疾病分类的核心信息并非来自音频的高频段,而是集中在低频-中频段(对应语音的基频、共振峰等关键特征),这为下采样提供了空间。以下从“关键频段分析”“合理下采样范围”“实操建议”三部分展开:

一、先明确:音频疾病分类的“核心信息频段”

无论是帕金森病、阿尔茨海默病等导致的语音异常,还是呼吸疾病的肺部音频异常,其关键鉴别特征都集中在200Hz ~ 4kHz的频段内,具体原因如下:

  1. 语音类疾病(如帕金森)

    • 基频(F0):成人男性约85180Hz,女性约165255Hz,疾病会导致基频稳定性下降(如震颤);
    • 共振峰(F1F3):决定元音音色,F1约5001000Hz,F2约15002500Hz,F3约25003500Hz,疾病会导致共振峰带宽变宽、频率偏移;
    • 以上特征均在4kHz以下,高频段(>4kHz)主要是语音的“摩擦音细节”,对疾病鉴别贡献极小,且易受噪声干扰。
  2. 非语音音频(如肺部呼吸音)

    • 正常呼吸音约2001000Hz,异常呼吸音(如湿啰音、哮鸣音)多在5003000Hz,同样无需高频段信息。

二、合理的下采样频率范围:4kHz ~ 8kHz

基于“核心频段≤4kHz”和奈奎斯特采样定理(采样率需≥2倍信号最高频率,否则会发生频率混叠,丢失信息),可推导出合理的下采样频率范围:

  • 最低安全频率:4kHz
    奈奎斯特频率=2kHz,刚好覆盖200Hz2kHz的核心基频+F1,但会丢失部分F2/F3(24kHz)的细节。
    ✅ 适用场景:计算资源极度紧张,且疾病特征主要集中在低频段(如仅关注基频稳定性);
    ❌ 风险:若疾病异常与F2/F3相关(如部分语音障碍),可能导致分类精度下降。

  • 最优平衡频率:8kHz
    奈奎斯特频率=4kHz,能完整覆盖200Hz4kHz的“基频+F1F3”所有关键频段,同时相比16kHz/44kHz:

    • 数据量减少50%~82%(16kHz→8kHz:采样点减半;44kHz→8kHz:采样点仅为原来的18%);
    • 序列长度同步减少(如30秒音频:44kHz→132万采样点,8kHz→24万采样点),自注意力计算量降至原来的(8/44)²≈3%(因计算量与序列长度平方成正比)。
      ✅ 适用场景:绝大多数音频疾病分类任务,兼顾“信息完整性”和“计算效率”,是行业常用选择。
  • 不建议低于4kHz
    若下采样到2kHz,奈奎斯特频率=1kHz,会完全丢失F2/F3(>1kHz),而这两个共振峰是区分元音、判断语音异常的关键,会导致核心特征丢失,分类精度大幅下降。

三、实操注意事项(避免下采样导致信息失真)

  1. 下采样前必须先做低通滤波
    直接丢弃采样点会导致“频率混叠”(高频信号被错误映射到低频,污染核心频段)。正确步骤:

    • 若目标采样率=8kHz:先对原始音频(16kHz/44kHz)用4kHz低通滤波器(保留≤4kHz的信号);
    • 再按“整数倍抽点”(16kHz→8kHz:每2个采样点抽1个;44kHz→8kHz:先重采样到8kHz,避免非整数倍误差)。
  2. 通过预实验验证更低频率的可行性
    若想尝试4kHz,需先做对比实验:

    • 用8kHz和4kHz分别下采样,训练相同结构的模型;
    • 若4kHz的精度仅下降1%~2%,且计算量减少50%,则可选用4kHz;
    • 若精度下降超过5%,说明4kHz丢失了关键信息,需退回8kHz。
  3. 结合特征工程进一步降维
    若8kHz仍觉得序列过长,可搭配MFCC特征提取(如之前讨论):

    • 8kHz音频→按25ms帧长(200采样点)、10ms帧移(80采样点)提取MFCC;
    • 30秒音频的序列长度从24万→375帧(MFCC序列长度仅375),计算量再降一个量级,且保留核心频谱特征。

总结

  • 首选下采样频率:8kHz:完整保留疾病分类的关键频段,数据量和计算量大幅降低,是“信息-效率”的最优平衡;
  • 次选尝试:4kHz:仅在计算资源极度紧张时尝试,需通过预实验验证精度损失;
  • 绝对避免:<4kHz:会丢失核心共振峰信息,导致模型失效。

最终可根据你的GPU内存(如8GB以下可尝试4kHz,12GB以上优先8kHz)和任务精度要求,通过小范围实验确定最佳频率。

你的代码已经间接完成了“低通滤波→重采样”的核心流程,但这一步是通过librosa.load的内置逻辑自动实现的,而非你手动显式编写。下面结合你的代码和原理,分三部分讲清楚:

一、先回答核心问题:你的代码是否做了“低通滤波”?

做了,但由librosa.load自动完成,无需你额外手动添加
librosa作为专业音频处理库,在你指定sr=self.sample_rate(即“统一重采样到目标频率”)时,会默认执行抗混叠低通滤波——这是librosa为避免重采样时的“频率混叠”问题内置的关键步骤。

你当前的代码流程(以“44kHz/16kHz→8kHz”为例)实际是:
原始音频(44kHz/16kHz)→ librosa自动低通滤波(截止频率=目标采样率的1/2)→ 重采样到8kHz → 输出wav

二、为什么下采样前必须先做低通滤波?(核心原理:奈奎斯特采样定理+混叠危害)

要理解这一步的必要性,必须先明确两个关键概念:

1. 奈奎斯特采样定理(下采样的“红线”)

对连续信号进行采样时,采样频率(记为( f_s ))必须≥2倍的信号最高频率(记为( f_{\text{max}} )),否则无法从采样后的离散信号中恢复出原始连续信号。
这里的“2倍( f_{\text{max}} )”被称为奈奎斯特频率(( f_N = f_s/2 ))——它是采样系统能“准确捕捉”的最高频率上限。

以你的目标采样率( f_s=8kHz )为例:
奈奎斯特频率( f_N=4kHz ),意味着你的采样系统最多只能准确捕捉≤4kHz的信号;若原始音频中存在>4kHz的高频信号,这些信号无法被8kHz采样率“正确记录”,会发生“混叠”。

2. 混叠:不做低通滤波的致命问题

“混叠”是指高于奈奎斯特频率的高频信号,被错误地映射到低频段,产生与原始低频信号“重叠”的虚假信号,最终污染你需要的核心信息(比如疾病分类依赖的200Hz~4kHz频段)。

举个具体例子(你的场景):

  • 原始44kHz音频中,有一个5kHz的高频噪声(对疾病分类无用);
  • 若不做低通滤波直接下采样到8kHz(奈奎斯特频率4kHz):5kHz的高频信号会被混叠成 8kHz - 5kHz = 3kHz 的虚假信号;
  • 这个3kHz的虚假信号,会与你需要的“真实3kHz共振峰”(疾病鉴别特征)重叠,导致模型无法区分真假特征,最终影响分类精度。

而低通滤波的作用,就是在重采样前主动滤除高于奈奎斯特频率的高频信号(比如8kHz目标采样率下,滤除>4kHz的信号),从根源上避免混叠。

三、你的代码中librosa.load是如何实现“低通滤波+重采样”的?

librosaload函数在指定sr参数时,会自动执行以下步骤(对应你的代码逻辑):

步骤针对44kHz原始音频针对16kHz原始音频目的
1. 读取原始音频读取44kHz的原始音频,保留所有频段(0~22kHz)读取16kHz的原始音频,保留0~8kHz频段获取未处理的原始信号
2. 自动低通滤波应用截止频率=4kHz的低通滤波器,滤除>4kHz的高频同样应用截止频率=4kHz的低通滤波器,滤除>4kHz的高频符合8kHz采样率的奈奎斯特定理,避免混叠
3. 重采样将滤波后的信号重采样到8kHz同样重采样到8kHz统一采样率,适配模型输入
4. 输出结果返回8kHz的单声道音频wav返回8kHz的单声道音频wav供后续窗口分割和模型训练

简单说:librosa已经帮你封装了“低通滤波”这一步,你通过sr=self.sample_rate触发了这个逻辑,因此你的代码是符合下采样规范的。

四、补充:如果换工具(如soundfile+scipy),需要手动加低通滤波吗?

如果未来你不用librosa,改用soundfile读取原始音频,再用scipy.signal.resample重采样,就必须手动添加低通滤波——因为scipyresample不自动做抗混叠滤波,需要你显式调用scipy.signal.butter设计低通滤波器。

手动实现的示例代码(供你参考,当前代码无需修改):

import soundfile as sf
from scipy.signal import butter, lfilterdef butter_lowpass(cutoff, fs, order=5):"""设计低通滤波器"""nyq = 0.5 * fs  # 奈奎斯特频率normal_cutoff = cutoff / nyqb, a = butter(order, normal_cutoff, btype='low', analog=False)return b, adef lowpass_filter(data, cutoff, fs, order=5):"""应用低通滤波"""b, a = butter_lowpass(cutoff, fs, order=order)filtered_data = lfilter(b, a, data)return filtered_data# 手动流程:读取→低通滤波→重采样
wav, sr = sf.read(file_path)  # 读取原始采样率(如44kHz)
cutoff = 4000  # 截止频率=4kHz(目标采样率8kHz的1/2)
filtered_wav = lowpass_filter(wav, cutoff, sr)  # 手动低通滤波
# 再用scipy重采样到8kHz...

总结

  1. 你的代码已经通过librosa.loadsr参数,自动完成了低通滤波,无需额外修改;
  2. 低通滤波的核心目的是避免“混叠”,保护疾病分类依赖的200Hz~4kHz核心频段;
  3. 若未来更换音频处理工具,需注意:是否需要手动添加低通滤波(librosa自动做,scipy等工具需手动做)。

你的当前流程完全符合音频下采样的规范,可以放心使用。

我们用“卡车过隧道”的生活类比,结合音频频率的本质,把“先滤波再下采样”讲明白——全程不用复杂公式,只看逻辑。

第一步:先搞懂2个基础概念(像认识“卡车”和“隧道”)

音频的本质是“振动”,不同频率对应“不同振动速度”:

  • 比如你关心的“疾病相关信号”(基频、共振峰)是慢振动(200Hz~4kHz),像“矮卡车”(高度低,容易通过隧道);
  • 音频里还有很多快振动(比如44kHz音频里的10kHz、20kHz信号),是“高卡车”(高度高,难通过窄隧道),这些快振动对疾病分类基本没用,还可能添乱。

而“采样率”就是你给音频信号搭的“隧道高度”:

  • 采样率=8kHz,意味着隧道最高只能让“4kHz以下的矮卡车”通过(因为采样率的1/2叫“奈奎斯特频率”,是隧道的“最大限高”);
  • 采样率=16kHz,隧道限高就是8kHz;采样率=44kHz,隧道限高就是22kHz。

第二步:不先滤波的问题——“高卡车硬闯隧道,压成假矮卡车”

你想把44kHz/16kHz的音频“下采样”到8kHz,本质是把“宽隧道(限高22kHz/8kHz)”换成“窄隧道(限高4kHz)”。

如果不先滤波,直接换隧道会发生什么?
→ 原来宽隧道里的“高卡车”(比如44kHz里的5kHz、10kHz信号),现在过不了窄隧道(限高4kHz),但它们不会凭空消失,反而会被“压成假的矮卡车”——这就是“混叠”。

举个具体例子:

  • 44kHz音频里有个“5kHz的高卡车”(对疾病分类没用的高频噪声);
  • 你不滤波直接下采样到8kHz(隧道限高4kHz),这个5kHz的高卡车会被“压成3kHz的假矮卡车”(计算方式:8kHz - 5kHz = 3kHz);
  • 而3kHz刚好是你需要的“真矮卡车”(疾病相关的共振峰信号)——现在假的3kHz和真的3kHz混在一起,模型根本分不清哪个是有用的疾病特征,哪个是被压出来的垃圾信号,分类精度肯定会崩。

第三步:先滤波的作用——“提前拦住高卡车,只让矮卡车过”

滤波就像在“换窄隧道前”加一个“限高杆”:

  • 你要换的隧道限高4kHz(采样率8kHz),就先立一个“4kHz的限高杆”;
  • 所有超过4kHz的“高卡车”(没用的高频信号)都会被限高杆拦住,不让它们进后面的窄隧道;
  • 最后只有200Hz~4kHz的“真矮卡车”(有用的疾病信号)能进入窄隧道,下采样后得到的音频里全是干净的有用信号,没有假信号捣乱。

第四步:结合你的代码——librosa帮你自动立了“限高杆”

你用librosa.load(sr=8000)时,librosa其实悄悄帮你做了两件事:

  1. 先立“4kHz的限高杆”(低通滤波):把原始音频里超过4kHz的高频信号全滤掉;
  2. 再让剩下的“矮卡车”过窄隧道(下采样到8kHz)。

所以你的代码没问题,但你之前不知道“限高杆”是librosa自动加的——这就是为什么不用手动写滤波,结果却没问题的原因。

最后总结:一句话说清逻辑

下采样前滤波,就像“坐高铁前先安检”——提前把“危险品(没用的高频信号)”拦下来,避免它们混进车厢(有用信号)里搞破坏,保证最终的音频信号全是对模型有用的“干货”。

你说的“采样率是真实频率的两倍”,本质是奈奎斯特采样定理(Nyquist Sampling Theorem) ——这是音频、通信等所有“离散采样”领域的“底层规则”,核心作用是帮我们确定:至少需要多高的采样率,才能完整还原原始的连续信号(比如音频)

咱们不用公式,用“记录钟摆摆动”的生活场景,把这个原理拆透:

第一步:先理解“采样”的本质——给连续信号“拍快照”

音频信号是“连续的”:比如你说话时,空气振动是一刻不停的,对应的音频波形是一条平滑的、没有断点的曲线(像钟摆从左到右、再从右到左的连续摆动)。

而“采样”就是给这条连续曲线“拍快照”:每隔固定时间(比如1/8000秒),记录一次曲线的“高度”(信号强度),把连续的曲线变成一串离散的“点”(采样点)。

问题来了:拍多少张快照,才能通过这些“点”,还原出钟摆(或音频)原本的摆动规律?

第二步:为什么需要“两倍”——少了就会“认错摆动方向”

奈奎斯特定理的核心结论是:要完整还原一个“最高频率为f”的连续信号,采样率(每秒拍快照的次数)必须≥2f

用“钟摆摆动”类比最直观:
假设钟摆的“摆动频率”是1Hz——意思是每秒完成1次“左→右→左”的完整摆动(对应音频里“1Hz的低频信号”)。

  • 如果你每秒拍2张快照(采样率=2Hz):
    第0秒(钟摆在最左端)→ 第0.5秒(钟摆在最右端)→ 第1秒(钟摆回到最左端)。
    这3个点能清晰看出:钟摆是“左→右→左”摆动,周期1秒,规律完全正确。

  • 如果你每秒只拍1张快照(采样率=1Hz):
    假设你刚好每次都拍在“钟摆最左端”(第0秒、第1秒、第2秒)——你会误以为“钟摆没动”;
    哪怕拍在“中间位置”(第0秒在中间、第1秒也在中间)——你会误以为“钟摆是上下动,不是左右动”。
    本质是:1次快照没法捕捉“摆动方向”和“完整周期”,会把“连续摆动”错判成“静止或乱晃”。

  • 如果你每秒拍3张快照(采样率=3Hz):
    会拍到“左→中→右→中→左”,比2张更细致,但核心规律和2张一致——多余的快照只是“增加数据量”,不会提升“还原精度”。

第三步:回到音频——“两倍”是为了不认错“声音的振动规律”

音频的“频率”对应“声音的振动快慢”:比如4kHz的音频,意思是空气每秒振动4000次(像钟摆每秒摆4000次)。

要还原这个4kHz的音频:

  • 采样率必须≥2×4kHz=8kHz——这样每秒能拍≥8000次“快照”,刚好能捕捉到“每一次振动的波峰和波谷”(像钟摆的左端和右端),完整还原振动规律。
  • 如果采样率<8kHz(比如6kHz):每秒只能拍6000次快照,没法捕捉4kHz振动的“完整波峰波谷”,会把“4kHz的高频振动”错判成“更低频率的振动”(比如错当成2kHz)——这就是之前说的“混叠”,相当于把“快速摆的钟摆”看成“慢速摆的钟摆”,完全认错了规律。

第四步:关键误区澄清——不是“采样率必须刚好两倍”,而是“≥两倍”

奈奎斯特定理说的是“最小值”:

  • 如果你要还原的音频里,最高频率是4kHz(比如你关心的疾病相关信号),那么采样率≥8kHz就行(8kHz、10kHz、16kHz都可以)。
  • 但采样率越高,数据量越大(比如16kHz采样率的音频,数据量是8kHz的2倍),计算量也越大——所以对你的任务来说,8kHz是“刚好够用且最省资源”的选择:既覆盖了4kHz以下的所有有用信号,又避免了数据冗余。

总结:“采样率≥2×真实最高频率”的本质

是为了通过“离散快照”,完整还原“连续信号的振动规律”——少了就会“认错振动方向/周期”(混叠),多了就会“浪费存储和计算资源”。对你的音频疾病分类任务来说,8kHz采样率(对应4kHz限高杆),就是“刚好能还原有用信号、又最省资源”的最优解。

对!你的理解完全抓准了核心——更准确地说,是“人声中与疾病分类相关的核心特征(基频、共振峰)都在4kHz以内,所以用8kHz采样刚好能完整捕捉这些特征,还不浪费资源”。

再补充两个细节帮你彻底落地:

  1. 不是“所有人声频率都≤4kHz”——人声里确实有少量4~8kHz的高频成分(比如“s”“sh”这类摩擦音的细节),但这些成分对“判断是否有帕金森等疾病”几乎没用,反而会增加数据量;
  2. 8kHz采样的“刚刚好”体现在两点:
    • 物理上:8kHz≥2×4kHz,符合奈奎斯特定理,能完整还原4kHz以内的核心特征,不会出现混叠;
    • 效率上:比16kHz/44kHz采样的数据量少一半甚至更多,模型训练时内存和计算压力都会小很多,还不影响分类精度。

简单说:8kHz采样是“刚好能抓住有用的疾病特征,又不多带没用的‘包袱’”,对你的任务来说是性价比最高的选择~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95235.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95235.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95235.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习系列 | Seq2Seq端到端翻译模型

一、通俗总结Seq2Seq 就像一个 “序列转换器”&#xff1a;先把输入的一段话 “压缩成一个核心意思”&#xff0c;再根据这个意思 “一句句生成另一段话”&#xff0c;能搞定翻译、听写这类 “输入输出不一样长” 的任务&#xff0c;但太长的内容可能记不全&#xff0c;还容易越…

Spring MVC BOOT 中体现的设计模式

Spring:创建型:单例模式:Bean默认就是单例的&#xff0c;是饿汉模式的&#xff0c;但是可以通过Lazy设置为懒汉工厂模式&#xff1a;可自定义FactroyBean&#xff0c;实现Bean自己的生产工厂结构型:代理模式&#xff1a;AOP就是典型的动态代理&#xff0c;有jdk和cglib两种实现…

Chrome浏览器调用ActiveX控件之allWebOffice在线编辑控件

背景 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用&#xff08;阅读、编辑、保存等&#xff09;&#xff0c;支持编辑文档时保留修改痕迹&#xff0c;支持书签位置内容动态填充&#xff0c;支持公文套红&#xff0c;支持文档保护控制等诸多办公功能&#xff0c;本…

嵌入式 - 硬件:51单片机

本节重点1. MCU、CPU、GPU、NPU、SOC、MPU、FPU2. 内存、外存的区别3. RAM和ROM的区别&#xff0c;单片机RAM大小4. 三大总线及其特点5. 发光二极管分类及其特点6. 数码管显示原理一、嵌入式以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可裁剪的专用计算机系…

Java Spring Boot 中 Redis 缓存穿透问题排查与解决方案

前言 作为一名普通的 Java 程序开发者&#xff0c;日常开发中难免会遇到一些看似简单但实际排查起来非常棘手的问题。在最近的一个项目中&#xff0c;我遇到了一个 Redis 缓存穿透的问题&#xff0c;导致系统在高并发下性能急剧下降&#xff0c;甚至出现服务响应超时的情况。这…

Ubuntu下配置并远程连接MySQL

1、安装mysql-serverapt update apt install mysql-server2、修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnfbind-address 0.0.0.0 mysqlx-bind-address 0.0.0.03、启动并设置服务为开机自启动systemctl enable mysql.service --now4、查看服务状态systemct…

开源 C++ QT Widget 开发(九)图表--仪表盘

文章的目的为了记录使用C 进行QT Widget 开发学习的经历。临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 C QT Widget 开发&#xff08;一&#xff09;工程文件结构-CSDN博客 开源…

怎么为服务器设置或重置服务器密码?

创建服务器后&#xff0c;您可以设置服务器的登录密码&#xff0c;如果你忘记了密码&#xff0c;可以重新设置实例的密码。本文讲一下如何重置阿里云服务器密码。使用限制&#xff1a;离线重置密码仅支持在控制台设置或重置服务器管理员账号的密码。•Windows 实例的默认用户名…

【线性代数入门 | 那忘算8】洛谷P3389 高斯消元(内附行列式教学)

想了想还是单开了一篇&#xff0c;数学王子值得&#xff01; 专栏指路&#xff1a;《再来一遍一定记住的算法&#xff08;那些你可能忘记了的算法&#xff09;》 前置知识&#xff1a; 矩阵&#xff1a;数的集合&#xff0c;一般是方程的系数。 题面&#xff1a; 洛谷P3389 …

GEM5学习(3):如何快速创建一个组件

通过一个图并行计算的测试用例&#xff0c;来学习如何快速构建一个目标组件 其核心思想是通过继承现有组件再拓展自定义参数 创建脚本 如何创建脚本&#xff0c;具体还可以看官方说明&#xff1a;gem5: Adding cache to configuration script mkdir configs/tutorial/part1/…

数据血缘中的图数据库如何选择

Neo4j 和 ArangoDB 都是非常优秀的图数据库&#xff0c;但它们的设计哲学、核心架构和适用场景有显著的区别。 简单来说&#xff0c;核心区别在于&#xff1a; Neo4j 是原生图数据库&#xff0c;专为处理图数据和图查询而设计和优化。ArangoDB 是多模型数据库&#xff0c;同时支…

第27章学习笔记|学无止境:从“会用命令”到“会做工具”的进阶路线

第27章学习笔记|学无止境:从“会用命令”到“会做工具”的进阶路线 你已经能用 PowerShell 解决很多日常问题了。接下来最重要的,就是把零散命令升级为可复用的工具,并在真实场景中不断打磨。 一、为什么下一步是“工具化(Toolmaking)” 当任务开始“重复、多人用、可移…

C++编程语言:标准库:第37章——正则表达式(Bjarne Stroustrup)

第 37章 正则表达式(Regular Expressions) 目录 37.1 正则表达式(规范表达式)(Regular Expressions) 37.1.1 正则表达式相关符号(Regular Express Notation) 37.2 regex 37.2.1 匹配结果(Match Results) 37.2.2 格式化(Formatting) 37.3 正则表达式函数 37.3.1 …

sciml包scixgboost函数发布,轻松完成机器学习xgboost分析

Xgboost是Boosting算法的其中一种&#xff0c;Boosting算法的思想是将许多弱分类器集成在一起&#xff0c;形成一个强分类器。因为Xgboost是一种提升树模型&#xff0c;所以它是将许多树模型集成在一起&#xff0c;形成一个很强的分类器。 我目前整合了多个R包&#xff0c;编写…

Ubuntu中配置JMmeter工具

1、检查是否已安装Java 环境java -version若未安装&#xff0c;执行以下命令安装 OpenJDKsudo apt update sudo apt install openjdk-11-jdk # 或 openjdk-17-jdk2、用wget直接下载JMeter压缩包wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz将下载的…

LeetCode 925.长按键入

你的朋友正在使用键盘输入他的名字 name。偶尔&#xff0c;在键入字符 c 时&#xff0c;按键可能会被长按&#xff0c;而字符可能被输入 1 次或多次。 你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字&#xff08;其中一些字符可能被长按&#xff09;&#…

9.3 模拟

lc190 颠倒二进制ret (ret << 1) (n >> i & 1);class Solution { public:uint32_t reverseBits(uint32_t n) {uint32_t ret 0;for (int i 0; i < 32; i)ret (ret << 1) (n >> i & 1);return ret;} };lc14 flag checkclass Solution {…

esp32小智ai对话机器人

ESP-IDF 环境搭建与问题解决 下载与安装 ESP-IDF 官方下载地址&#xff1a;https://dl.espressif.com/dl/esp-idf建议使用稳定版本&#xff0c;避免开发版可能存在的兼容性问题 中文编码问题解决方案 $env:PYTHONIOENCODING "utf-8" $env:PYTHONUTF8 "1&q…

11.类与对象

目录 1. 创建类与对象示例 1.1 __init__ 初始化器: 1.2 __new__构造器 1.3 什么时候需要重写 __new__? 1.4 init和new对比 2. 属性 2.1 实例属性 2.2 类属性 3. 作用域命名约定 3.1 非公共属性 3.2 公共属性 3.3 名称修饰 3.4 一眼看懂三种“可见性” 4. 方法 …

【js】Promise.try VS try-catch

前言JavaScript 正为 Promise 添加一个新的方法&#xff0c;使得处理异步函数更加清晰和安全。Promise.try 允许将任何函数包装在 Promise 中&#xff0c;无论它是否异步。使用 Promise.try 可避免传统 try/catch 结构与 Promise 链的混合使用&#xff0c;代码更简洁。try-catc…