循环神经网络(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} ht−1 计算得出的。这种信息流动机制使得RNN能够有效地捕捉序列中的上下文信息。
3. 反向传播算法
为了训练RNN,通常使用反向传播算法(Backpropagation Through Time, BPTT)。该算法通过展开RNN的时间维度,将其视为一个前馈神经网络,从而计算损失函数相对于权重的梯度。具体步骤如下:
- 前向传播:计算每个时间步的隐藏状态和输出。
- 计算损失:根据预测输出和真实标签计算损失。
- 反向传播:从最后一个时间步开始,逐步计算每个时间步的梯度,并更新权重。
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(Whht−1+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(l−1)+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+Uiht−1+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+Ufht−1+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+UCht−1+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=ft⊙Ct−1+it⊙C~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+Uoht−1+bo)(输出门)
h t = o t ⊙ tanh ( C t ) (隐藏状态) h_t = o_t \odot \tanh(C_t) \quad \text{(隐藏状态)} ht=ot⊙tanh(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+Uzht−1+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+Urht−1+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(rt⊙ht−1)+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=(1−zt)⊙ht−1+zt⊙h~t(隐藏状态)
RNN的优缺点
循环神经网络(RNN)在处理序列数据方面具有独特的优势,但同时也面临一些挑战。以下将详细阐述RNN的优点和缺点,以帮助理解其在实际应用中的适用性。
优点
-
序列数据处理能力
RNN的设计使其能够处理任意长度的序列数据。与传统的前馈神经网络不同,RNN能够通过其循环结构,保持对先前输入的记忆。这使得RNN在自然语言处理、时间序列分析和语音识别等任务中表现出色。 -
上下文捕捉
RNN能够有效地捕捉序列中的上下文信息。通过循环连接,当前时刻的隐藏状态不仅依赖于当前输入,还依赖于之前的状态。这种机制使得RNN能够理解和生成具有上下文依赖性的序列,如文本生成和机器翻译。 -
动态输入长度
RNN能够处理变长的输入序列,这在许多实际应用中非常重要。例如,在自然语言处理中,句子的长度可能会有所不同,RNN能够灵活地适应这些变化,而不需要固定的输入大小。 -
共享参数
RNN在时间维度上共享参数,这意味着同一组权重在每个时间步都被使用。这种参数共享不仅减少了模型的复杂性,还降低了训练所需的计算资源。 -
适应性强
RNN可以与其他网络结构结合使用,例如卷积神经网络(CNN),以处理更复杂的任务。这种灵活性使得RNN在多种应用场景中都能发挥作用。
缺点
-
梯度消失与梯度爆炸
RNN在处理长序列时,常常面临梯度消失和梯度爆炸的问题。在反向传播过程中,梯度可能会迅速减小(消失)或增大(爆炸),导致模型无法有效学习长距离依赖关系。这是RNN在训练时的一个主要挑战。 -
训练时间长
由于RNN的序列依赖性,训练时间通常较长。每个时间步的计算都依赖于前一个时间步的结果,这使得并行化训练变得困难,从而增加了训练时间。 -
难以捕捉长距离依赖
尽管RNN能够捕捉上下文信息,但在处理长距离依赖时,基本RNN的性能往往不理想。长短期记忆网络(LSTM)和门控循环单元(GRU)等变种虽然有所改善,但仍然存在一定的局限性。 -
模型复杂性
RNN的结构相对复杂,尤其是当使用LSTM或GRU等变种时。这种复杂性可能导致模型的可解释性降低,使得调试和优化变得更加困难。 -
对长序列的记忆能力有限
尽管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知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。
相关文章:
循环神经网络(RNN)详解
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
vue基础之3:模板语法、数据绑定
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
Ubuntu通过脚本启动多个可执行文件
Ubuntu通过脚本启动多个可执行文件 在 Ubuntu 中,可以通过一个脚本启动多个可执行文件,同时支持顺序执行、并行执行或特定条件下的执行。以下是实现的详细方法: 1. 创建脚本文件 首先,创建一个脚本文件,例如 start_p…...
【C++】LeetCode:LCR 026. 重排链表
题干 LCR 026. 重排链表 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → … 不能只是单纯的改变节点内部的值,而是需要实…...
文档加密怎么做才安全?
公司的文档包含很多机密文件,这些文件不仅关乎公司的核心竞争力,还涉及到客户隐私、商业策略等敏感信息。因此,文档的保管和传递一直是我们工作的重中之重。 为了确保机密文件的安全,公司需要制定了一系列严格的保密措施。从文件的…...
CTF之WEB(php弱类型绕过)
PHP 的弱类型特性有时会导致意外的行为,特别是在类型比较时。这些特性可以被利用来绕过一些预期的安全检查。以下是一些常见的 PHP 弱类型绕过技巧及其解释: 类型介绍 1. 类型比较 ( vs ) 在 PHP 中, 是松散比较,而 是严格比较…...
Java ConcurrentHashMap
Java Map本质不是线程安全的,HashTable和Collections同步包装器(Synchronized Wrapper)在并发场景下性能低。Java还为实现 Map 的线程安全提供了并发包,保证线程安全的方式从synchronize简单方式到精细化,比如Concurre…...
力扣162:寻找峰值
峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时间复杂度为 O(…...
网络设备配置指南:交换机、路由器与防火墙的基础配置与管理
在现代网络管理中,交换机、路由器和防火墙是不可或缺的关键设备。掌握这些设备的基本配置与管理,对于确保网络的稳定性、安全性和高效性至关重要。本文将详细介绍交换机、路由器和防火墙的基础配置与管理,并通过代码示例和图示来帮助读者更好地理解和应用。 一、交换机的基…...
parallelStream并行流使用踩坑,集合安全
parallelStream并行流使用踩坑 parallelStream介绍 parallelStream实现的是多线程处理从而实现并行流,相较于stream的单行流处理数据的速度更快,看一下其源码会发现parallelStream是使用线程池ForkJoin来调度的。 而ForkJoinPool的默认线程数是CPU核数 …...
清远榉之乡托养机构探讨:自闭症的本质辨析
当人们谈及自闭症时,常常会产生一个疑问:自闭症是精神类疾病吗?今天,清远榉之乡托养机构就来为大家解开这个疑惑。 榉之乡大龄自闭症托养机构在江苏、广东、江西等地都有分校,一直致力于为大龄自闭症患者提供专业的支持…...
音视频入门基础:MPEG2-TS专题(10)——PAT简介
一、引言 当某个transport packet的TS Header中的PID属性的值为0x0000时,该transport packet的payload为Program association table ,即 PAT表。PAT表包含所有PMT表的目录列表,将program_number和PMT表的PID相关联,获取数据的起始…...
wordpress网站首页底部栏显示网站备案信息
一、页脚文件footer.php 例如,wordpress主题使用的是simple-life主题,服务器IP为192.168.68.89,在wordpress主题文件中有个页脚文件footer.php,这是一个包含网站页脚代码的文件。 footer.php 路径如下: /www/wwwroot/192.168.68…...
SOLIDWORKS英文,怎么修改成中文
SOLIDWORKS英文,怎么修改成中文 打开控制面板里的程序 选择程序与功能 找到SOLIDWORKS,选择并点击上方 “更改” 在跳出来的更改页面,选择“简体中文” 点击SOLIDWORKS界面上小齿轮,进入设置 取消勾选English两个相关设置 重启SO…...
简单搭建qiankun的主应用和子应用并且用Docker进行服务器部署
在node18环境下,用react18创建qiankun主应用和两个子应用,react路由用V6版本,都在/main路由下访问子应用,用Dockerfile部署到腾讯云CentOS7.6服务器的8000端口进行访问,且在部署过程中进行nginx配置以进行合理的路由访…...
等保三级安全架构设计方案
一、概述 等保三级,全称为“信息系统安全等级保护三级”,是根据信息安全保护的需求,将系统的安全保护划分为五个等级中的第三级,主要针对相对重要的信息系统进行保护。根据《信息系统安全等级保护基本要求》(GB/T 222…...
【Stable Diffusion】安装教程
目录 一、python 安装教程 二、windows cuda安装教程 三、Stable Diffusion下载 四、Stable Diffusion部署(重点) 一、python 安装教程 (1)第一步下载 打开python下载页面,找到python3.10.9,点击右边…...
05—如何设计和仿真阻抗匹配网络
如何设计和仿真阻抗匹配网络 1. 介绍 在设计电路时,大部分同学只是想把布局布置的更专业,可能没有考虑串扰、电源完整性或阻抗匹配等问题。当了解天线和其他射频设备的匹配网络后,才会意识到阻抗匹配在高速和高频电路中的重要性。 但是,什么时候应该使用阻抗匹配网络?哪…...
Trimble X12助力电力管廊数据采集,为机器人巡视系统提供精准导航支持
地下电缆是一个城市重要的基础设施,它不仅具有规模大、范围广、空间分布复杂等特点,更重要的是它还承担着信息传输、能源输送等与人们生活息息相关的重要功能,也是一个城市赖以生存和发展的物质基础。 01、项目概述 本次项目是对某区域2公里左…...
新质驱动·科东软件受邀出席2024智能网联+低空经济暨第二届湾区汽车T9+N闭门会议
为推进广东省加快发展新质生产力,贯彻落实“百县千镇万村高质量发展工程”,推动韶关市新丰县智能网联新能源汽车、低空经济与数字技术的创新与发展,充分发挥湾区汽车产业链头部企业的带动作用。韶关市指导、珠三角湾区智能网联新能源汽车产业…...
UE5_建立自己的资产库
资产库需要用到一个插件: UAsset Browser - 直接在当前项目预览其他UE项目资产(.uasset 文件) - 直接迁移其他UE项目资产到当前项目 - 不用另外打开资产项目查看资产,迁移资产(麻烦) 插件官网插件文档插…...
Matlab搜索路径添加不上
发现无论是右键文件夹添加到路径,还是在“设置路径”中专门添加,我的路径始终添加不上,导致代码运行始终报错,后来将路径中的“”加号去掉后,就添加成功了,经过测试,路径中含有中文也可以添加成…...
跨UI发送信号
如何自定义信号 1.使用signals声明 2.返回值是void 3.在需要发送的地方使用 emit 信号名字(参数); 进行发送 4.在需要链接的地方使用connect进行链4 接 signals:void sig_addOne(int value); connect(&dlg,&SetDialog::sig_addOne,[](int value){ui->lineEdit…...
宠物领养平台构建:SpringBoot技术路线图
摘 要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领养…...
uniapp App端在renderjs层渲染echarts获取不到service层id的问题
报错信息:Cannot read properties of undefined (reading id) at app-view.js 这样的写法App端有时在renderjs视图层获取不到server逻辑层的数据 server层 renderjs层 解决方法:需要把数据(id)通过server层向renderjs层传值 server层 renderjs层...
标准输入输出函数scanf()/gets()/printf()/puts()的功能和区别
前言: 这两个函数都是用来从标准输入设备(通常是键盘)读取字符串的,但是它们有一些区别和注意事项。 scanf函数 scanf函数是C语言中的一个输入函数,它可以按照指定的格式从标准输入设备(通常是键盘&#…...
JavaScript 中的原型和原型链
JavaScript 中的原型和原型链也是一个相对较难理解透彻的知识点,下面结合详细例子来进行说明: 一、原型的概念 在 JavaScript 中,每个函数都有一个 prototype 属性,这个属性指向一个对象,这个对象就是所谓的 “原型对…...
tensorflow.python.framework.errors_impl.FailedPreconditionError
以下是我的报错 Traceback (most recent call last):File "e:\tool\anaconda\envs\openmmlab\lib\runpy.py", line 194, in _run_module_as_mainreturn _run_code(code, main_globals, None,File "e:\tool\anaconda\envs\openmmlab\lib\runpy.py", line 8…...
lua-cjson 例子
apt install -y lua-cjson 安装 编辑 tmp.lua cjson require "cjson" p 666 d "23.42" payload{"d":[{"pres":..(p)..,"temp":"..(d).."}]} print("payload " .. payload) j cjson.decode(payloa…...
《白帽子讲Web安全》15-16章
《白帽子讲Web安全》15-16章 《白帽子讲Web安全》15章15、Web Server配置安全15.1、Apache安全15.2、Nginx安全15.3、jBoss远程命令执行15.4、Tomcat远程命令执行15.5、HTTP Parameter Pollution15.6、小结 第四篇 互联网公司运营安全《白帽子讲Web安全》16章16、互联网业务安全…...
挑战用React封装100个组件【001】
项目地址 https://github.com/hismeyy/react-component-100 组件描述 组件适用于需要展示图文信息的场景,比如产品介绍、用户卡片或任何带有标题、描述和可选图片的内容展示 样式展示 代码展示 InfoCard.tsx import ./InfoCard.cssinterface InfoCardProps {ti…...
在 macOS 上安装 MongoDB Community Edition
https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-os-x/...
网络安全运行与维护高级 - 题库汇总百题
1. 单选题 内部信息安全管理组织中的()担负保护系统安全的责任,但工作重点偏向于监视系统的运行情况,并且对安全管理制度的贯彻执行情况进行监督和检查。 A. 安全审查和决策机构 B. 安全主管机构 C. 安全运行维护机构 D. 安全审计机构 正确答案:D 2. 单选题 下列那…...
在html页面显示一个变量,而这个变量中有xss脚本,如何安全的把这个变量原样展示出来
当你想要在HTML页面安全地展示一个可能包含XSS(跨站脚本攻击)脚本的变量原样内容时,可以通过以下几种常见的方式来实现安全展示: 方法一:使用文本节点 在JavaScript中,当你要将变量插入到HTML页面的某个元…...
【Linux】TCP网络编程
目录 V1_Echo_Server V2_Echo_Server多进程版本 V3_Echo_Server多线程版本 V3-1_多线程远程命令执行 V4_Echo_Server线程池版本 V1_Echo_Server TcpServer的上层调用如下,和UdpServer几乎一样: 而在InitServer中,大部分也和UDP那里一样&…...
openGauss你计算的表大小,有包含toast表么?
openGauss你计算的表大小,有包含toast表么? 最近有一个同事问我说“openGauss中pg_relation_size函数在计算表的大小时是否包含了大字段的大小?”,经过思考后,自己觉得表的大小是不包含大字段的大小的,然后…...
Python字典的用法(定义、增加、删除、修改、查询、遍历)
一.字典的介绍 dictionary(字典)是除了列表以外的 Python 中最灵活的数据类型。dict(字典)可以采用多个数据,通常用于存储描述一个物体的相关信息。 字典和列表最主要的区别是,字典是无序的对象集合&#x…...
分布式锁的实现原理
作者:来自 vivo 互联网服务器团队- Xu Yaoming 介绍分布式锁的实现原理。 一、分布式锁概述 分布式锁,顾名思义,就是在分布式环境下使用的锁。众所周知,在并发编程中,我们经常需要借助并发控制工具,如 mute…...
linux(centos) 环境部署,安装JDK,docker(mysql, redis,nginx,minio,nacos)
目录 1.安装JDK (非docker)1.1 将文件放在目录下: /usr/local/jdk1.2 解压至当前目录1.3 配置环境变量 2.安装docker2.1 验证centos内核2.2 安装软件工具包2.3 设置yum源2.4 查看仓库中所有docker版本,按需选择安装2.5 安装docker2.6 启动docker 并 开机…...
批量生成不同用户的pdf 文件(html样式)
技术 selenium thymeleaf itextpdf chromedriver 使用thymeleaf 将动态数据替换 使用selenium chromedriver 进行js ,css等逻辑运算后渲染视图 使用itextpdf 将html 转为pdf 文件 html模板 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf…...
常见的排序算法
一、基于比较的排序算法 基于比较的排序算法通过比较元素之间的大小来完成排序。 1.1 冒泡排序(Bubble Sort) 特点:通过多次交换相邻元素,将最大(或最小)元素“冒泡”到序列末端。时间复杂度:…...
从语法、功能、社区和使用场景来比较 Sass 和 LESS
一:可以从语法、功能、社区和使用场景来比较 Sass 和 LESS: 1:语法 原始的 Sass 采用的是缩进而不是大括号,后续的 Sass 版本与 LESS 一样使用与 CSS 类似的语法: address {.fa.fa-mobile-phone {margin: 0 3px 0 2…...
hdlbits系列verilog解答(Exams/m2014 q4b)-87
文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节学习如何实现下图中的电路。 模块声明 module top_module ( input clk, input d, input ar, // asynchronous reset output q); 思路: 只是实现一种带异步复位的D触发器。 时钟边沿两种触发方式的关键字…...
Python 和 Pyecharts 对Taptap相关数据可视化分析
结果展示: 数据来源: Python爬取TapTap 热门游戏信息并存储到数据库(详细版) 目录 结果展示: 数据来源: Python爬取TapTap 热门游戏信息并存储到数据库(详细版 一、引言 二、准备工作 三、…...
系统学习算法: 专题二 滑动窗口
题目一: 算法原理: 依然第一反应是暴力枚举,将所有的子数组都枚举出来,找到满足条件的长度最小的子数组,但是需要两层循环,时间复杂度来到O(N^2) 接下来就该思考如何进行优化 如果…...
Docker的save和export命令的区别,load和import的区别 笔记241124
Docker的save和export命令的区别,load和import的区别 解说1: Docker的save和export命令,以及load和import命令,在功能和使用场景上存在显著的区别。以下是对这两组命令的详细对比和解释: Docker save和export命令的区别 使用方式和目的&am…...
cad中为什么不使用C0C1C2连续,而使用G0G1G2连续
在CAD中,之所以使用G0、G1、G2连续而不是C0、C1、C2连续,主要是因为G连续性更侧重于几何空间的连续性,与视觉感知和制造过程更为相关。 • G0连续:保证曲线或曲面在连接点处没有断开,即位置连续。这在CAD中非常重要&a…...
Linux:makefile的使用
makefile小结: makefile的应用: 一个简单的 Makefile 文件包含一系列的“规则”,其样式如下: 目标(target)…: 依赖(prerequiries)… 命令(command) 目标(target)通常是要生成的文件的名称,可以是可执行文件或OBJ文件…...
局域网的网络安全
网络安全 局域网基本上都采用以广播为技术基础的以太网,任何两个节点之间的通信数据包,不仅为这两个节点的网卡所接收,也同时为处在同一以太网上的任何一个节点的网卡所截取。因此,黑客只要接入以太网上的任一节点进行侦听&#…...
【Leetcode 每日一题 - 补卡】3235. 判断矩形的两个角落是否可达
问题背景 给你两个正整数 x C o r n e r xCorner xCorner 和 y C o r n e r yCorner yCorner 和一个二维整数数组 c i r c l e s circles circles,其中 c i r c l e s [ i ] [ x i , y i , r i ] circles[i] [x_i, y_i, r_i] circles[i][xi,yi,ri] 表示…...