循环神经网络(RNN)详解

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:深度学习分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:循环神经网络(RNN)详解

文章目录

    • 引言
    • RNN的基本原理
      • 1. 序列数据的特性
      • 2. 信息流动机制
      • 3. 反向传播算法
    • RNN的结构
      • 1. 基本RNN结构
        • 1.1 输入层
        • 1.2 隐藏层
        • 1.3 输出层
      • 2. 多层RNN
        • 2.1 多层RNN的结构
      • 3. 长短期记忆网络(LSTM)
        • 3.1 LSTM的结构
      • 4. 门控循环单元(GRU)
        • 4.1 GRU的结构
    • RNN的优缺点
      • 优点
      • 缺点
    • RNN的应用场景
      • 1. 自然语言处理(NLP)
        • 1.1 语言模型
        • 1.2 机器翻译
      • 2. 时间序列预测
      • 3. 语音识别
    • 总结

引言

  在当今数据驱动的时代,深度学习已经成为解决复杂问题的重要工具。特别是在处理序列数据时,循环神经网络(Recurrent Neural Networks, RNN)展现出了其独特的优势。与传统的前馈神经网络不同,RNN能够通过其内部的循环结构,有效地捕捉时间序列中的依赖关系。这使得RNN在自然语言处理、语音识别、视频分析等领域得到了广泛应用。

  随着数据量的激增和计算能力的提升,RNN的研究和应用也不断深入。尽管RNN在处理短期依赖关系方面表现出色,但在面对长序列时却常常遭遇梯度消失和梯度爆炸的问题。为了解决这些挑战,长短期记忆网络(LSTM)和门控循环单元(GRU)等变种应运而生,进一步提升了RNN的性能。

  本文将深入探讨RNN的基本原理、结构、优缺点以及其在实际应用中的表现,旨在为读者提供一个全面的理解,帮助他们在实际项目中更好地应用这一强大的工具。

RNN的基本原理

  循环神经网络(RNN)是一种专门用于处理序列数据的神经网络架构。其设计理念是通过循环连接的方式,使得网络能够在时间维度上保持信息的传递和记忆。以下将详细阐述RNN的基本原理,包括其结构、信息流动机制以及如何处理序列数据。

1. 序列数据的特性

  序列数据是指数据点按时间顺序排列的一组数据,例如文本、音频、视频和时间序列等。在这些数据中,当前时刻的信息往往与之前的时刻密切相关。因此,处理序列数据的模型需要能够捕捉这种时间依赖性。

2. 信息流动机制

  RNN的循环结构使得信息能够在时间步之间流动。具体来说,当前时刻的隐藏状态 h t h_t ht 是通过结合当前输入 x t x_t xt 和前一个隐藏状态 h t − 1 h_{t-1} ht1 计算得出的。这种信息流动机制使得RNN能够有效地捕捉序列中的上下文信息。

3. 反向传播算法

  为了训练RNN,通常使用反向传播算法(Backpropagation Through Time, BPTT)。该算法通过展开RNN的时间维度,将其视为一个前馈神经网络,从而计算损失函数相对于权重的梯度。具体步骤如下:

  1. 前向传播:计算每个时间步的隐藏状态和输出。
  2. 计算损失:根据预测输出和真实标签计算损失。
  3. 反向传播:从最后一个时间步开始,逐步计算每个时间步的梯度,并更新权重。

RNN的结构

  循环神经网络(RNN)的结构设计旨在处理序列数据,通过其独特的循环连接机制,RNN能够在时间维度上保持信息的传递和记忆。以下将详细阐述RNN的基本结构、变种结构以及它们的特点和应用。

1. 基本RNN结构

  基本的RNN结构由输入层、隐藏层和输出层组成。其核心在于隐藏层的循环连接,使得当前时刻的隐藏状态不仅依赖于当前输入,还依赖于前一个时刻的隐藏状态。

1.1 输入层

输入层负责接收序列数据。对于一个输入序列 X = ( x 1 , x 2 , … , x T ) X = (x_1, x_2, \ldots, x_T) X=(x1,x2,,xT),每个输入 x t x_t xt 可以是一个向量,表示在时间步 t t t 的特征。

1.2 隐藏层

隐藏层是RNN的核心部分。每个时间步的隐藏状态 h t h_t ht 的更新公式为:

h t = f ( W h h t − 1 + W x x t + b ) h_t = f(W_h h_{t-1} + W_x x_t + b) ht=f(Whht1+Wxxt+b)

  • W h W_h Wh 是隐藏状态之间的权重矩阵。
  • W x W_x Wx 是输入与隐藏状态之间的权重矩阵。
  • b b b 是偏置项。
  • f f f 是激活函数,通常使用tanh或ReLU。

这种结构使得RNN能够在每个时间步上保留之前的信息,从而形成一个动态的记忆机制。

1.3 输出层

输出层负责生成模型的最终输出。输出 y t y_t yt 通常是通过当前的隐藏状态 h t h_t ht 计算得出的:

y t = W y h t + b y y_t = W_y h_t + b_y yt=Wyht+by

  • W y W_y Wy 是输出层的权重矩阵。
  • b y b_y by 是输出层的偏置项。

2. 多层RNN

  为了提高模型的表达能力,RNN可以堆叠多个隐藏层,形成多层RNN(也称为深度RNN)。在多层RNN中,上一层的输出作为下一层的输入,从而使得模型能够学习更复杂的特征表示。

2.1 多层RNN的结构

在多层RNN中,假设有 L L L 层隐藏层,层 l l l 的隐藏状态 h t ( l ) h_t^{(l)} ht(l) 的更新公式为:

h t ( l ) = f ( W h ( l ) h t ( l − 1 ) + W x ( l ) x t + b ( l ) ) h_t^{(l)} = f(W_h^{(l)} h_t^{(l-1)} + W_x^{(l)} x_t + b^{(l)}) ht(l)=f(Wh(l)ht(l1)+Wx(l)xt+b(l))

其中, h t ( 0 ) h_t^{(0)} ht(0) 通常被定义为输入 x t x_t xt。通过这种方式,多层RNN能够捕捉到更高层次的特征。

3. 长短期记忆网络(LSTM)

  由于基本RNN在处理长序列时容易出现梯度消失和梯度爆炸的问题,长短期记忆网络(LSTM)应运而生。LSTM通过引入门控机制来控制信息的流动,从而有效地捕捉长距离依赖关系。

3.1 LSTM的结构

LSTM的基本单元包括三个主要的门:输入门、遗忘门和输出门。

  • 输入门:控制当前输入信息的多少被写入到单元状态中。
  • 遗忘门:控制之前的单元状态中信息的多少被遗忘。
  • 输出门:控制当前单元状态的多少被输出到隐藏状态。

LSTM的单元状态 C t C_t Ct 和隐藏状态 h t h_t ht 的更新公式为:

i t = σ ( W i x t + U i h t − 1 + b i ) (输入门) i_t = \sigma(W_i x_t + U_i h_{t-1} + b_i) \quad \text{(输入门)} it=σ(Wixt+Uiht1+bi)(输入门)

f t = σ ( W f x t + U f h t − 1 + b f ) (遗忘门) f_t = \sigma(W_f x_t + U_f h_{t-1} + b_f) \quad \text{(遗忘门)} ft=σ(Wfxt+Ufht1+bf)(遗忘门)

C ~ t = tanh ⁡ ( W C x t + U C h t − 1 + b C ) (候选状态) \tilde{C}_t = \tanh(W_C x_t + U_C h_{t-1} + b_C) \quad \text{(候选状态)} C~t=tanh(WCxt+UCht1+bC)(候选状态)

C t = f t ⊙ C t − 1 + i t ⊙ C ~ t (单元状态) C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t \quad \text{(单元状态)} Ct=ftCt1+itC~t(单元状态)

o t = σ ( W o x t + U o h t − 1 + b o ) (输出门) o_t = \sigma(W_o x_t + U_o h_{t-1} + b_o) \quad \text{(输出门)} ot=σ(Woxt+Uoht1+bo)(输出门)

h t = o t ⊙ tanh ⁡ ( C t ) (隐藏状态) h_t = o_t \odot \tanh(C_t) \quad \text{(隐藏状态)} ht=ottanh(Ct)(隐藏状态)

4. 门控循环单元(GRU)

  门控循环单元(GRU)是LSTM的一种简化版本,它通过合并输入门和遗忘门来减少模型的复杂性。

4.1 GRU的结构

GRU的基本单元包括两个主要的门:重置门和更新门。

  • 重置门:控制如何结合新输入与过去的记忆。
  • 更新门:控制当前单元状态的更新程度。

GRU的更新公式为:

z t = σ ( W z x t + U z h t − 1 + b z ) (更新门) z_t = \sigma(W_z x_t + U_z h_{t-1} + b_z) \quad \text{(更新门)} zt=σ(Wzxt+Uzht1+bz)(更新门)

r t = σ ( W r x t + U r h t − 1 + b r ) (重置门) r_t = \sigma(W_r x_t + U_r h_{t-1} + b_r) \quad \text{(重置门)} rt=σ(Wrxt+Urht1+br)(重置门)

h ~ t = tanh ⁡ ( W h x t + U h ( r t ⊙ h t − 1 ) + b h ) (候选状态) \tilde{h}_t = \tanh(W_h x_t + U_h (r_t \odot h_{t-1}) + b_h) \quad \text{(候选状态)} h~t=tanh(Whxt+Uh(rtht1)+bh)(候选状态)

h t = ( 1 − z t ) ⊙ h t − 1 + z t ⊙ h ~ t (隐藏状态) h_t = (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t \quad \text{(隐藏状态)} ht=(1zt)ht1+zth~t(隐藏状态)

RNN的优缺点

  循环神经网络(RNN)在处理序列数据方面具有独特的优势,但同时也面临一些挑战。以下将详细阐述RNN的优点和缺点,以帮助理解其在实际应用中的适用性。

优点

  1. 序列数据处理能力
    RNN的设计使其能够处理任意长度的序列数据。与传统的前馈神经网络不同,RNN能够通过其循环结构,保持对先前输入的记忆。这使得RNN在自然语言处理、时间序列分析和语音识别等任务中表现出色。

  2. 上下文捕捉
    RNN能够有效地捕捉序列中的上下文信息。通过循环连接,当前时刻的隐藏状态不仅依赖于当前输入,还依赖于之前的状态。这种机制使得RNN能够理解和生成具有上下文依赖性的序列,如文本生成和机器翻译。

  3. 动态输入长度
    RNN能够处理变长的输入序列,这在许多实际应用中非常重要。例如,在自然语言处理中,句子的长度可能会有所不同,RNN能够灵活地适应这些变化,而不需要固定的输入大小。

  4. 共享参数
    RNN在时间维度上共享参数,这意味着同一组权重在每个时间步都被使用。这种参数共享不仅减少了模型的复杂性,还降低了训练所需的计算资源。

  5. 适应性强
    RNN可以与其他网络结构结合使用,例如卷积神经网络(CNN),以处理更复杂的任务。这种灵活性使得RNN在多种应用场景中都能发挥作用。

缺点

  1. 梯度消失与梯度爆炸
    RNN在处理长序列时,常常面临梯度消失和梯度爆炸的问题。在反向传播过程中,梯度可能会迅速减小(消失)或增大(爆炸),导致模型无法有效学习长距离依赖关系。这是RNN在训练时的一个主要挑战。

  2. 训练时间长
    由于RNN的序列依赖性,训练时间通常较长。每个时间步的计算都依赖于前一个时间步的结果,这使得并行化训练变得困难,从而增加了训练时间。

  3. 难以捕捉长距离依赖
    尽管RNN能够捕捉上下文信息,但在处理长距离依赖时,基本RNN的性能往往不理想。长短期记忆网络(LSTM)和门控循环单元(GRU)等变种虽然有所改善,但仍然存在一定的局限性。

  4. 模型复杂性
    RNN的结构相对复杂,尤其是当使用LSTM或GRU等变种时。这种复杂性可能导致模型的可解释性降低,使得调试和优化变得更加困难。

  5. 对长序列的记忆能力有限
    尽管RNN能够在一定程度上捕捉长序列中的信息,但其记忆能力仍然有限。对于非常长的序列,RNN可能无法有效地保留早期输入的信息,导致性能下降。

RNN的应用场景

  循环神经网络(RNN)因其在处理序列数据方面的优势,广泛应用于多个领域。以下将结合具体的项目代码,详细阐述RNN的应用场景,包括自然语言处理、时间序列预测和语音识别等。

1. 自然语言处理(NLP)

1.1 语言模型

  RNN在自然语言处理中的一个重要应用是语言模型。语言模型的目标是预测给定上下文的下一个单词。以下是一个使用RNN构建简单语言模型的示例代码。

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, SimpleRNN, Dense

# 假设我们有一个简单的词汇表
vocab_size = 1000  # 词汇表大小
embedding_dim = 64  # 嵌入维度
hidden_units = 128  # 隐藏层单元数
sequence_length = 10  # 输入序列长度

# 创建模型
model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=sequence_length))
model.add(SimpleRNN(hidden_units, return_sequences=False))
model.add(Dense(vocab_size, activation='softmax'))

# 编译模型
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 假设我们有训练数据X和标签y
# X.shape = (num_samples, sequence_length)
# y.shape = (num_samples,)
# model.fit(X, y, epochs=10, batch_size=32)

  在这个示例中,我们使用了一个简单的RNN模型来预测下一个单词。模型首先通过嵌入层将输入的单词索引转换为向量,然后通过RNN层处理序列数据,最后通过全连接层输出预测的单词概率分布。

1.2 机器翻译

  RNN也广泛应用于机器翻译任务。通常使用编码器-解码器架构,其中编码器将输入序列编码为上下文向量,解码器根据上下文向量生成目标序列。

from tensorflow.keras.layers import LSTM, RepeatVector, TimeDistributed

# 编码器
encoder_input = tf.keras.Input(shape=(None, vocab_size))
encoder_lstm = LSTM(hidden_units, return_state=True)
encoder_output, state_h, state_c = encoder_lstm(encoder_input)

# 解码器
decoder_input = tf.keras.Input(shape=(None, vocab_size))
decoder_lstm = LSTM(hidden_units, return_sequences=True)
decoder_output = decoder_lstm(decoder_input, initial_state=[state_h, state_c])
decoder_output = TimeDistributed(Dense(vocab_size, activation='softmax'))(decoder_output)

# 创建模型
model = tf.keras.Model([encoder_input, decoder_input], decoder_output)
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 假设我们有训练数据encoder_input_data, decoder_input_data, decoder_target_data
# model.fit([encoder_input_data, decoder_input_data], decoder_target_data, epochs=10, batch_size=32)

  在这个机器翻译示例中,编码器和解码器都是LSTM结构,能够有效捕捉长距离依赖关系。

2. 时间序列预测

  RNN在时间序列预测中也表现出色,特别是在金融市场、气象预测等领域。以下是一个使用RNN进行时间序列预测的示例代码。

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

# 假设我们有一个时间序列数据集
data = pd.read_csv('time_series_data.csv')
values = data['value'].values.reshape(-1, 1)

# 归一化数据
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_values = scaler.fit_transform(values)

# 创建训练数据
def create_dataset(data, time_step=1):
    X, y = [], []
    for i in range(len(data) - time_step - 1):
        X.append(data[i:(i + time_step), 0])
        y.append(data[i + time_step, 0])
    return np.array(X), np.array(y)

time_step = 10
X, y = create_dataset(scaled_values, time_step)
X = X.reshape(X.shape[0], X.shape[1], 1)  # 形状调整为 [样本数, 时间步, 特征数]

# 创建RNN模型
model = Sequential()
model.add(SimpleRNN(50, input_shape=(time_step, 1)))
model.add(Dense(1))

# 编译模型
model.compile(loss='mean_squared_error', optimizer='adam')

# 训练模型
model.fit(X, y, epochs=100, batch_size=32)

  在这个时间序列预测示例中,我们首先对数据进行归一化处理,然后创建训练数据集。接着,我们构建了一个简单的RNN模型来预测未来的值。

3. 语音识别

  RNN在语音识别任务中也得到了广泛应用,尤其是在处理连续语音信号时。以下是一个使用RNN进行语音识别的示例代码。

from tensorflow.keras.layers import GRU

# 假设我们有音频特征数据
audio_features = np.random.rand(1000, 20, 13)  # 1000个样本,20个时间步,13个特征
labels = np.random.randint(0, vocab_size, size=(1000,))  # 1000个标签

# 创建GRU模型
model = Sequential()
model.add(GRU(128, input_shape=(20, 13)))
model.add(Dense(vocab_size, activation='softmax'))

# 编译模型
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 训练模型
model.fit(audio_features, labels, epochs=10, batch_size=32)

  在这个语音识别示例中,我们使用GRU结构来处理音频特征数据,并生成对应的标签。

总结

  循环神经网络(RNN)作为深度学习领域的重要模型,凭借其独特的结构和处理序列数据的能力,在自然语言处理、时间序列预测和语音识别等多个领域展现了强大的应用潜力。尽管RNN在捕捉时间依赖性方面具有显著优势,但其在处理长序列时面临梯度消失和训练时间长等挑战。为了解决这些问题,研究者们提出了多种变种和改进,如长短期记忆网络(LSTM)、门控循环单元(GRU)以及双向RNN和注意力机制等。这些改进不仅提高了模型的性能,还扩展了RNN在复杂任务中的应用范围。随着技术的不断进步,RNN及其变种将继续在深度学习的研究和实践中发挥重要作用,为解决更具挑战性的序列数据问题提供有效的解决方案。理解RNN的基本原理、优缺点及其变种,对于研究者和工程师在实际应用中选择合适的模型至关重要。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/925962.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】Nacos

一、安装 1、官网地址:https://nacos.io/download/nacos-server/ 2、启动:找到bin目录下的startup.cmd双击启动,或者打开一个命令窗口输入: startup.cmd -m standalone双击启动后如下:可以访问控制台地址 访问后的…

混沌工程/混沌测试/云原生测试/云平台测试

背景 私有云/公有云/混合云等具有复杂,分布式,环境多样性等特点,许多特殊场景引发的线上问题很难被有效发现。所以需要引入混沌工程,建立对系统抵御生产环境中失控条件的能力以及信心,提高系统面对未知风险得能力。 …

DM-VIO(ROS)+t265配置运行记录(ubuntu18.04+ros melodic)

在工作中需要对DM-VIO算法进行测试,于是配置并记录了一下: 首先运行ros接口的dm-vio,一定要先配置源码 https://github.com/lukasvst/dm-vio在这个网址把源码下载下来并解压,并安装一下依赖: sudo apt-get install …

自动化运维(k8s)之微服务信息自动抓取:namespaceName、deploymentName等全解析

前言:公司云原生k8s二开工程师发了一串通用性命令用来查询以下数值,我想着能不能将这命令写成一个自动化脚本。 起初设计的 版本一:开头加一条环境变量,执行脚本后,提示输入:需要查询的命名空间&#xff0c…

【数据分析】布朗运动(维纳过程)

文章目录 一、概述二、数学布朗运动2.1 数学定义2.2 布朗运动的数学模型2.21 标准布朗运动2.22 布朗运动的路径2.23 布朗运动的方程 三、布朗运动在金融学中的应用四、数学构造(以傅里叶级数为例)4.1 傅里叶级数的基本思想4.2 构造布朗运动 一、概述 布…

Mybatis Plus 增删改查方法(一、增)

先定义一个简单的测试表,执行脚本如下: create table user(id bigint primary key auto_increment,name varchar(255) not null,age int not null default 0 check (age > 0) ); 根据Spingbootmybatisplus的结构根据表自行构建结构,大致…

基于Matlab的图像去噪算法仿真(二)

在信息化的社会里,图像在信息传播中所起的作用越来越大。所以,消除在图像采集和传输过程中而产生的噪声,保证图像受污染度最小,成了数字图像处理领域里的重要部分。 本文主要研究分析邻域平均法、中值滤波法、维纳滤波法及模糊小…

鸿蒙Next星河版基础代码

目录: 1、鸿蒙箭头函数的写法2、鸿蒙数据类型的定义3、枚举的定义以及使用4、position绝对定位及层级zIndex5、字符串的拼接转换以及数据的处理(1)字符串转数字(2)数字转字符串(3)布尔值转换情况(4)数组的增删改查 6、三元表达式7、鸿蒙for循环的几种写法7.1、基本用…

Node.js的url模块与querystring模块

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战(第2版)(Web前端技术丛书)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 4.3.1 http模块——创建HTTP服务器、客户端 要使用http模块&#xff0…

Conda 管理python开发环境

同步发布于我的网站 🚀 故事起因: 在公司使用Requests多任务并行开发时遇到了问题,使用 ProcessPoolExecutor 时不能正常发出网络请求,会卡在网络请求发不出去,但是善于用 ThreadPoolExecutor 时是可以的,纠结了很久,一…

LLamafactory 批量推理与异步 API 调用效率对比实测

文章目录 背景数据集构造LLamafactory 批量推理yaml 参数设置批量推理启动 LLamafactory API 部署结论项目开源 背景 在阅读 LLamafactory 的文档时候,发现它支持批量推理: 推理.https://llamafactory.readthedocs.io/zh-cn/latest/getting_started/inference.html…

Android通过摄像头检测心率

话不多说,先看效果 Android通过摄像头测量心率 借鉴文章如下 Android通过摄像头计算心率、心率变异性 该文章的核心功能点已经很全了,为了方便使用,我这边整理成了工具类可直接使用 该功能全网文章还是比较少的,还是要感谢下借鉴…

测绘坐标数据封装处理

1、测绘数据 2、数据处理 public void dealData() {List<Map<String, Object>> shyqzdMapList 截图数据;Map<String, List<Map<String, Object>>> groupMap shyqzdMapList.stream().collect(Collectors.groupingBy(item -> String.valueOf…

一个开源轻量级的服务器资源监控平台,支持告警推送

大家好&#xff0c;今天给大家分享一款开源的轻量级服务器资源监控工具Beszel&#xff0c;提供历史数据记录、Docker容器统计信息监控以及多种警报功能&#xff0c;用于监控服务器资源。 项目介绍 Beszel由hub&#xff08;中心服务器端应用&#xff0c;基于PocketBase构建&…

SVG无功补偿装置MATLAB仿真模型

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 SVG&#xff08;又称ASVG 或STATCOM&#xff09;是Static Var Generator 的缩写&#xff0c;叫做静止无功发生器。也是做无功补偿的&#xff0c;比SVC 更加先进。其基本原理是将自换相桥式电路通过电抗器或…

el-cascader 使用笔记

1.效果 2.官网 https://element.eleme.cn/#/zh-CN/component/cascader 3.动态加载&#xff08;官网&#xff09; <el-cascader :props"props"></el-cascader><script>let id 0;export default {data() {return {props: {lazy: true,lazyLoad (…

CQ 社区版 2024.11 | 新增“审批人组”概念、可通过SQL模式自定义审计图表……

CloudQuery 社区 11 月新版本来啦&#xff01;本月版本依旧是 CUG&#xff08;CloudQuery 用户组&#xff09;尝鲜版的更新。 针对审计模块增加了 SQL 模式自定义审计图表&#xff1b;在流程模块引入了“审批人组”概念。此外&#xff0c;在 SQL 编辑器、连接管理等模块都涉及…

【论文阅读】 Learning to Upsample by Learning to Sample

论文结构目录 一、之前的上采样器二、DySample概述三、不同上采样器比较四、整体架构五、设计过程&#xff08;1&#xff09;初步设计&#xff08;2&#xff09;第一次修改&#xff08;3&#xff09;第二次修改&#xff08;4&#xff09;第三次修改 六、DySample四种变体七、复…

微积分复习笔记 Calculus Volume 2 - 3.1

The first 2 chapters of volume 2 are the same as those in volume 1. Started with Chapter 3. 3.1 Integration by Parts - Calculus Volume 2 | OpenStax

智能化图书馆导航系统方案之系统架构与核心功能设计

hello~这里是维小帮&#xff0c;点击文章最下方获取图书馆导航系统解决方案&#xff01;如有项目需求和技术交流欢迎大家私聊我们~撒花&#xff01; 针对传统图书馆在图书查找困难、座位紧张、空间导航不便方面的问题&#xff0c;本文深入剖析了基于高精度定位、3D建模、图书搜…