循环神经网络-基础篇Basic-RNN

news/2024/5/10 16:20:11/文章来源:https://blog.csdn.net/weixin_55500281/article/details/128439694

循环神经网络-基础篇Basic-RNN

我们把全连接网络也叫做稠密网络DNN,其中X1到X8是不同样本的特征

在这里插入图片描述

而本文介绍的循环神经网络RNN主要处理的是具有序列关系的输入数据,即前面的输入和后面的输入是有关系的。例如天气,股市,金融数据和自然语言等

什么是RNN

首先来看一个简单的循环神经网络结构

将序列x1−x4x_{1}-x_{4}x1x4作为输入到RNNCellRNN CellRNNCell,它是一个线型层(Linear),可以得到隐层输出hhh,其中x2x_{2}x2不仅包含自己的信息,也包含x1x_{1}x1的信息。

在这里插入图片描述

h0h_{0}h0是一个先验,例如,我们想要从图像到文本的转换时,我们可以选择用CNN+FC作为h0h_{0}h0输入,结合RNN

如果我们没有先验,则把h0h_{0}h0的维度设置和其余hhh相同,其值为全0。

我们来具体看一下计算过程

  • 输入的维度是input_size*1
  • 隐层的维度是hidden_size
  • 线性变换Wihxt+bihW_{i h} x_{t}+b_{i h}Wihxt+bih,其中$ W KaTeX parse error: Undefined control sequence: \* at position 18: …是一个hidden\_size\̲*̲input\_size的矩阵。…W_{i h} x_{t}+b_{i h}$维度就和隐层的维度一致
  • 在上一层的权重矩阵WhhW_{h h}Whh的维度是hidden_size * hidden_size
  • 我们把算出来的Whhht−1+bhhW_{h h} h_{t-1}+b_{h h}Whhht1+bhhWihxt+bihW_{i h} x_{t}+b_{i h}Wihxt+bih进行相加,都是hidden_size的向量
  • 融合完之后做一个tanhtanhtanh的激活函数
  • 最后算出来的ht\boldsymbol{h}_{t}ht就是这一层的输出

在这里插入图片描述

其实本质上可以变成一个线型层

在这里插入图片描述

RNN构造

RNN构造在pytorch中有两种构造方式

  • 做自己的RNN Cell,自己写处理序列的循环
  • 直接使用RNN

第一种方式:RNN Cell

我们先来看一下RNN Cell是怎么用的

在设计RNN Cell 时,要确定输入维度input_size和输出维度hidden_size

在这里插入图片描述

在进行调用的时候要加上当前时刻的输入input加上当前的hidden

在这里插入图片描述

下面我们看一个实例

在这里插入图片描述

import torch# Parameters
batch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2# Construction of RNNCell
cell = torch.nn.RNNCell(input_size=input_size, hidden_size=hidden_size)# (seq,batch,features)
dataset = torch.randn(seq_len,batch_size,input_size)
# Initializing the hidden to zero
hidden = torch.zeros(batch_size,hidden_size)for idx,input in enumerate(dataset):print('=' * 20, idx, '='*20)print('Input size:', input.shape)  # the shape of input is (batchsize,inputsize)hidden = cell(input,hidden)print('hidden size:', hidden.shape)print(hidden)# ================输出结果======================================= 0 ====================
Input size: torch.Size([1, 4])
hidden size: torch.Size([1, 2])
tensor([[0.2663, 0.8438]], grad_fn=<TanhBackward0>)
==================== 1 ====================
Input size: torch.Size([1, 4])
hidden size: torch.Size([1, 2])
tensor([[-0.2387, -0.4385]], grad_fn=<TanhBackward0>)
==================== 2 ====================
Input size: torch.Size([1, 4])
hidden size: torch.Size([1, 2])
tensor([[0.8720, 0.5714]], grad_fn=<TanhBackward0>)

第二种方式:RNN

需要确定输入维度input_size和输出维度hidden_size和RNN的层数num_layers

其中inputs代表整个输入序列xxxhidden代表h0h_{0}h0,out代表隐层序列hhhhidden代表最后的输出hNh_{N}hN

在这里插入图片描述

我们需要确定他们的维度

在这里插入图片描述

下面我们看一个实例

在这里插入图片描述

📌什么是numLayers,例如下方有三个numLayers

在这里插入图片描述

import torchbatch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2
num_layers = 1cell = torch.nn.RNN(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers)inputs = torch.randn(seq_len,batch_size,input_size)
hidden = torch.zeros(num_layers,batch_size,hidden_size)out, hidden = cell(inputs,hidden)print('Output size:', out.shape)
print('Output:',out)
print('Hidden size:', hidden.shape)
print('Hidden', hidden)# ================输出结果===================
Output size: torch.Size([3, 1, 2])
Output: tensor([[[-0.1512,  0.2489]],[[-0.3888, -0.3375]],[[-0.1606,  0.4324]]], grad_fn=<StackBackward0>)
Hidden size: torch.Size([1, 1, 2])
Hidden tensor([[[-0.1606,  0.4324]]], grad_fn=<StackBackward0>)

另外还有一个参数是batch_first

在这里插入图片描述

序列到序列的例子

现在想要训练一个模型,把文本从hello 输出到 ohlol

在这里插入图片描述

这些文本字母并不是一个向量,我们第一步要把字母向量化表示

在这里插入图片描述

把输入的字母映射成一个词典,然后通过索引值,转化称为独热向量

最后的输出对应的也是长度为4的向量

在这里插入图片描述

下面就是整个进行训练的结构

在这里插入图片描述

使用RNN Cell代码演示

import torch# ===============准备数据====================
input_size = 4
hidden_size = 4
batch_size = 1# dictionary
idx2char = ['e', 'h', 'l', 'o']
x_data = [1, 0, 2, 2, 3]  # hello
y_data = [3, 1, 2, 3, 2]  # ohlol# 独热向量
one_hot_lookup = [[1, 0, 0, 0],[0, 1, 0, 0],[0, 0, 1, 0],[0, 0, 0, 1]]
x_one_hot = [one_hot_lookup[x] for x in x_data]  # 维度是seq * input_size# reshape the inputs to (seqLen,batchSize,inputSize)
inputs = torch.Tensor(x_one_hot).view(-1, batch_size, input_size)
# reshape the labels to (seqLen,1)
labels = torch.LongTensor(y_data).view(-1, 1)# ===============构造模型====================
class Model(torch.nn.Module):def __init__(self, input_size, hidden_size, batch_size):super(Model, self).__init__()# initial the parametersself.batch_size = batch_sizeself.input_size = input_sizeself.hidden_size = hidden_size# shape of inputs: (batchSize,inputSize)# shape of hidden: (batchSize,hiddenSize)self.rnncell = torch.nn.RNNCell(input_size=input_size, hidden_size=hidden_size)def forward(self, input, hidden):hidden = self.rnncell(input, hidden)return hidden# 生成默认的h0def init_hidden(self):return torch.zeros(self.batch_size, self.hidden_size)net = Model(input_size, hidden_size, batch_size)# ===============损失和优化器====================
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(),lr=0.1)# ===============训练模型====================
for epoch in range(15):loss = 0# 梯度归0optimizer.zero_grad()# h0hidden = net.init_hidden()print('Predicted string:',end='')# inputs 的维度是(seqLen,batchSize,inputSize) 按seqLen进行循环# input 的维度是(batchSize,inputSize)# labels 的维度是(seqSize,1)# label 的维度是(1)for input, label in zip(inputs,labels):hidden = net(input,hidden)loss += criterion(hidden, label) # 整个计算的loss和才是最终的loss# 把hidden中最大值的下标找到_, idx = hidden.max(dim=1)print(idx2char[idx.item()],end='')loss.backward()optimizer.step()print(', Epoch[%d/15] loss=%.4f' %(epoch+1, loss.item()))

输出结果

Predicted string:eoooe, Epoch[1/15] loss=7.5483
Predicted string:ooooo, Epoch[2/15] loss=6.0676
Predicted string:ooool, Epoch[3/15] loss=5.2073
Predicted string:ohlol, Epoch[4/15] loss=4.7479
Predicted string:ohlol, Epoch[5/15] loss=4.4771
Predicted string:ohlol, Epoch[6/15] loss=4.2829
Predicted string:ohlol, Epoch[7/15] loss=4.0976
Predicted string:ohlol, Epoch[8/15] loss=3.8791
Predicted string:ohlol, Epoch[9/15] loss=3.6212
Predicted string:ohlol, Epoch[10/15] loss=3.3628
Predicted string:ohlol, Epoch[11/15] loss=3.1412
Predicted string:ohlol, Epoch[12/15] loss=2.9649
Predicted string:ohlol, Epoch[13/15] loss=2.8203
Predicted string:ohlol, Epoch[14/15] loss=2.6825
Predicted string:ohlol, Epoch[15/15] loss=2.5410

使用RNN代码演示

import torch# ===============准备数据====================
input_size = 4
hidden_size = 4
batch_size = 1
num_layers = 1
seq_len = 5# dictionary
idx2char = ['e', 'h', 'l', 'o']
x_data = [1, 0, 2, 2, 3]  # hello
y_data = [3, 1, 2, 3, 2]  # ohlol# 独热向量
one_hot_lookup = [[1, 0, 0, 0],[0, 1, 0, 0],[0, 0, 1, 0],[0, 0, 0, 1]]
x_one_hot = [one_hot_lookup[x] for x in x_data]  # 维度是seq * input_size# reshape the inputs to (seqLen,batchSize,inputSize)
inputs = torch.Tensor(x_one_hot).view(seq_len, batch_size, input_size)
# reshape the labels to (seqLen*batchSize,1)
labels = torch.LongTensor(y_data)# ===============构造模型====================
class Model(torch.nn.Module):def __init__(self, input_size, hidden_size, batch_size,num_layers =1):super(Model, self).__init__()# initial the parametersself.num_layers = num_layersself.batch_size = batch_sizeself.input_size = input_sizeself.hidden_size = hidden_size# shape of inputs: (batchSize,inputSize)# shape of hidden: (batchSize,hiddenSize)self.rnn = torch.nn.RNN(input_size=self.input_size,hidden_size=self.hidden_size,num_layers=self.num_layers)def forward(self, input):# shape of hidden:(numLayers,batchSize,hiddenSize)hidden = torch.zeros(self.num_layers,self.batch_size,self.hidden_size)out,_ =self.rnn(input,hidden)# reshape out to: (seqLen*batchSize,hiddenSize)return out.view(-1,self.hidden_size)# 生成默认的h0def init_hidden(self):return torch.zeros(self.batch_size, self.hidden_size)net = Model(input_size, hidden_size, batch_size,num_layers)# ===============损失和优化器====================
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(),lr=0.1)# ===============训练模型====================
# inputs 的维度是(seqLen,batchSize,inputSize) 按seqLen进行循环
# input 的维度是(batchSize,inputSize)
# labels 的维度是(seqSize,1)
# label 的维度是(1)
for epoch in range(15):optimizer.zero_grad()outputs = net(inputs)loss = criterion(outputs,labels)loss.backward()optimizer.step()# 把hidden中最大值的下标找到_, idx = outputs.max(dim=1)idx = idx.data.numpy()print('Predicted;',''.join([idx2char[x] for x in idx]), end='')print(', Epoch[%d/15] loss=%.4f' %(epoch+1, loss.item()))

输出结果

Predicted; lllll, Epoch[1/15] loss=1.3361
Predicted; lllll, Epoch[2/15] loss=1.1672
Predicted; ohlll, Epoch[3/15] loss=1.0181
Predicted; ohlll, Epoch[4/15] loss=0.8844
Predicted; ohlol, Epoch[5/15] loss=0.7967
Predicted; ohloo, Epoch[6/15] loss=0.7348
Predicted; ohloo, Epoch[7/15] loss=0.6838
Predicted; ohloo, Epoch[8/15] loss=0.6443
Predicted; ohloo, Epoch[9/15] loss=0.6131
Predicted; ohlol, Epoch[10/15] loss=0.5868
Predicted; ohlol, Epoch[11/15] loss=0.5629
Predicted; ohlol, Epoch[12/15] loss=0.5373
Predicted; ohlol, Epoch[13/15] loss=0.5034
Predicted; ohlol, Epoch[14/15] loss=0.4587
Predicted; ohlol, Epoch[15/15] loss=0.4225

embedding嵌入层

独热编码的缺点

  • 高纬度
  • 向量稀疏
  • 硬编码

由此引出了Embedding嵌入层,把高维的稀疏的样本映射到稀疏的稠密的空间里

在这里插入图片描述

接下来看一下数据降维的方式

embedding的原理是使用矩阵乘法来进行降维,从而达到节约存储空间的目的。

假设inputSizeinputSizeinputSize是4维的,embeddingSizeembeddingSizeembeddingSize是5维的,我们想要4维转换成5维,就构建一个矩阵

在这里插入图片描述

在这个矩阵中我们可以做出查询,比如查询索引为2,Embedding Layer就把一整行的向量输出

在这里插入图片描述

https://blog.csdn.net/qq_36722887/article/details/118613262

https://blog.csdn.net/qq_41775769/article/details/121825668?ops_request_misc=&request_id=&biz_id=102&utm_term=Embedding&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-121825668.nonecase&spm=1018.2226.3001.4187


下面我们使用embedding嵌入层和linear layer线型层来优化RNN

在这里插入图片描述

embedding参数中,有以下的内容

在这里插入图片描述

前两个参数是指输入的维度和embedding维度,构成了矩阵的维度

在这里插入图片描述

输入是(seg*batch)的向量,输出就是((seg*batch)embedding_dim)

线型层参数如下

在这里插入图片描述

交叉熵参数

在这里插入图片描述

网络结构如下

在这里插入图片描述

在这个例子中我们使用了batch_first=True

在这里插入图片描述

全连接层中

在这里插入图片描述

最后把输出变成矩阵形式

在这里插入图片描述

代码演示

import torch# ===============准备数据====================
num_class = 4  # 类别
input_size = 4  # 输入
hidden_size = 8  # 输出
embedding_size = 10  # 嵌入层
num_layers = 2  # 2层RNN
batch_size = 1
seq_len = 5  # 序列长度# dictionary
idx2char = ['e', 'h', 'l', 'o']
x_data = [[1, 0, 2, 2, 3]]  # hello  (batch,seqLen)
y_data = [3, 1, 2, 3, 2]  # ohlol  (batch*seqLen)
inputs = torch.LongTensor(x_data)
labels = torch.LongTensor(y_data)# ===============构造模型====================
class Model(torch.nn.Module):def __init__(self):super(Model, self).__init__()# matrix of Embedding: (inputSize,embeddingSize)self.emb = torch.nn.Embedding(input_size, embedding_size)# batch_First=True   input of RNN:(batch,seqLen,embeddingSize)   output of RNN:(batchSize,seqLen,hiddenSize)self.rnn = torch.nn.RNN(input_size=embedding_size, hidden_size=hidden_size, num_layers=num_layers,batch_first=True)# input of FC layer:(batchSize,seqLen,hiddenSize)  output of FC layer:(batchSize,seqLen,numClass)self.fc = torch.nn.Linear(hidden_size, num_class)def forward(self, x):hidden = torch.zeros(num_layers, x.size(0), hidden_size)# input should be LongTensor:(batchSize,seqLen)x = self.emb(x)  # output of shape :(batch,seqLen,embeddingSize)x, _ = self.rnn(x, hidden)x = self.fc(x)# reshape result to use Cross Entropy Loss: (batchSize*seqLen,numClass)return x.view(-1, num_class)# 生成默认的h0def init_hidden(self):return torch.zeros(self.batch_size, self.hidden_size)net = Model()# ===============损失和优化器====================
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.05)# ===============训练模型====================for epoch in range(15):optimizer.zero_grad()outputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()# 把hidden中最大值的下标找到_, idx = outputs.max(dim=1)idx = idx.data.numpy()print('Predicted;', ''.join([idx2char[x] for x in idx]), end='')print(', Epoch[%d/15] loss=%.4f' % (epoch + 1, loss.item()))

输出结果

Predicted; lleel, Epoch[1/15] loss=1.4850
Predicted; lllll, Epoch[2/15] loss=1.1580
Predicted; lllll, Epoch[3/15] loss=0.9671
Predicted; lhlll, Epoch[4/15] loss=0.7869
Predicted; ohlol, Epoch[5/15] loss=0.6619
Predicted; ohlol, Epoch[6/15] loss=0.5250
Predicted; ohlol, Epoch[7/15] loss=0.4078
Predicted; ohlol, Epoch[8/15] loss=0.3297
Predicted; ohlol, Epoch[9/15] loss=0.2575
Predicted; ohlol, Epoch[10/15] loss=0.2005
Predicted; ohlol, Epoch[11/15] loss=0.1565
Predicted; ohlol, Epoch[12/15] loss=0.1194
Predicted; ohlol, Epoch[13/15] loss=0.0863
Predicted; ohlol, Epoch[14/15] loss=0.0588
Predicted; ohlol, Epoch[15/15] loss=0.0423

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

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

相关文章

ES6 模块化、webpack、@ 代表src目录的设置

文章目录webpackSource Map 代表src目录的设置ES6 模块化要求默认 导出默认导入按需 导出、导入混合使用直接导入 并执行模块中的代码webpack 默认 约定&#xff1a; 自定义 打包的 入口与出口 const path require(path) // 导入node.js中 专门操作路径的模块 module.expor…

哺乳时宝宝一边吃奶,另一边却自动流出来,这是怎么回事?

别人眼中的母乳喂养只是简单地把宝宝抱在怀里&#xff0c;让宝宝吃饱&#xff0c;超级简单。事实上&#xff0c;有很多母乳喂养。“麻烦事”比如母乳不足、堵奶、乳腺炎等&#xff0c;甚至更多“简单”漏奶会让宝宝头疼。有些妈妈很幸运&#xff0c;不知道什么是漏奶&#xff0…

基于Java+SpringBoot+vue等疫情期间网课管理系统详细设计和实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取联系&#x1f345;精彩专栏推荐订阅收藏&#x1f447;&…

Git Bash Here和RStudio软件的问题解决

Git Bash Here和RStudio软件的问题解决 文章目录Git Bash Here和RStudio软件的问题解决0、 写在前面1、Git软件在任务栏图标空白2、RStudio软件2.1 警告信息InormalizePath(path.expand(path),winslash,mustWork)2.2 incomplete final line found by readTableHeader on报错3、…

为啥devc++程序运行正确返回不为0?而返回了一个特别大的数,详解。

例如运行以下程序: #include #include typedef char ElemType; typedef struct BiTNode{ char data; struct BiTNode *lchild; struct BiTNode *rchild; int DescNum;}BiTNode ,*BiTree; void CreateBiTree(BiTree *T) { char ch; scanf("%c",&ch); if(ch ){…

力扣(LeetCode)207. 课程表(C++)

拓扑排序 根据示例看出&#xff0c;课程表是否存在环&#xff0c;是问题的关键。这题的环&#xff0c;和数组、链表的环不一样&#xff0c;不好判&#xff0c;要转化成图判拓扑序列。 考虑向右和向左的方向&#xff0c;拓扑序列的所有边可以指向同一方向。 无环图进行重排序…

第一章:绪论

一、数据库系统概述 1、【单选题】记录内有结构&#xff0c;整体无结构&#xff0c;属于计算机发展过程的哪一阶段 正确答案&#xff1a; C 2、【单选题】数据库系统最小访问单位是 正确答案&#xff1a; C 3、【多选题】数据库管理系统提供的数据控制功能包括 正确答案&…

不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动

文章目录一、前言二、系列文章三、准备工作3.1 挑选I2C引脚3.2 测试设备&#xff1a;QMI8658C四、编写设备树节点4.1 查找MUX4.2 修改i2c1引脚配置4.2.1 修改前4.2.2 修改后五、编译、烧录dt.img5.1 烧录后效果六、编写test程序6.1 创建文件6.2 源码&#xff1a;Android.mk6.3 …

Docker常用操作命令总结(一)

文章目录一、Docker的应用场景二、Docker 的优点三、Docker 架构四、安装Docker1、更新 apt 包索引2、安装docker3、安装完成之后&#xff0c;运行命令sudo docker info&#xff0c;检查安装状态4、有可能&#xff0c;第一次需要手动启动服务.就需要执行下面的命令&#xff0c;…

图像处理:制作你的专属卡通头像和LOGO(圣诞节特别篇)

目录0 前言1 安装与贴图2 算法原理2.1 计算像素频率2.2 计算像素相对距离2.3 计算合适贴图3 配置功能4 使用&#xff1a;以圣诞老人为例0 前言 Tiler是一种使用各种其他较小图像平铺创建新图像的工具&#xff0c;它与其他马赛克工具不同&#xff0c;因为它可以适应多种形状、大…

基于Xlinx的时序分析与约束(5)----衍生时钟约束

衍生时钟约束语法 衍生时钟&#xff08;Generated Clocks&#xff0c;又称为生成时钟&#xff09;是指由设计中已有的主时钟通过倍频、分频或者相移等操作后产生的新的时钟信号&#xff0c;如由MMCM或PLL或由组合逻辑生成的倍、分频时钟信号。 衍生时钟约束必须指定时钟源&…

【正点原子I.MX6U-MINI移植篇】rootfs移植过程详解(三)

Linux三巨头己经完成了2个了&#xff0c;就剩最后一个rootfs&#xff08;根文件系统&#xff09;了&#xff0c;根文件系统的组成以及如何构建根文件系统是Liux移植的最后一步&#xff0c;根文件系统构建好以后就意味着我们己经拥有了一个完整的、可以运行的最小系统。以后我们…

程序员高手解决问题,都是从正确的提问开始

回顾各大技术网站、社区、问答&#xff0c;我们发现&#xff1a;真正的程序员高手都极度擅长提问。 好的提问不但能得到建设性的解决方案&#xff0c;更加能激发人们的好奇心、创造力和学习的动力。 毫不夸张地说&#xff0c;会提问的程序员一开口就赢了&#xff01; 所以今…

QT基本组件与常用类

目录 一、设计师 Designer&#xff08;掌握&#xff09; 二、布局 Layout 2.1 布局的基本使用&#xff08;掌握&#xff09; 2.2 布局属性&#xff08;掌握&#xff09; 2.3 伸展器&#xff08;掌握&#xff09; 2.4 嵌套&#xff08;掌握&#xff09; 2.5 伸展与策略&#xff…

分布式缓存的四大痛点

目前开发中经常用到的缓存&#xff0c;是我们必不可缺的&#xff0c;他大大的提高了我们整个项目的响应速度和并发量。但是带来好处的同时&#xff0c;也给我们带了了新的问题&#xff1a;缓存穿透、缓存击穿、缓存雪崩以及缓存一致性这么四个问题&#xff0c;也是分布式缓存的…

IT大侦“碳”:VxRail的可持续法宝

环境Environmental      社会责任Social Responsibility      企业治理Corporate Governance      随着碳达峰、碳中和的逐步推进,越来越多的“大厂”或各行业的明星企业都开始重视自己的ESG报告,已然成为了商界新风尚。      可持续发展战略也与前沿技术密切相…

Java项目:Springboot体育器材管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 体育器材管理系统主要包含以下功能&#xff1a; 登录注册&#xff1b; 体育器材管理&#xff1a;显示器材表、显示价目表、显示供应商表&#x…

4.2、网络层提供的两种服务

1、面向连接的虚电路服务 虚电路服务的核心思想&#xff1a;可靠通信由网络自身来保证\color{red}可靠通信由网络自身来保证可靠通信由网络自身来保证 当两台计算机进行通信时&#xff0c;必须建立网络层的连接\color{red}网络层的连接网络层的连接----虚电路VC\color{red}虚…

Java+SpringBoot电影订票系统(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用技术后台&#xff1a;SpringBoot、Spring、Springmvc、Springdata、MySQL数据库、前台&#xff1a;FreeMarker、css、Javascript等&#xff0c;项目含有源码、论文、配套开发软件、软件安装教程、项目发布教程等 项目功能介绍&#xff1a; 本系统主要的…

Hi,运维,你懂Java吗--No.4:JVM-概述

作为运维&#xff0c;你不一定要会写Java代码&#xff0c;但是一定要懂Java在生产跑起来之后的各种机制。 本文为《Hi&#xff0c;运维&#xff0c;你懂Java吗》系列文章 第四篇&#xff0c;敬请关注后续系列文章 欢迎关注 龙叔运维&#xff08;公众号&#xff09; 持续分享运…