深度学习入门(五十六)循环神经网络——循环神经网络RNN

news2024/11/30 2:40:26

深度学习入门(五十六)循环神经网络——循环神经网络RNN

  • 前言
  • 循环神经网络——循环神经网络RNN
    • 课件
      • 潜变量自回归模型
      • 循环神经网络
      • 使用循环神经网络的语言模型
      • 困惑度(perplexity)
      • 梯度裁剪
      • 更多的应用RNNs
      • 总结
    • 教材
      • 1 无隐状态的神经网络
      • 2 有隐状态的循环神经网络
      • 3 基于循环神经网络的字符级语言模型
      • 4 困惑度(Perplexity)
      • 5 小结

前言

核心内容来自博客链接1博客连接2希望大家多多支持作者
本文记录用,防止遗忘

循环神经网络——循环神经网络RNN

课件

潜变量自回归模型

使用潜变量 h t h_t ht总结过去信息
在这里插入图片描述

循环神经网络

在这里插入图片描述
更新隐藏状态: h t = ϕ ( W h h h t − 1 + W h x x t − 1 + b h ) h_t=\phi(W_{hh}h_{t-1}+W_{hx}x_{t-1}+b_h) ht=ϕ(Whhht1+Whxxt1+bh)
输出: o t = ϕ ( W h o h t ) + b o o_t=\phi(W_{ho}h_t)+b_o ot=ϕ(Whoht)+bo

使用循环神经网络的语言模型

在这里插入图片描述

困惑度(perplexity)

衡量一个语言模型的好坏可以用平均交叉嫡
π = 1 n ∑ t = 1 n − log ⁡ P ( x t ∣ x t − 1 , … , x 1 ) , \pi=\frac{1}{n} \sum_{t=1}^n -\log P(x_t \mid x_{t-1}, \ldots, x_1), π=n1t=1nlogP(xtxt1,,x1),
p p p是语言模型的预测概率, x t x_t xt是真实词

  • 历史原因NLP使用困惑度 e x p ( π ) exp(\pi) exp(π)来衡量,是平均每次可能选项
  • 1表示完美,无穷大是最差情况

梯度裁剪

迭代中计算这 T T T个时间步上的梯度,在反向传播过程中产生长度为 O ( T ) O(T) O(T)的矩阵乘法链,导致数值不稳定
梯度裁剪能有效预防梯度爆炸

  • 如果梯度长度超过 θ \theta θ,那么拖影回长度 θ \theta θ
    g ← m i n ( 1 , θ ∣ ∣ g ∣ ∣ ) g g\leftarrow min(1,\frac{\theta}{||g||})g gmin(1,gθ)g

更多的应用RNNs

在这里插入图片描述

总结

  • 循环神经网络的输出取决于当下输入和前一时间的隐变量
  • 应用到语言模型中时,循环神经网络根据当前词预测下一次时刻词
  • 通常使用困惑度来衡量语言模型的好坏

教材

在语言模型与数据集一节中, 我们介绍了 n n n元语法模型, 其中单词 x t x_t xt在时间步 t t t的条件概率仅取决于前面 n − 1 n-1 n1个单词。 对于时间步 t − ( n − 1 ) t-(n-1) t(n1)之前的单词, 如果我们想将其可能产生的影响合并到 x t x_t xt上, 需要增加 n n n,然而模型参数的数量也会随之呈指数增长, 因为词表 V \mathcal{V} V需要存储 ∣ V ∣ n |\mathcal{V}|^n Vn个数字, 因此与其将 P ( x t ∣ x t − 1 , … , x t − n + 1 ) P(x_t \mid x_{t-1}, \ldots, x_{t-n+1}) P(xtxt1,,xtn+1)模型化, 不如使用隐变量模型:

P ( x t ∣ x t − 1 , … , x 1 ) ≈ P ( x t ∣ h t − 1 ) , P(x_t \mid x_{t-1}, \ldots, x_1) \approx P(x_t \mid h_{t-1}), P(xtxt1,,x1)P(xtht1),
其中 h t − 1 h_{t-1} ht1隐状态(hidden state), 也称为隐藏变量(hidden variable), 它存储了到时间步 t − 1 t-1 t1的序列信息。 通常,我们可以基于当前输入 x t x_{t} xt和先前隐状态 h t − 1 h_{t-1} ht1来计算时间步 t t t处的任何时间的隐状态:
h t = f ( x t , h t − 1 ) . h_t = f(x_{t}, h_{t-1}). ht=f(xt,ht1).
对于上式中的函数 f f f,隐变量模型不是近似值。 毕竟 h t h_t ht是可以仅仅存储到目前为止观察到的所有数据, 然而这样的操作可能会使计算和存储的代价都变得昂贵。

回想一下,我们在多层感知机中讨论过的具有隐藏单元的隐藏层。 值得注意的是,隐藏层和隐状态指的是两个截然不同的概念。 如上所述,隐藏层是在从输入到输出的路径上(以观测角度来理解)的隐藏的层, 而隐状态则是在给定步骤所做的任何事情(以技术角度来定义)的输入, 并且这些状态只能通过先前时间步的数据来计算。

循环神经网络(recurrent neural networks,RNNs) 是具有隐状态的神经网络。 在介绍循环神经网络模型之前, 我们首先回顾多层感知机一节中介绍的多层感知机模型。

1 无隐状态的神经网络

让我们来看一看只有单隐藏层的多层感知机。 设隐藏层的激活函数为 ϕ \phi ϕ, 给定一个小批量样本 X ∈ R n × d \mathbf{X} \in \mathbb{R}^{n \times d} XRn×d, 其中批量大小为 n n n,输入维度为 d d d, 则隐藏层的输出 H ∈ R n × h \mathbf{H} \in \mathbb{R}^{n \times h} HRn×h通过下式计算:

H = ϕ ( X W x h + b h ) . \mathbf{H} = \phi(\mathbf{X} \mathbf{W}_{xh} + \mathbf{b}_h). H=ϕ(XWxh+bh).
在语言模型与数据集一节中, 我们拥有的隐藏层权重参数为 W x h ∈ R d × h \mathbf{W}_{xh} \in \mathbb{R}^{d \times h} WxhRd×h, 偏置参数为 b h ∈ R 1 × h \mathbf{b}_h \in \mathbb{R}^{1 \times h} bhR1×h, 以及隐藏单元的数目为 h h h。 因此求和时可以应用广播机制 。 接下来,将隐藏变量 H H H用作输出层的输入。 输出层由下式给出:

O = H W h q + b q , \mathbf{O} = \mathbf{H} \mathbf{W}_{hq} + \mathbf{b}_q, O=HWhq+bq,
其中, O ∈ R n × q \mathbf{O} \in \mathbb{R}^{n \times q} ORn×q是输出变量, W h q ∈ R h × q \mathbf{W}_{hq} \in \mathbb{R}^{h \times q} WhqRh×q 是权重参数, b q ∈ R 1 × q \mathbf{b}_q \in \mathbb{R}^{1 \times q} bqR1×q 是输出层的偏置参数。 如果是分类问题,我们可以用 softmax ( O ) \text{softmax}(\mathbf{O}) softmax(O)来计算输出类别的概率分布。

这完全类似于之前解决的回归问题, 因此我们省略了细节。 无须多言,只要可以随机选择“特征-标签”对, 并且通过自动微分和随机梯度下降能够学习网络参数就可以了。

2 有隐状态的循环神经网络

有了隐状态后,情况就完全不同了。 假设我们在时间步 t t t有小批量输入 X t ∈ R n × d \mathbf{X}_t \in \mathbb{R}^{n \times d} XtRn×d。 换言之,对于 n n n个序列样本的小批量, X t \mathbf{X}_t Xt的每一行对应于来自该序列的时间步 t t t处的一个样本。 接下来,用 H t ∈ R n × h \mathbf{H}_t \in \mathbb{R}^{n \times h} HtRn×h表示时间步的隐藏变量。 与多层感知机不同的是, 我们在这里保存了前一个时间步的隐藏变量 H t − 1 \mathbf{H}_{t-1} Ht1, 并引入了一个新的权重参数 W h h ∈ R h × h \mathbf{W}_{hh} \in \mathbb{R}^{h \times h} WhhRh×h, 来描述如何在当前时间步中使用前一个时间步的隐藏变量。 具体地说,当前时间步隐藏变量由当前时间步的输入 与前一个时间步的隐藏变量一起计算得出:
H t = ϕ ( X t W x h + H t − 1 W h h + b h ) . \mathbf{H}_t = \phi(\mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} + \mathbf{b}_h). Ht=ϕ(XtWxh+Ht1Whh+bh).
H = ϕ ( X W x h + b h ) . \mathbf{H} = \phi(\mathbf{X} \mathbf{W}_{xh} + \mathbf{b}_h). H=ϕ(XWxh+bh).相比,上式多添加了一项 H t − 1 W h h \mathbf{H}_{t-1} \mathbf{W}_{hh} Ht1Whh, 从而实例化了 h t = f ( x t , h t − 1 ) . h_t = f(x_{t}, h_{t-1}). ht=f(xt,ht1).。 从相邻时间步的隐藏变量 H t \mathbf{H}_t Ht H t − 1 \mathbf{H}_{t-1} Ht1之间的关系可知, 这些变量捕获并保留了序列直到其当前时间步的历史信息, 就如当前时间步下神经网络的状态或记忆, 因此这样的隐藏变量被称为隐状态(hidden state)。 由于在当前时间步中, 隐状态使用的定义与前一个时间步中使用的定义相同, 因此上式的计算是循环的(recurrent)。 于是基于循环计算的隐状态神经网络被命名为 循环神经网络(recurrent neural network)。 在循环神经网络中执行 H t = ϕ ( X t W x h + H t − 1 W h h + b h ) . \mathbf{H}_t = \phi(\mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} + \mathbf{b}_h). Ht=ϕ(XtWxh+Ht1Whh+bh).计算的层称为循环层(recurrent layer)

有许多不同的方法可以构建循环神经网络, 由 H t = ϕ ( X t W x h + H t − 1 W h h + b h ) . \mathbf{H}_t = \phi(\mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} + \mathbf{b}_h). Ht=ϕ(XtWxh+Ht1Whh+bh).定义的隐状态的循环神经网络是非常常见的一种。 对于时间步 t t t,输出层的输出类似于多层感知机中的计算:
O t = H t W h q + b q . \mathbf{O}_t = \mathbf{H}_t \mathbf{W}_{hq} + \mathbf{b}_q. Ot=HtWhq+bq.
循环神经网络的参数包括隐藏层的权重 W x h ∈ R d × h , W h h ∈ R h × h \mathbf{W}_{xh} \in \mathbb{R}^{d \times h}, \mathbf{W}_{hh} \in \mathbb{R}^{h \times h} WxhRd×h,WhhRh×h和偏置 b h ∈ R 1 × h \mathbf{b}_h \in \mathbb{R}^{1 \times h} bhR1×h, 以及输出层的权重 W h q ∈ R h × q \mathbf{W}_{hq} \in \mathbb{R}^{h \times q} WhqRh×q和偏置 b q ∈ R 1 × q \mathbf{b}_q \in \mathbb{R}^{1 \times q} bqR1×q。 值得一提的是,即使在不同的时间步,循环神经网络也总是使用这些模型参数。 因此,循环神经网络的参数开销不会随着时间步的增加而增加。

下图展示了循环神经网络在三个相邻时间步的计算逻辑。 在任意时间步 t t t,隐状态的计算可以被视为:

  • 1、拼接当前时间步 t t t的输入 X t \mathbf{X}_t Xt和前一时间步 t − 1 t-1 t1的隐状态 H t − 1 \mathbf{H}_{t-1} Ht1
  • 2、将拼接的结果送入带有激活函数 ϕ \phi ϕ的全连接层。 全连接层的输出是当前时间步 t t t的隐状态 H t \mathbf{H}_t Ht

在本例中,模型参数是 W x h \mathbf{W}_{xh} Wxh W h h \mathbf{W}_{hh} Whh的拼接, 以及 b h \mathbf{b}_h bh的偏置,所有这些参数都来自 H t = ϕ ( X t W x h + H t − 1 W h h + b h ) . \mathbf{H}_t = \phi(\mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} + \mathbf{b}_h). Ht=ϕ(XtWxh+Ht1Whh+bh).。 当前时间步 t t t的隐状态 H t \mathbf{H}_t Ht将参与计算下一时间步 t + 1 t+1 t+1的隐状态 H t + 1 \mathbf{H}_{t+1} Ht+1。 而且 H t \mathbf{H}_t Ht还将送入全连接输出层, 用于计算当前时间步 t t t的输出 O t \mathbf{O}_t Ot
在这里插入图片描述
我们刚才提到,隐状态中 X t W x h + H t − 1 W h h \mathbf{X}_t \mathbf{W}_{xh} + \mathbf{H}_{t-1} \mathbf{W}_{hh} XtWxh+Ht1Whh的计算, 相当于 X t \mathbf{X}_t Xt H t − 1 \mathbf{H}_{t-1} Ht1的拼接与 W x h \mathbf{W}_{xh} Wxh W h h \mathbf{W}_{hh} Whh的拼接的矩阵乘法。 虽然这个性质可以通过数学证明, 但在下面我们使用一个简单的代码来说明一下。 首先,我们定义矩阵X、W_xh、H和W_hh, 它们的形状分别为 ( 3 , 1 ) 、 ( 1 , 4 ) 、 ( 3 , 4 ) 、 ( 4 , 4 ) (3,1)、(1,4)、(3,4)、(4,4) (3,1)(1,4)(3,4)(4,4)。 分别将X乘以W_xh,将H乘以W_hh, 然后将这两个乘法相加,我们得到一个形状为 ( 3 , 4 ) (3,4) (3,4)的矩阵。

import torch
from d2l import torch as d2l

X, W_xh = torch.normal(0, 1, (3, 1)), torch.normal(0, 1, (1, 4))
H, W_hh = torch.normal(0, 1, (3, 4)), torch.normal(0, 1, (4, 4))
torch.matmul(X, W_xh) + torch.matmul(H, W_hh)

输出:

tensor([[-1.4258,  1.8849, -1.2227, -3.2763],
        [ 0.5912, -0.8081,  0.6962, -0.0819],
        [-3.9654,  1.2145, -4.2720, -0.6869]])

现在,我们沿列(轴1)拼接矩阵X和H, 沿行(轴0)拼接矩阵W_xh和W_hh。 这两个拼接分别产生形状(3,5)和形状(5,4)的矩阵。 再将这两个拼接的矩阵相乘, 我们得到与上面相同形状(3,4)的输出矩阵。

torch.matmul(torch.cat((X, H), 1), torch.cat((W_xh, W_hh), 0))

输出:

tensor([[-1.4258,  1.8849, -1.2227, -3.2763],
        [ 0.5912, -0.8081,  0.6962, -0.0819],
        [-3.9654,  1.2145, -4.2720, -0.6869]])

3 基于循环神经网络的字符级语言模型

回想一下语言模型, 我们的目标是根据过去的和当前的词元预测下一个词元, 因此我们将原始序列移位一个词元作为标签。 Bengio等人首先提出使用神经网络进行语言建模。 接下来,我们看一下如何使用循环神经网络来构建语言模型。 设小批量大小为1,批量中的那个文本序列为“machine”。 为了简化后续部分的训练,我们考虑使用字符级语言模型(character-level language model), 将文本词元化为字符而不是单词。下图演示了如何通过基于字符级语言建模的循环神经网络, 使用当前的和先前的字符预测下一个字符。
在这里插入图片描述
在训练过程中,我们对每个时间步的输出层的输出进行softmax操作, 然后利用交叉熵损失计算模型输出和标签之间的误差。 由于隐藏层中隐状态的循环计算, 图中的第3个时间步的输出 O 3 \mathbf{O}_3 O3由文本序列“m”、“a”和“c”确定。 由于训练数据中这个文本序列的下一个字符是“h”, 因此第3个时间步的损失将取决于下一个字符的概率分布, 而下一个字符是基于特征序列“m”、“a”、“c”和这个时间步的标签“h”生成的。

在实践中,我们使用的批量大小为 n > 1 n>1 n>1, 每个词元都由一个 d d d维向量表示。 因此,在时间步 t t t输入 X t \mathbf X_t Xt将是一个 n × d n\times d n×d矩阵, 这与我们在文本预处理一节中的讨论相同。

因为每个输入词是一个字符,因此这个模型被称为字符级循环神经网络(character-level recurrent neural network)。因为不同字符的个数远小于不同词的个数(对于英文尤其如此),所以字符级循环神经网络的计算通常更加简单。

4 困惑度(Perplexity)

最后,让我们讨论如何度量语言模型的质量, 这将在后续部分中用于评估基于循环神经网络的模型。 一个好的语言模型能够用高度准确的词元来预测我们接下来会看到什么。 考虑一下由不同的语言模型给出的对“It is raining …”(“…下雨了”)的续写:

1、“It is raining outside”(外面下雨了)

2、“It is raining banana tree”(香蕉树下雨了)

3、“It is raining piouw;kcj pwepoiut”(piouw;kcj pwepoiut下雨了)

就质量而言,例1显然是最合乎情理、在逻辑上最连贯的。 虽然这个模型可能没有很准确地反映出后续词的语义, 比如,“It is raining in San Francisco”(旧金山下雨了) 和“It is raining in winter”(冬天下雨了) 可能才是更完美的合理扩展, 但该模型已经能够捕捉到跟在后面的是哪类单词。 例2则要糟糕得多,因为其产生了一个无意义的续写。 尽管如此,至少该模型已经学会了如何拼写单词, 以及单词之间的某种程度的相关性。 最后,例3表明了训练不足的模型是无法正确地拟合数据的。

我们可以通过计算序列的似然概率来度量模型的质量。 然而这是一个难以理解、难以比较的数字。 毕竟,较短的序列比较长的序列更有可能出现, 因此评估模型产生托尔斯泰的巨著《战争与和平》的可能性 不可避免地会比产生圣埃克苏佩里的中篇小说《小王子》可能性要小得多。 而缺少的可能性值相当于平均数。

在这里,信息论可以派上用场了。 我们在引入softmax回归时定义了熵、惊异和交叉熵, 并在信息论的在线附录 中讨论了更多的信息论知识。 如果想要压缩文本,我们可以根据当前词元集预测的下一个词元。 一个更好的语言模型应该能让我们更准确地预测下一个词元。 因此,它应该允许我们在压缩序列时花费更少的比特。 所以我们可以通过一个序列中所有的 n n n个词元的交叉熵损失的平均值来衡量:
1 n ∑ t = 1 n − log ⁡ P ( x t ∣ x t − 1 , … , x 1 ) , \frac{1}{n} \sum_{t=1}^n -\log P(x_t \mid x_{t-1}, \ldots, x_1), n1t=1nlogP(xtxt1,,x1),

其中 P P P由语言模型给出, x t x_t xt是在时间步 t t t从该序列中观察到的实际词元。 这使得不同长度的文档的性能具有了可比性。 由于历史原因,自然语言处理的科学家更喜欢使用一个叫做困惑度(perplexity)的量。 简而言之,它是 上式的指数:
exp ⁡ ( − 1 n ∑ t = 1 n log ⁡ P ( x t ∣ x t − 1 , … , x 1 ) ) . \exp\left(-\frac{1}{n} \sum_{t=1}^n \log P(x_t \mid x_{t-1}, \ldots, x_1)\right). exp(n1t=1nlogP(xtxt1,,x1)).
困惑度的最好的理解是“下一个词元的实际选择数的调和平均数”。 我们看看一些案例:

  • 在最好的情况下,模型总是完美地估计标签词元的概率为1。 在这种情况下,模型的困惑度为1。

  • 在最坏的情况下,模型总是预测标签词元的概率为0。 在这种情况下,困惑度是正无穷大。

  • 在基线上,该模型的预测是词表的所有可用词元上的均匀分布。 在这种情况下,困惑度等于词表中唯一词元的数量。 事实上,如果我们在没有任何压缩的情况下存储序列, 这将是我们能做的最好的编码方式。 因此,这种方式提供了一个重要的上限, 而任何实际模型都必须超越这个上限。

在接下来的小节中,我们将基于循环神经网络实现字符级语言模型, 并使用困惑度来评估这样的模型。

5 小结

  • 对隐状态使用循环计算的神经网络称为循环神经网络(RNN)。

  • 循环神经网络的隐状态可以捕获直到当前时间步序列的历史信息。

  • 循环神经网络模型的参数数量不会随着时间步的增加而增加。

  • 我们可以使用循环神经网络创建字符级语言模型。

  • 我们可以使用困惑度来评价语言模型的质量。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

周赛总结--LeetCode单周赛321场 AcWing79场

1. LeetCode单周赛321场 1.1 找出中枢整数 1.1.1 原题链接:力扣https://leetcode.cn/problems/find-the-pivot-integer/ 1.1.2 解题思路: 1、先保存 1-n 的和sum; 2、从 1 开始枚举,判断前 i 项和 cmp 与 sum - cmp i 是否相等…

MySQL第二弹

目录​​​​​​​ 一、数据库基本操作 1、查看数据库信息 2、查看数据库中的表信息 3、显示数据表的结构(字段) 4、常见的数据类型 4.1 数值类型 4.2 日期和时间类型 4.3 字符串类型 二、SQL语言概述 1、SQL语言 2、SQL分类 2.1 DDL:数据定…

【强化学习论文合集】NeurIPS-2021 强化学习论文

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现…

js——高阶函数、闭包、递归以及浅拷贝和深拷贝

目录 一、高阶函数 1、什么是高阶函数 2、把一个函数作为参数 3、return 返回的也是一个函数 二、闭包 1、闭包是什么 2、变量的作用域 3、案例 4、结果展示: 5、总结: 三、递归 1、什么是递归 2、案例一 3、分析 4、问题 5、栈溢出又是什…

【Unity Shader​】 屏幕后处理5.0:讨论双重模糊的Bloom

接上一篇基于高斯模糊的Bloom继续进行接下来的学习。 1 一些必要的思考* 1.1 关于高质量Bloom 前面提到了,Bloom对于游戏必不可少的效果之一,于是我们不仅仅要把Bloom效果实现出来,效果的质量好坏就更加是我们需要关注的点了。高质量泛光&a…

面试宝典之C++多态灵魂拷问

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸 文章目录一、重载,隐藏/重定义,覆盖/重写二、多态的原理三、inline可以是虚函数吗四、静态成员函数可以是虚函数吗五、构造函…

海丝一号-中国-2020

2020年12月22日,由中国电科38所和天仪研究院联合研制的我国首颗商业SAR卫星“海丝一号”搭载长征八号运载火箭在文昌卫星发射中心成功发射。海丝一号历时一年完成研制,整星重量小于185kg,成像最高分辨率1m,可以全天时、全天候对陆…

章节5 文件与目录管理

5-Linux文件和目录管理 (Linux操作系统-2022的前面章节都为铺垫) 常见命令格式 Command Options Arguments 命令 选项 参数 rm -rf /* -一个字母或字母组合,此选项为短选项,–单词,此选项为长选项 Options选项&…

因果推断 | 双重差分法笔记补充

换了新的环境后,一直在适应(其实是一直被推着走),所以停更了笔记好久啦。这一周周末终于有点得空,当然也是因为疫情,哪里都不能去,哈哈,所以来冒个泡~ 整理了最近pre的作业&#xf…

ESP32-CAM初始篇:Arduino环境搭建-->实现局域网推流

ESP32-CAM初始篇:Arduino环境搭建–>实现局域网推流 入手产品:安信可科技:ESP32-CAM摄像头开发板: 相关产品特性请访问安信可ESP32-CAM官网:https://docs.ai-thinker.com/esp32-cam 第一步:下载Ardui…

基于51单片机数字频率计的设计

目录 前 言 1 第一章 总体设计方案 2 1.1 总设计框图 2 1.2 硬件设计分析 2 1.2.1 电源的设计 2 (4):LCD1602的指令说明及时序 10 (5): LCD1602的RAM地址映射及标准字库表 13 第二章 软件设计与分析 15 2.1…

谷粒商城十一商城系统及整合thymeleaf渲染商城首页

我们的商城系统本应该也是前后端分离的,就像后台管理系统那样,然而出于教学考虑,前后端分离的话就会屏蔽掉很多细节,所以我们进行服务端的页面渲染式开发(有点儿类似freemarker) 这些页面直接粘贴到微服务…

含论文基于JSP的零食销售商城【数据库设计、源码、开题报告】

数据库脚本下载地址: https://download.csdn.net/download/itrjxxs_com/86500759 主要使用技术 ServletJSPcssjsMysqlTomcat 功能介绍 (1)前台功能模块: 注册登陆:顾客可以通过填写注册信息成为会员,登陆后才能进行购物车的管…

汽车 Automotive > SOME/IP应用学习

目录 SOME/IP介绍 SOME/IP主要功能 SOME/IP协议 SOME/IP服务类型 SOME/IP-举例 SOME/IP各模块协议 SOME/IP-基础元件 SOME/IP-SoAD SOME/IP-SD协议 SOME/IP-SD举例 SOME/IP-TP协议 SOME/IP-TP举例 SOME/IP介绍 SOME/IP ( Scalable service-Oriented Middleware ove…

基于Android的JavaEE课设

目录 1 技术栈 2 android前端 2.1 概述 2.1.1 目录结构 2.1.2 代码分层 2.2 技术点 2.2.1 数据绑定 2.2.2 前后端数据交互 2.2.3 九宫格图片 2.2.4 未处理消息提醒 2.2.5 动画效果 2.2.6 实时聊天 2.2.7 文件上传 2.2.8 底部弹窗 2.2.9 其他 3 后端 3.1 概述 …

BUUCTF Misc 假如给我三天光明 数据包中的线索 后门查杀 webshell后门

假如给我三天光明 下载文件,一个压缩包(需要密码)和图片 百度得知下面一行是盲文,根据盲文对照表 和上述图片对照,得到字符串:kmdonowg 。使用它解压压缩包 使用Audacity打开 转换成摩斯密码,…

C语言程序设计 复习总结[持续更新ing]

目录 一 初识C语言 1 main 主函数 2 注释 3 C 程序执行的过程: 4 C 程序的结构 5 进制的转换 1.内存容量 2.二进制与十进制的转换 1>将二进制数转换成十进制 2>将十进制转换成二进制数 3.二进制与八进制的转换 1>将八进制数转换成二进制: 2>将二进…

Java项目:JSP酒店客房管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 酒店管理系统共分为三个角色,客房经理、前台管理员、客户,各个角色的权限各不相同; 客房经理功能包括&#…

leetcode《图解数据结构》刷题日志【第五周】(2022/11/21-2022/11/28)

leetcode《图解数据结构》刷题日志【第五周】1. 剑指 Offer 60. n 个骰子的点数1.1 题目1.2 解题思路1.3 数据类型功能函数总结1.4 java代码1.5 踩坑小记1.6 进阶做法2. 剑指 Offer 63. 股票的最大利润2.1 题目2.2 解题思路2.3 数据类型功能函数总结2.4 java代码3. 剑指 Offer …

SpringBoot SpringBoot 原理篇 1 自动配置 1.16 自动配置原理【2】

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.16 自动配置原理【2】1.16.1 看源码了1.16.2 Import({AutoConfig…