跟着刘二大人学pytorch(第---12---节课之RNN基础篇)
文章目录
- 0 前言
- 0.1 课程视频链接:
- 0.2 课件下载地址:
- 1 Basic RNN
- 1.1 复习DNN和CNN
- 1.2 直观认识RNN
- 1.3 RNN Cell的内部计算方式
- 2 具体什么是一个RNN?
- 3 使用pytorch构造一个RNN
- 3.1 手动构造一个RNN Cell来实现RNN
- 3.2 直接使用torch中现有的RNN模块来实现RNN
- input维度
- h0维度
- output维度
- hn维度
- numLayers的解释
- 代码注释
- 参数配置
- 模型构造
- 输入序列的构造
- 隐藏层的构造
- 输出的解释
- 最后一个隐藏层输出的解释
- 执行代码的结果
- 例子1:训练一个RNN 做seq2seq任务
- 第1步 字符向量化
- 参数配置
- 准备数据
- 设计模型
- 构造损失函数和优化器
- 设置训练Cycle
- 改变数据
- Embedding
- 例12-3 使用embedding和线性层的RNN
- 构造模型、损失函数、优化器
- 训练
- 练习1:LSTM
- 联系2:GRU
0 前言
0.1 课程视频链接:
《PyTorch深度学习实践》完结合集
大佬的笔记:大佬的笔记
pytorch=0.4
0.2 课件下载地址:
链接:https://pan.baidu.com/s/1_J1f5VSyYl-Jj2qIuc1pXw
提取码:wyhu
1 Basic RNN
1.1 复习DNN和CNN
全连接网络也称为稠密网络,Dense Network,也称为Deep Neural Network
现在有一个表,里面的数据是每天每隔一个小时的天气数据,平均温度,气压,预测目标是是否下雨
根据某一时刻的温度和气压数据预测该时刻是否下雨,这件事情意义不太大,预测下雨这件事应提前进行预测。
我们需要若干天(如3天)的数据作为模型的输入,其中每一天的数据应该包含若干个(如3个)特征。
使用全连接进行预测。如果序列很长且x1,x2,x3的维度很高的话,这对网络的训练是一个很大的挑战,原因是全连接网络是稠密的网络,里面的权重是最多的。
CNN中输入通道是128,输出通道是64,使用的是5×5的卷积,权重为25×2^13=20w,
全连接层假设输入是4096,输出是1024,则全连接权重为4096*1024=420w,这样的比较CNN使用的参数要少得多
因此在使用神经网络时需要明确一点:全连接网络的参数在神经网络中所占的比例是最大的,所以之后计算存储、推理很大的瓶颈是来自全连接层
CNN中使用的参数为什么较少呢:有 权重共享的概念
假如在处理视频时,每一帧的图像如果都使用全连接网络去处理,那参数量将是天文数字,这种方法是不可行的
RNN是专门处理序列型的数据,也会使用权重共享的概念,减少需要训练的权重的数量
x1,x2,x3是一个序列,是有先后顺序,x2部分依赖x1,x3部分依赖x2,RNN来处理序列相关的数据,类似于语言、天气、股票
理解语言需要依赖文字的顺序
回顾一下CNN
1.2 直观认识RNN
例如输入xt的维度是3维的,经过RNN Cell之后输出的ht是5维的,那么RNN Cell本质上还是一个线性层,但是和普通的线性层的区别是RNN Cell这个线性层的权重是共享的。
h0是先验知识,如果有先验知识的话就需要将先验知识作为h0输入给RNN,如图生文本,CNN+FC处理图像,生成h0,再传给RNN,此时即可做“看图说话”
如果没有先验知识的话,直接将h0的维度设置为和ht的维度一样,然后设置成0向量即可。
上图中的RNN Cell是同一个
用代码来表示是上面这样的,x是需要从X中循环的
1.3 RNN Cell的内部计算方式
Whhht-1+bhh 和Wihxt+bih是两个线性层,他们可以合并成一个线性层,见上图的红色公式
即上式可以简写。
2 具体什么是一个RNN?
把RNN Cell以循环的方法,把序列送进去,依次算出隐层的过程称为一个循环神经网络。
3 使用pytorch构造一个RNN
两种方法:1、自己构造RNN Cell,然后写来处理序列的循环 2、直接使用RNN
3.1 手动构造一个RNN Cell来实现RNN
创建一个Cell的方式
创建一个RNN Cell需要的参数:输入的维度,隐藏层的维度
构造完cell之后,一个cell的输入是x和上一个隐藏状态,两者的维度要求见下图
例如一个RNNCell的配置为
因此输入的构造见下图
隐藏状态的构造见下图
序列数据的维度的构造应该如下
代码:
torch.randn用法:torch.randn()函数
示例代码:
import torch# 定义配置项
batch_size = 5
seq_len = 3
input_size = 4
hidden_size = 2# 构造一个RNN Cell
cell = torch.nn.RNNCell(input_size = input_size, hidden_size = hidden_size)print(cell)# 生成5个序列长度为3,每个token的为4的张量作为1个batch
dataset = torch.randn(seq_len, batch_size, input_size)
print(dataset)hidden = torch.zeros(batch_size, hidden_size)
print(hidden)for idx, input in enumerate(dataset):print("="*20, idx, "="*20)print("input size:", input.shape)hidden = cell(input, hidden)print("output size:", hidden.shape)print(hidden)
输出:
D:\Anaconda3\envs\env_pytorch04\python.exe "D:/000 简历/000 自己的项目/3 刘二教程/第12节课 手动定义一个RNN Cell.py"
RNNCell(4, 2)
tensor([[[ 0.4408, -0.7577, 0.9077, -0.0779],[ 0.5080, -0.1057, 0.5581, -0.4546],[ 0.8382, 1.3444, 1.1445, -2.0313],[ 0.4016, 1.0184, 0.0556, 0.6046],[ 1.9827, 0.6735, -0.6609, -0.0764]],[[-0.8133, -1.3837, -0.6933, -0.6390],[ 0.7617, -0.2478, -0.1682, -1.2478],[ 0.1389, -0.5334, 1.7906, 0.8992],[-0.7540, 0.0293, -0.5835, 1.0606],[-0.5817, 0.2823, -1.0507, 0.3087]],[[-0.5872, 0.1241, -0.2446, -0.5430],[-0.6749, 0.6816, -0.1754, -1.1233],[ 0.1708, -1.6483, 0.8012, 0.3567],[-0.1961, -1.0277, -0.2133, -0.7144],[-1.3309, 0.6177, 1.5205, -0.4169]]])
tensor([[0., 0.],[0., 0.],[0., 0.],[0., 0.],[0., 0.]])
==================== 0 ====================
input size: torch.Size([5, 4])
output size: torch.Size([5, 2])
tensor([[-0.2558, -0.4498],[-0.3951, 0.0840],[ 0.1652, 0.9352],[-0.8041, -0.1019],[-0.6620, 0.7436]], grad_fn=<TanhBackward0>)
==================== 1 ====================
input size: torch.Size([5, 4])
output size: torch.Size([5, 2])
tensor([[-0.8441, -0.6020],[-0.6114, 0.6291],[-0.3331, -0.8504],[-0.9706, -0.8207],[-0.9807, -0.4315]], grad_fn=<TanhBackward0>)
==================== 2 ====================
input size: torch.Size([5, 4])
output size: torch.Size([5, 2])
tensor([[-0.8825, -0.1003],[-0.9137, 0.3993],[-0.2900, -0.8324],[-0.7844, -0.2764],[-0.7202, -0.4915]], grad_fn=<TanhBackward0>)进程已结束,退出代码为 0
注意:输出中的下列张量,每一个块儿是一个batch,一个块儿是5个向量,表示1个batch是5个输入
tensor([[[ 0.4408, -0.7577, 0.9077, -0.0779],[ 0.5080, -0.1057, 0.5581, -0.4546],[ 0.8382, 1.3444, 1.1445, -2.0313],[ 0.4016, 1.0184, 0.0556, 0.6046],[ 1.9827, 0.6735, -0.6609, -0.0764]],[[-0.8133, -1.3837, -0.6933, -0.6390],[ 0.7617, -0.2478, -0.1682, -1.2478],[ 0.1389, -0.5334, 1.7906, 0.8992],[-0.7540, 0.0293, -0.5835, 1.0606],[-0.5817, 0.2823, -1.0507, 0.3087]],[[-0.5872, 0.1241, -0.2446, -0.5430],[-0.6749, 0.6816, -0.1754, -1.1233],[ 0.1708, -1.6483, 0.8012, 0.3567],[-0.1961, -1.0277, -0.2133, -0.7144],[-1.3309, 0.6177, 1.5205, -0.4169]]])
假如有数据集:
1、我爱你
2、我恨你
3、我吃了
4、我没吃
5、我饿了
。。。。还有其他数据
分词之后:
1、“我”,“爱”,“你”
2、“我”,“恨”,“你”
3、“我”,“吃”,“了”
4、“我”,“没”,“吃”
5、“我”,“饿”,“了”
…
每个词有各自的词向量
配置项中设置每个batch的大小是5,选择前5句话作为1个batch,每句话的序列长度都是3,其中每个词的维度都是4
则1个batch用数字表示就是
tensor([[[ 0.4408, -0.7577, 0.9077, -0.0779], # 我 【1】[ 0.5080, -0.1057, 0.5581, -0.4546], # 我 [ 0.8382, 1.3444, 1.1445, -2.0313], # 我[ 0.4016, 1.0184, 0.0556, 0.6046], # 我[ 1.9827, 0.6735, -0.6609, -0.0764]], # 我[[-0.8133, -1.3837, -0.6933, -0.6390], # 爱 【1】[ 0.7617, -0.2478, -0.1682, -1.2478], # 恨[ 0.1389, -0.5334, 1.7906, 0.8992], # 吃[-0.7540, 0.0293, -0.5835, 1.0606], # 没[-0.5817, 0.2823, -1.0507, 0.3087]], # 饿[[-0.5872, 0.1241, -0.2446, -0.5430], # 你 【1】[-0.6749, 0.6816, -0.1754, -1.1233], # 你[ 0.1708, -1.6483, 0.8012, 0.3567], # 了[-0.1961, -1.0277, -0.2133, -0.7144], # 吃 [-1.3309, 0.6177, 1.5205, -0.4169]]]) # 了
暂时忽略同一个词不同词向量这个问题,以上只示意
3.2 直接使用torch中现有的RNN模块来实现RNN
cell = torch.nn.RNN(input_size = inputsize, hidden_size = hidden_size, num_layers = num_layers)
num_layers可以设置RNN是多少层的,层数也不能选太多,因为比较耗时
out,hidden = cell(inputs,hidden)
inputs是包含整个输入序列,out就是输出的整个序列(h1,h2,…,hN),第1个hidden就是hN,第2个hidden就是h0,具体可以见下图
总结:上图中cell输入h0,x1,x2,…,xN,输出h1,h2,…,hN和hN
维度要求,见下图:
其中numLayers指的就是RNN是多少层的,这个确实有指明的必要,因为RNN有多少层,h就得有多少层
input维度
h0维度
output维度
hn维度
numLayers的解释
同一种颜色的cell是同一个cell,下面例子中的模型看着很复杂,实际就只是3个线性层
代码注释
参数配置
模型构造
输入序列的构造
隐藏层的构造
输出的解释
最后一个隐藏层输出的解释
执行代码的结果
batch_first设置为True的话,在构造数据时需要将batch_size和seq_len进行交换,为什么有这个选项,是因为有些时候这种方式更方便构造数据集(具体原因可再细查),见下图
将batch_first设置为True的情况,代码和代码执行结果见下图:
可以看出batch_size和seq_len交换了位置
例子1:训练一个RNN 做seq2seq任务
任务训练一个RNN模型,输入是hello,输出是ohlol
第1步 字符向量化
使用one-hot表示,每个字符使用词表大小的向量来表示
inputsize = 4
输入的向量维度为4,输出的应该是这4个字符的类别,因此可以令输出向量的维度也为4,这样通过一个softmax即可进行多分类,下图中的输出上写的数字是每个每个输出应该被分类的类别,如o应该被归为第3类,l应该被归类为第1类,等等
预测的向量与真实的向量做一个交叉熵损失值,如下图
参数配置
准备数据
idx2char是一个字典,值为字符,可使用索引作为键
lookup是一个查询表,例如:词表中e的索引为0,则e使用one-hot表示就是lookup中第0行的向量,o的索引为3,则o使用one-hot表示就是lookup中第3行的向量
x_one_hot是将x_data中每个索引对应的字符都表示为one-hot向量,它的维度应该是seq_len×inputsize,因为x_data的维度是seq_len,one-hot向量的维度是inputsize
下面这个图中所写的(seqLen,1)应该是写错了,没有写batchsize的大小,
实际上应该写成(seqLen,batchSize,hiddenSize),即(-1,1,4),为什么这么写的原因可以见下图:
设计模型
1、初始化参数
2、RNNCell的输入输出维度要求
3、初始化h0
这里面的参数有一个batch_size,只有在构造h0的时候才会需要用到,在初始化和forward的时候不会用到这个参数
构造损失函数和优化器
使用交叉熵作为损失函数,Adam作为优化器
设置训练Cycle
optimizer.zero_grad():优化器的梯度归零
每一个epoch开始之后先算一个h0,对于每一步的损失值都加到一起,loss.backup进行梯度的反向传播,参数更新
注意下列数据的维度大小
lable只要给出类别数字即可,不需要one-hot,原因在于交叉熵的过程,这个地方需要查一下CrossEntropyLoss()
的操作
hidden.max()就是找hidden中的找最大值,hidden是4维的向量
例2 使用RNN Module
改变数据
训练结果如下:
Embedding
associate:v.联系;联合;联想;交往;表示同意;(尤指)混在一起;表明支持;
one-hot表示的缺点:
1、维度太高(字符级:字符集ASIIC 128维 单词级:几万维)
2、过于稀疏
3、硬编码的,这个词向量并不是学习出来的
Embedding层是将高维的稀疏的样本向量映射到低维的稠密的空间中,这就是降维
嵌入层降维的方式:输入一个索引,通过查表来找到对应的向量,找的方法是通过将lookup表与一个one-hot向量进行想乘,然后得出最后的嵌入向量
例12-3 使用embedding和线性层的RNN
有时候的输出的隐藏层h的维度与类别的维度o不一致,所以可以添加Linear Layer,将h的维度映射为o的维度
下面的batch_first = True
只要知道有这种用法即可
参数配置:
输入和输出:
构造模型、损失函数、优化器
训练
出现ohlol比以前更早了,是因为使用了更厉害的模型,学习能力更强
练习1:LSTM
LSTM中的这些个门儿
,实际上这么多次专业名词总会使人感觉到这个模型很难学习,实际不难,只需看公式即可
为什么有用?
因为提供了下面这样的路径,有利于梯度传播,有了记忆单元所以减少梯度消失
LSTM比RNN效果好得多,因为计算复杂,时间复杂度高
联系2:GRU
GRU是一个折中的方法,比LSTM的计算速度快
以上学习RNN需要重视的是
1、了解序列数据的维度情况
2、循环过程用到的权重共享机制
相关文章:
跟着刘二大人学pytorch(第---12---节课之RNN基础篇)
文章目录 0 前言0.1 课程视频链接:0.2 课件下载地址: 1 Basic RNN1.1 复习DNN和CNN1.2 直观认识RNN1.3 RNN Cell的内部计算方式 2 具体什么是一个RNN?3 使用pytorch构造一个RNN3.1 手动构造一个RNN Cell来实现RNN3.2 直接使用torch中现有的RN…...
父亲节 | 10位名家笔下的父亲,读懂那份孤独而深沉的父爱
Fathers Day 母爱如水,父爱如山。 相对于母爱的温柔,父亲的爱多了几分静默和深沉。 读完10位名家笔下的父亲,我们就会明白,到底亏欠了父亲多少。 不要让自己有“子欲养而亲不待”的后悔和遗憾, 多给父亲一些爱的表示&a…...
股市中的牛市和熊市是什么?它们是怎么来的?
中文版 股市中的牛市和熊市 定义 牛市: 牛市指的是金融市场中证券价格普遍上升或预期上升的时期。这个术语最常用于股票市场,但也可以适用于交易的其他资产,如债券、货币和商品。特征: 投资者信心增加。交易量上升。积极的经济指…...
基于51单片机万年历设计—显示温度农历
基于51单片机万年历设计 (仿真+程序+原理图+设计报告) 功能介绍 具体功能: 本系统采用单片机DS1302时钟芯片LCD1602液晶18b20温度传感器按键蜂鸣器设计而成。 1.可以显示年月日、时分秒、星期、温度值。…...
springboot-自定义properties文件
在springboot中,如果我们想加载外部的配置文件,但是又不想与其他的配置文件产生明显的耦合,那么我们可以把这些配置文件,单独弄成一个独立的配置文件,比如下面的配置文件,我们想把这些配置移动到user.prope…...
java类的访问权限
在java中,针对类,成员方法和属性,java提供了4种访问控制权限,分别是private,default,protected和public。 这四种访问控制权限按级别由低到高的次序排列分别是privae,default,protected,public private:私有访问权限,…...
【SpringBoot + Vue 尚庭公寓实战】标签和配套管理接口实现接口实现(六)
【SpringBoot Vue 尚庭公寓实战】标签和配套管理接口实现接口实现(六) 文章目录 【SpringBoot Vue 尚庭公寓实战】标签和配套管理接口实现接口实现(六)1、保存或更新标签信息2、根据id删除标签信息3、根据类型查询配套列表4、新…...
Web前端中横线:深入探索与实际应用
Web前端中横线:深入探索与实际应用 在Web前端开发的广袤领域中,中横线这一看似简单的元素,实则蕴含着丰富的设计哲学和技术实现。本文将从四个方面、五个方面、六个方面和七个方面,对中横线在Web前端中的应用进行深入剖析&#x…...
鸿蒙 游戏来了 鸿蒙版 五子棋来了 我不允许你不会
团队介绍 作者:徐庆 团队:坚果派 公众号:“大前端之旅” 润开鸿生态技术专家,华为HDE,CSDN博客专家,CSDN超级个体,CSDN特邀嘉宾,InfoQ签约作者,OpenHarmony布道师,电子发烧友专家博客,51CTO博客专家,擅长HarmonyOS/OpenHarmony应用开发、熟悉服务卡片开发。欢迎合…...
国产MCU芯片(2):东软MCU概览及触控MCU
前言: 国产芯片替代的一个主战场之一就是mcu,可以说很多国内芯片设计公司都打算或者已经在设计甚至有了一款或多款的量产产品了,这也是国际大背景决定的。过去的家电市场、过去的汽车电子市场,的确国产芯片的身影不是很常见,如今不同了,很多fabless投身这个行业,一种是…...
气膜馆的保温措施—轻空间
气膜馆是一种新型的建筑形式,广泛应用于体育场馆、仓储、展览等多个领域。其主要特点是通过气体压力支撑膜结构,实现大跨度无柱空间。为了保证气膜馆在不同气候条件下的使用舒适性和能源效率,保温措施至关重要。以下是气膜馆常见的保温措施及…...
UniVue更新日志:使用Carousel组件实现轮播图效果
github仓库 稳定版本仓库:https://github.com/Avalon712/UniVue 开发版本仓库:https://github.com/Avalon712/UniVue-Develop UniVue扩展框架-UniVue源生成器仓库:https://github.com/Avalon712/UniVue-SourceGenerator 更新说明 今天的更…...
docker和docker compose 部署
一. 将微服务运行在docker上: 1.新建一个空文件夹docker-demo,在里面再新建文件夹app,在app目录下新建一个名为Dockerfile的文件。 2.编写Dockerfile文件 3.构建镜像 4.启动镜像 5.可以访问了。 二使用Dockerfile构建微服务镜像 1.将j…...
鸿蒙轻内核A核源码分析系列六 MMU协处理器(2)
3、MMU汇编代码 在arch\arm\arm\include\arm.h文件中,封装了CP15协处理器相关的寄存器操作汇编函数。我们主要看下MMU相关的部分。 3.1 CP15 C2 TTBR转换表基地址寄存器 代码比较简单,结合下图,自行查看即可。该图来自《ARM Cortex-A9 Tec…...
C# 集合(一) —— Array类
总目录 C# 语法总目录 集合一 Array 集合1. Array 类1.1 搜索1.2 排序1.3 翻转1.4 转换 集合 1. Array 类 //创建方式 //方式一 Array arr Array.CreateInstance(typeof(string), 3); arr.SetValue("lisi", 0); arr.SetValue("zhangsan", 1); arr.SetVa…...
World Map Globe Edition 2
只需点击几下,World Political Map - Globe Edition 2就会在场景添加一个美丽且交互式的3D世界地图。将地球预制件拖动到场景中并自定义外观。 完整的资产,具有强大的可视化功能、示例和丰富的API,适用于构建VR、桌面和移动游戏和应用程序。 主要功能: - 在不访问互联网的情…...
人类重启计划---19500630
一、引言 随着人类社会的发展,我们面临着诸多全球性挑战,如气候变化、资源匮乏、疾病爆发等。为了应对这些挑战,确保人类的生存和发展,我们提出人类重启计划。该计划旨在建立一个可持续、安全和繁荣的新世界。 二、目标 建立可持续发展的社会经济模式,确保资源的有效利用…...
苹果WWDC 2024 带来的 AI 风暴:从生产力工具到个人助理,AI 将如何融入我们的生活?
2024年6月5日,苹果WWDC 2024全球开发者大会如约而至,带来了众多令人兴奋的新功能和新产品。其中,AI 技术的全面融入无疑是最引人注目的亮点。从 iOS、iPadOS 到 macOS,再到 Siri 和开发者工具,苹果正在将 AI 融入到其生…...
SE语法总结博文(附思维导图)
Java中的规范 注释 //单行注释 /*多行注释 */ /**文档注释 */命名规范 命名时可以包含:字母、数字以及 下划线和 $ 符号等等。 但是不能以数字开头,也不能是关键字,且严格区分大小写。 类名:每个单词的首字母大写(大驼峰)&…...
STM32面试题
STM32面试题通常涉及STM32微控制器的特性、功能、应用以及编程知识。以下是一些可能的面试问题: STM32微控制器的基本介绍: STM32微控制器是由哪家公司生产的?STM32微控制器主要应用于哪些领域?STM32的特性和功能: STM32微控制器有哪些主要特性?请描述STM32的GPIO(通用输…...
【单片机】DS2431芯片,读写128个字节,程序
ds2431pt&r stm32读写程序: 部分程序: #include "sys.h" #include "delay.h" #include "usart.h"#include <stdio.h> #include <stdlib.h> #include <string.h>#include "sys.h" #incl…...
[DDR4] DDR 简史
依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR4》 存和硬盘,这对电脑的左膀右臂,共同扛起了存储的重任。内存以其超凡的存取速度闻名,但一旦断电,内存中的数据也会消失。它就像我们的工作桌面&…...
前端 CSS 经典:在 Vue3 中使用渐进式图片
1. 什么是渐进式图片 当我们网站会加载很多图片的时候,有些图片尺寸很大,加载就会很慢,会导致页面长时间陷入白屏状态,用户体验很不好。所以可以使用渐进式图片,先给用户展示模糊图,这些图尺寸小ÿ…...
毕业了校园卡怎么改套餐?
毕业了校园卡怎么改套餐? 毕业生校园卡99元套餐变更8元保号套餐教程 学弟学妹们恭喜毕业呀🎓 校园卡绑定了好多东西注销不掉又不想交高额月租的看过来。 今天一招教你更改校园卡套餐。 中国移动/电信/联通App 打开App,在首页右上角点击人工…...
每一个男人都曾有一个机器人的梦想
每一个男人都曾有一个机器人的梦想 我也有 每一个男人都曾有一个机器人的梦想。对于我来说,这个梦想始于童年时代,那时变形金刚风靡一时,几乎所有80后的孩子都为之疯狂。我是80后中的一员,那时候的科技还远没有如今这般发达&#…...
中望CAD 2025 (ZW3D2025) 简体中文修改版
名称:中望CAD 2025 (ZW3D2025) 简体中文修改版 描述:一款三维CAD设计工具,运行破解补丁ZW3D2025-2024-Patch执行修补。 链接:夸克网盘分享 📁 大小:3.2GB 🏷 标签:#PC软件 #CAD #设…...
CAN 通讯
波特率 波特率(Baud Rate)是指数据通信中每秒传输的符号(或脉冲)的数量。在CAN(Controller Area Network)通信中,波特率通常表示每秒传输的位数(bit per second,bps&…...
第零篇——数学到底应该怎么学?
目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 宏观讲解数学定位,数学学习方式方法,再次详细学习…...
Spring Boot顶层接口实现类注入项目的方法
1、背景 在项目中,我们通常会具有同一特性的业务类定义一个顶层接口,让业务类实现这个接口,通过接口规范来管理这些类。我们将这些实现接口的业务类交托给Spring容器接口后,有时候需要根据业务类型来选择动态选择对应的业务类阿里…...
JDBC介绍-AI问答(通义千问)
一、JDBC介绍 介绍JDBC JDBC(Java Database Connectivity)是Java中用于连接和操作关系型数据库的标准API(应用程序编程接口)。它是由Sun Microsystems(现在是Oracle的一部分)开发,并随Java Deve…...
投诉举报网站 建设方案/seo搜索优化推广
原标题:用于可解释机器学习的四个Python库【IT168 技术】我们知道,人工智能也可能存在偏差,随着大家对这一点的关注度越来越高,企业越来越需要能够对其模型产生的预测进行解释,了解模型本身是如何工作的。好的一点是&a…...
高明专业网站建设哪家好/国外免费推广网站有哪些
Aptana中的智能提示(Code Assist)是大家比较感兴趣的部分,也是它强于其他工具的重要部分。这里我再介绍几点。 一.快捷键 1.在Aptana中,你可以在文档的任何位置用 Alt/ 激活智能提示。 当然你也可以把它…...
网站建设与设计致谢/网络营销推广流程
这部分内容比较繁琐,但很简单,在此条理地介绍一下。 1.首先,介绍:对类中成员的访问方式 先举一个例子,了解水平访问和垂直访问 #include "iostream.h" using namespace std; class A { private: in…...
食品品牌推广方案/广东网站se0优化公司
IBM全球服务中心最近发布的一份白皮书描述了IBM技术研究院(Academy of Technology)为取得SOA实施的成功所运用的经验。具体地讲,他们关注于以下五个优先考虑事项: 以面向未来的眼光进行架构开发——对SOA实施来说,最需…...
卖挂的网站怎么做/手机怎么建自己的网站
Android 资源(Resources)访问有许多东西用来构建一个优秀的 Android 应用程序。除了应用程序的编码,你需要关注各种各样的资源,诸如你用到的各种静态内容,如位图,颜色,布局定义,用户界面字符串,…...
wordpress 缩略图截图/网站优化建议
2、51单片机MAX7219数码管显示C程序/***************************************************程序名称: MAX7219 C语言控制程序*程序功能: 3线串行控制8位共阴数码管*3线定义:DIN 串行数据输入* LOAD 数据锁存* CLK 时钟输入******************…...