5.系统学习-PyTorch与多层感知机
PyTorch与多层感知机
- 前言
- PyTroch 简介
- 张量(Tensor)
- 张量创建
- 张量的类型
- 数据类型和 dtype 对应表
- 张量的维度变换:
- 张量的常用操作
- 矩阵或张量计算
- Dataset and DataLoader
- PyTorch下逻辑回归与反向传播
- 数据表格
- DNN(全连结网络)
- 回归案例
- 模型创建
- 保存和加载模型
- 模型训练与验证
前言
这里先了解简单的概念,直接上手尝试。
下一节进行实战
链接: minst数据集分类
在之后第7节会分部分进行说明。
线性回归/逻辑回归可以看成最简单的深度学习网络:
- 网络包含一层全联接层
- 采用梯度下降更新网络权重(回归参数)
- 直到设定的迭代次数终止训练
重新回顾一下线性回归的内容,我们可以更加简单直观的理解深度学习。我们将采用当下学术以及工业界最流行深度学习框架 PyTorch,其语法简介,并且借鉴了很多成功设计,比如 Numpy 数组的概念及函数,使得我们可以将很多其他库(Numpy 等)的使用经验迁移到 PyTorch 中来。
- 了解 PyTorch
- Tensor 创建、类型、维度与操作
- Dataset
- PyTorch 下逻辑回归与反向传播
- 深层网络、非线性拟合能力
- 模型保存、读取
- 模型的分类、回归模型构建与训练
PyTroch 简介
PyTorch是由Meta(原Facebook)开源的深度学习框架,得益于其简洁干净的接口封装,与Numpy几乎一致化的向量操作,灵活且Pythonic的语法,用户群体增长非常迅速,2019年开始主流AI会议统计中采用Pytorch框架论文数量已经超过Tensorflow。原生Pytorch已经提供了非常全面的能力,包括模型搭建、训练、部署、分布式、线性代数运算等。
Pytorch安装非常简单,只需要进入官网:https://pytorch.org/, 选择你的操作系统、安装方法、硬件环境后,复制安装命令在终端下(terminal 或CMD)执行即可。需要注意的是,GPU用户需要提前安装Nvidia驱动,但不必安装CUDNN等加速组建,CUDNN等在进行Pytorch安装时候会自动安装其必要部分。
张量(Tensor)
在实际使用PyTorch的过程中,Tensor是我们操作的基本数据类型,其特性与Numpy Array几乎完全一致,只不过在pytorch中,能够通过进行梯度的计算与传播。在正式使用PyTorch进行深度学习建模之前,我们需要熟练掌握PyTorch中张量的基本操作。
#
导入PyTorch包import torch
import numpy as np
print(torch.__version__)
张量创建
# 通过列表创建t = torch.tensor([1, 2])
t
# 通过numpy 数组创建张量a = np.array((1, 2))
t1 = torch.tensor(a)
t1
# 通过生成器创建,与numpy 完全一致
torch.arange(9)
np.arange(9)
# 随机创建一个均值为0、标准差为1的数据,与numpy 完全一致
torch.randn(3, 4)
np.random.randn(3, 4)
# torch.Tensor与np.ndarray转换tensor = torch.tensor([1, 2])
print(tensor)
# tensor > numpy array
array = tensor.numpy()
print(array)
# numpy array > tensor tensor = torch.tensor(array)
print(tensor)
tensor = torch.from_numpy(array)
print(tensor)
张量的类型
在神经网络建模过程中,最常用的是torch.float 和 torch.long类型,其中float类型用于连续变量,long类型用于整数变量。
数据类型和 dtype 对应表
数据类型 | dtype |
---|---|
32bit 浮点数 | torch.float32 或 torch.float |
64bit 浮点数 | torch.float64 或 torch.double |
16bit 浮点数 | torch.float16 或 torch.half |
8bit 无符号整数 | torch.uint8 |
8bit 有符号整数 | torch.int8 |
16bit 有符号整数 | torch.int16 或 torch.short |
32bit 有符号整数 | torch.int32 或 torch.int |
64bit 有符号整数 | torch.int64 或 torch.long |
布尔类型 | torch.bool |
# 初始化一个tensor tensor = torch.arange(10)
print(tensor)
# 此时数据类型为long
tensor.dtype
# 一般的,深度学习模型要求的输入大部分为float类型﴾float32,单精度﴿
# 转化为float 类型,有两种办法# 1﴿
tensor.float()
# 2﴿
tensor.type(torch.float)
# 转换为长整型t.long()
# 转化为双精度浮点型t.double()
张量的维度变换:
- tensor.reshape方法,能够灵活调整张量的 size,和numpy中的reshape 特性一致
- 舍弃维度 tensor.squeeze ,与 numpy.squeeze 特性一致
- 添加维度 tensor.unsqueeze ,与 numpy.expand_dims 特性一致
- 维度顺序转换, tensor.transpose适用于两个维度互换, tensor.permute 适用于对所有维度重新排序
# reshape
x = torch.rand(4, 3, 2) x_reshpae = x.reshape(4, 6) print(x.shape, x_reshpae.shape)
# squeeze x = torch.rand(4, 1) print(x.shape, x.squeeze().shape)
# unsqueeze x = torch.rand(4) print(x.shape, x.unsqueeze(0).shape, x.unsqueeze(1).shape)
# transpose x = torch.rand(4, 3, 2) print(x.shape, x.transpose(1, 2).shape, # 将dim=1, dim=2 维度互换x.transpose(0, 2).shape # 将dim=0, dim=2 维度互换)
# permute x = torch.rand(4, 3, 2) print(x.shape, x.permute(1, 2, 0).shape # 将原本的1,2,0维度按照顺序重新排列)
张量的常用操作
# 创建张量
t2 = torch.tensor([[1, 2], [3, 4]])# 查看张量的属性
print(t2.numel()) # 总共有多少个元素 (num elements)
print(t2.shape) # 张量的形状 (等价于 .size())
print(t2.size()) # 张量的形状 (同 .shape)
print(t2.ndim) # 张量的维度数量 (number of dimensions)
# 注意:当需要计算的结果张量转化为单独的数值进行输出,需要使用.item。
n = torch.tensor(1.0)
print(n.shape) # 这是一个0维张量
print(n) # 需要采用item 方法将0维张量转化为数值
n.item()
# 张量的索引、切片与Numpy Array完全一致
data_1 = torch.arange(1, 15)print(data_1[1: 6]) # 索引其中2-7号元素,并且左包含右不包含
print(data_1[2:10:2]) # 索引其中3-11号元素,左包含右不包含,且隔1个数取1个
print(data_1[2::3]) # 从第3个元素开始索引,一直到结尾,并且每隔2个数取1个
# 有类似numpy.zeros函数a = torch.zeros(2, 3)
a z
# 有类似numpy.ones
b = torch.ones(2, 3)
b
np.concatenate#的第一个参数必须是一个元组或列表
# 张量拼接 torch.cat ,完全类似于
np.concatenate
torch.cat([a, b], 0) # 在第0个维度进行拼接
torch.cat([a, b], dim=1) # 在第1个维度进行拼接
矩阵或张量计算
# 元素级别的四则运算﴾+ */﴿,要求矩阵shape完全一致或者可以进行广播,与numpy array特性一致。x = torch.rand(4, 3)
y = torch.rand(4, 3) print((x + y).shape) print((x * y).shape)
# 矩阵乘法,可以用魔法符号 @ 或者使用torch.mm 方法print(x.shape, y.T.shape) print((x @ y.T).shape)
print((torch.mm(x, y.T).shape))
# batch 矩阵乘法, 可以用魔法符号@ 或者使用torch.bmm 方法batch_size = 4
x = torch.rand(batch_size, 3, 2)
y = torch.rand(batch_size, 2, 3) print((x@y).shape)
print((torch.bmm(x, y).shape))
Dataset and DataLoader
在PyTorch中,我们需要构造Dataset和DataLoader来迭代数据,训练模型,首先通过一个简单的案例讲解一下Dataset的使用.
from torch.utils.data import Dataset, DataLoader
class MyDataset(Dataset):def __init__(self, x, y):# 初始化,保存数据self.x = xself.y = ydef __len__(self):# 返回数据集样本个数return len(self.y)def __getitem__(self, item):# 根据索引获取数据,并进行必要的类型转换xi = torch.tensor(self.x[item]).float() # 转为浮点型张量yi = torch.tensor(self.y[item]).float() # 转为浮点型张量return xi, yi
X = np.random.rand(200, 12)
Y = np.random.rand(200, 1) ds = MyDataset(X, Y)
ds[120]
xi, yi = ds[0] print(xi.shape)
print(yi.shape)
dl = DataLoader(ds, batch_size=4, shuffle=True, # 是否乱序)
for batch_x, batch_y in dl: break print(batch_x.shape, batch_y.shape)
PyTorch下逻辑回归与反向传播
在学习逻辑回归课程时,我们了解到其优化过程采用的是梯度下降方法,现在我们就以逻辑回归为案例,讲解PyTorch下如何搭建模型,并进行训练。因为逻辑回归只具备线性分类能力,因此我们构造一个线性可分的数据集,数据只有两个特征(x1,x2),当两个特征下的取值都为1时,分类标签为1,其他时候分类标签为0。
数据表格
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
导入库import torch.nn as nn # 模型搭建import torch.nn.functional as F # 内部封装了非常多的计算函数import matplotlib.pyplot as plt
%matplotlib inline torch.manual_seed(1)
# 准备数据x = torch.tensor([[0,0],[1,0],[0,1],[1,1]]).float()
y = torch.tensor([0, 0, 1, 1]).float() class LRDataset(Dataset): def __init__(self, x, y): self.x = x self.y = y def __len__(self): return len(self.y) def __getitem__(self, item): return self.x[item], self.y[item] ds = LRDataset(x, y)
dl = DataLoader(ds, batch_size=4, shuffle=True) plt.scatter( x.data.numpy()[:, 0], #提取所有点的第一个坐标(x 轴坐标)x.data.numpy()[:, 1], #提取所有点的第二个坐标(y 轴坐标)c=y.data.numpy(), s=100, lw=0)
plt.show()
# 使用PyTorch中nn这个库来构建逻辑回归模型
import torch
import torch.nn as nnclass LogisticRegressionModel(nn.Module): def __init__(self, n_feature): super().__init__() # 必须执行的标准步骤self.linear = nn.Linear(n_feature, 1) # 线性层self.sigmoid = nn.Sigmoid() # sigmoid激活函数def forward(self, x): x = self.linear(x) pred = self.sigmoid(x) return pred # 初始化模型
model = LogisticRegressionModel(n_feature=2)
print(model)# 使用优化器SGD
optimizer = torch.optim.SGD(model.parameters(), # 需要优化的模型参数lr=0.1 # 学习率
)# 定义损失函数,采用二分类交叉熵损失
loss_func = torch.nn.BCELoss()
# 观察模型的输入与输出
for batch_x, batch_y in dl: # 从 DataLoader 中取出一个 batchbreak # 取出第一个 batch 后退出循环# 打印输入和输出的维度
print(f"输入维度: {batch_x.shape}") # 输入特征的维度
print(f"输出维度: {model(batch_x).shape}") # 模型输出的维度
print(f"标签维度: {batch_y.shape}") # 标签(真实值)的维度
print(f"model squeeze 输出维度: {model(batch_x).squeeze().shape}") # 模型输出的维度(降维后)# 说明
# 在计算损失函数时,将模型输出使用 squeeze 降低维度,以保持与标签的维度一致,从而正确计算 loss。
# 定义一个训练函数,训练过程中,根据loss,进行梯度下降
def train_fn(model, optimizer, dl):losses = [] # 用于存储每个批次的损失值for batch_x, batch_y in dl:# 模型预测pred = model(batch_x).squeeze() # 模型输出,并使用squeeze降维# 计算损失loss = loss_func(pred, batch_y)# 梯度清零optimizer.zero_grad()# 反向传播,计算梯度loss.backward()# 执行梯度下降,更新参数optimizer.step()# 获取损失值并保存到CPU中,避免GPU内存占用过多loss = loss.item() # 取出当前批次的损失值losses.append(loss) # 保存损失值# 返回平均损失和最后一次预测结果return np.mean(losses), pred
for t in range(1,201): loss, pred = train_fn(model, optimizer, dl) if t % 50 == 0: print(loss)
DNN(全连结网络)
逻辑回归&线性回归只包含一个线性层(需要注意,逻辑回归虽然对数据进行了sigmoid映射,但本质的分类平面依然是线性平面),不具备对非线性关系的拟合能力。DNN包括多个线性层和激活层,其中线性层通过学习一个映射矩阵,对输入进行线性映射,激活层使用ReLU,Tahn等非线性函数使得模型具备非线性建模能力。如果不加入激活层,只是简单的堆叠线性层,多层网络和单层网络本质上是等价的。
# ReLU 函数图像relu = torch.nn.ReLU() x = torch.arange(-1, 1, 0.1)
y = relu(x) plt.plot(x.numpy(), y.numpy())
# Tanh 函数图像tanh = torch.nn.Tanh()
x = torch.arange(-10, 10, 0.1)
y = tanh(x)
plt.plot(x.numpy(), y.numpy())
回归案例
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1) # 生成数据x
y = x.pow(2) + 0.2*torch.rand(x.size()) # 生成x对应的数据y plt.scatter(x.data.numpy(), y.data.numpy())
plt.show()
# 创建网络class Net(torch.nn.Module): def __init__(self, n_feature, n_hidden, n_output): super(Net, self).__init__() self.fc1 = torch.nn.Linear(n_feature, n_hidden) # 隐藏层self.activation = nn.ReLU() self.fc2 = torch.nn.Linear(n_hidden, n_output) # 输出层def forward(self, x): x = self.activation(self.fc1(x)) # 对隐藏层数据使用激活函数y = self.fc2(x) # 输出return y
net = Net(n_feature=1, n_hidden=10, n_output=1) # 定义网络print(net) # net architecture
optimizer = torch.optim.SGD(net.parameters(), lr=0.2) # 优化器loss_func = torch.nn.MSELoss() # 损失函数
# 这里我们没有使用Dataset和DataLoader,每次迭代使用全部数据。import matplotlib.pyplot as pltplt.ion() # 打开交互模式,便于动态更新绘图for t in range(100): # 训练100次prediction = net(x) # 将输入数据送入模型loss = loss_func(prediction, y) # 计算预测值和真实值的损失optimizer.zero_grad() # 梯度清零loss.backward() # 反向传播optimizer.step() # 梯度优化,更新参数if t % 20 == 0: # 每隔20次迭代更新一次绘图# 显示学习过程plt.cla() # 清除当前图形plt.scatter(x.data.numpy(), y.data.numpy()) # 绘制训练数据的散点图plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5) # 绘制拟合曲线plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'}) # 显示当前损失plt.pause(0.1) # 暂停0.1秒,用于更新绘图plt.ioff() # 关闭交互模式
plt.show() # 显示最终图像
模型创建
- 定义模型类
- 使用nn.Sequential 快速创建简单的顺序执行的模型
# 通常在定义比较复杂的模型时,我们倾向与使用定义模型类的方法# 在__init__ 中定义所有模型的组件# 在forward 中定义模型的计算图class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = torch.nn.Linear(2, 10) self.activation = nn.ReLU() self.fc2 = torch.nn.Linear(10, 1) def forward(self, x): x = self.activation(self.fc1(x)) x = self.fc2(x) return x net1 = Net()
print(net1)
# 简单的按顺序执行的模型我们可以采用nn.Sequential 定义net2 = nn.Sequential( nn.Linear(2, 10), nn.ReLU(), nn.Linear(10, 1)
) print(net2)
x = torch.rand(4, 2) print(net1(x).shape)
print(net2(x).shape)
保存和加载模型
#保存和加载模型
# 1. 当模型训练好后,保存模型参数`state_dict` torch.save(net1.state_dict(), 'model.bin') # 2. 加载模型时,首先初始化模型,再加载模型参数net1 = Net()
net1.load_state_dict(torch.load('model.bin'))
模型训练与验证
#模型训练与验证
net1.train() # 该语句让模型进入训练状态net1.eval() # 该语句让模型进入验证/预测状态
相关文章:
5.系统学习-PyTorch与多层感知机
PyTorch与多层感知机 前言PyTroch 简介张量(Tensor)张量创建张量的类型数据类型和 dtype 对应表张量的维度变换:张量的常用操作矩阵或张量计算 Dataset and DataLoaderPyTorch下逻辑回归与反向传播数据表格 DNN(全连结网络&#x…...
wpf 基于Behavior库 的行为模块
Microsoft.Xaml.Behaviors 是一个用于WPF(Windows Presentation Foundation)的行为库,它的主要作用是允许开发者在不修改控件源代码的情况下,为控件添加自定义的行为和交互逻辑。行为库的核心思想是通过定义可重用的行为组件&…...
【一文解析】新能源汽车VCU电控开发——能量回收模块
一、概述 VCU(Vehicle Control Unit,整车控制器)能量回收功能是新能源汽车(如纯电动汽车和混合动力汽车)中非常重要的一个环节。它主要是在车辆减速或制动过程中,将车辆的部分动能转化为电能,并…...
鸿蒙TCPSocket通信模拟智能家居模拟案例
效果图 一、智能家居热潮下的鸿蒙契机 在当下科技飞速发展的时代,智能家居已如浪潮般席卷而来,深刻地改变着我们的生活方式。从能依据环境光线自动调节亮度的智能灯具,到可远程操控、精准控温的智能空调,再到实时监测健康数据的智…...
【Spring Boot 实现 PDF 导出】
Spring Boot 实现 PDF 导出 在Spring Boot应用程序中实现PDF导出功能,可以选择多种库和技术栈。每种方法都有其优缺点,适用于不同的场景。以下是四种常见的方式:iText、Apache PDFBox、JasperReports 和 Thymeleaf Flying Saucer。我将详细…...
【Python】selenium结合js模拟鼠标点击、拦截弹窗、鼠标悬停方法汇总(使用 execute_script 执行点击的方法)
我们在写selenium获取网络信息的时候,有时候我们会受到对方浏览器的监控,对方通过分析用户行为模式,如点击、滚动、停留时间等,网站可以识别出异常行为,进而对Selenium爬虫进行限制。 这里我们可以加入JavaScript的使…...
leetcode hot 100 前k个高平元素
347. 前 K 个高频元素 已解答 中等 相关标签 相关企业 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 class Solution(object):def topKFrequent(self, nums, k):""":type nums: Lis…...
数据结构漫游记:静态双向链表
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
Object.defineProperty() 完整指南
Object.defineProperty() 完整指南 1. 基本概念 Object.defineProperty() 方法允许精确地添加或修改对象的属性。默认情况下,使用此方法添加的属性是不可修改的。 1.1 基本语法 Object.defineProperty(obj, prop, descriptor)参数说明: obj: 要定义…...
1Panel自建RustDesk服务器方案实现Windows远程macOS
文章目录 缘起RustDesk 基本信息实现原理中继服务器的配置建议 中继服务器自建指南准备服务器安装1Panel安装和配置 RustDesk 中继服务防火墙配置和安全组配置查看key下载&安装&配置客户端设置永久密码测试连接 macOS安装客户端提示finder写入失败hbbs和hbbr说明**hbbs…...
nginx学习之路-windows系统安装nginx
文章目录 1. 下载2. 启动3. 验证参考文档 1. 下载 官方下载地址:https://nginx.org/en/download.html 可以下载windows版本,如nginx-1.26.2.zip。解压后,加入系统变量。 2. 启动 可以使用命令行启动(windows系统自带的cmd可能…...
Paimon_01_241020
1. 概述 1.1. 核心特点 统一批处理和流处理(流和批同一套代码)数据湖能力多种引擎平权变更日志生成丰富的表类型(主键表、append-only,有序的流式读取来代替消息队列)模式演化(schema变更) 1…...
人工智能:变革时代的核心驱动力
求各位观众老爷看一看 先声明一下,该内容由于篇幅过长,可能会有一些地方存在一些小问题请大家谅解 观众老爷们,点个免费的赞和关注呗,您们的支持就是我最大的动力~ 人工智能:变革时代的核心驱动力 一、引言 在当今…...
【机器学习】工业 4.0 下机器学习如何驱动智能制造升级
我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 随着科技的飞速发展,工业 4.0 浪潮正席卷全球制造业,而机器学习作为这一变革中的关键技术,正以前…...
数据分析-Excel
数据类型和函数初步 Excel中有文本类型和数值类型–但是无法用肉眼分辨出来isnumber来区分是否是数值类型text和value函数可以完成数值类型以及文本类型的转换单元格第一位输入’方式明确输入的是文本sum函数必须是数值类型 文本连接-and-or-not-if-mod-max函数 字符串的连接…...
Kubernetes第二天
1.pod运行一个容器 1.创建目录 mkdir -p /manifests/pod 2.编写pod资源清单文件 vim 01-myweb.yaml 说明: apiVersion:指的是Api的版本 metadata:资源的元数据 spec:用户期望的资源的运行状态 status:资源实际的运行状态 由于拉取远…...
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
💬 欢迎讨论:如对文章内容有疑问或见解,欢迎在评论区留言,我需要您的帮助! 👍 点赞、收藏与分享:如果这篇文章对您有所帮助,请不吝点赞、收藏或分享,谢谢您的支持&#x…...
Kerberos用户认证-数据安全-简单了解-230403
hadoop安全模式官方文档:https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html kerberos是什么 kerberos是计算机网络认证协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。 概念&#…...
大中厂面试经验分享:如何使用消息队列(MQ)解决系统问题
在大中型互联网公司中,消息队列(MQ)作为一种关键的分布式系统组件,广泛应用于解决系统中的高并发、异步处理、解耦等问题。 在面试中,尤其是针对后端工程师或系统架构师的职位,面试官常常会通过询问消息队列…...
c#String和StringBuilder
目录 一,String 1,string的特点: 2,string常用方法 (1)Length (2)Substring() (3)ToUpper() (4)ToLower() (5&…...
【人工智能机器学习基础篇】——深入详解强化学习之常用算法Q-Learning与策略梯度,掌握智能体与环境的交互机制
深入详解强化学习之常用算法:Q-Learning与策略梯度 强化学习(Reinforcement Learning, RL)作为机器学习的一个重要分支,近年来在多个领域取得了显著成果。从棋类游戏的人机对战到自主驾驶汽车,强化学习技术展示了其强大…...
jQuery学习笔记2
jQuery 属性操作 <body><a href"http://www.itcast.cn" title"都挺好">都挺好</a><input type"checkbox" name"" id"" checked /><div index"1" data-index"2">我是div&…...
发现API安全风险,F5随时随地保障应用和API安全
分析数据显示,目前超过90%的基于Web的网络攻击都以API端点为目标,试图利用更新且较少为人所知的漏洞,而这些漏洞通常是由安全团队未主动监控的API所暴露。现代企业需要一种动态防御策略,在风险升级成代价高昂、令人警惕且往往无法…...
移动端如何实现上拉加载
一、理解上拉加载的原理 上拉加载是一种在移动端很常见的交互方式,其原理是当用户在页面上向上滑动(即滚动条接近底部)时,触发一个加载更多数据的操作。这通常涉及到对滚动事件的监听以及判断滚动位置是否达到了触发加载的阈值。…...
the request was rejected because no multipart boundary was found
文章目录 1. 需求描述2. 报错信息3. 探索过程 1. 使用postman 排除后端错误2. 搜索网上的解决方法3. 解决方法 1. 需求描述 想要在前端上传一个PDF 发票,经过后端解析PDF之后,将想要的值自动回填到对应的输入框中 2. 报错信息 org.apache.tomcat.u…...
Android 自定义shell命令
模拟触摸、按键等操作,直接在命令行输入对应命令即可。命令行如何识别并操作此命令,执行操作的是shell程序,还是java程序?是不是可以添加自定义的命令? 以下在Android13的代码中分析input命令 Android系统中使用了一…...
HTML5滑块(Slider)
HTML5 的滑块(Slider)控件允许用户通过拖动滑块来选择数值。以下是如何实现一个简单的滑块组件的详细说明。 HTML5 滑块组件 1. 基本结构 使用 <input type"range"> 元素可以创建一个滑块。下面是基本实现的代码示例: <…...
《SwiftUI 实现点击按钮播放 MP3 音频》
功能介绍 点击按钮时,应用会播放名为 yinpin.mp3 的音频文件。使用 AVAudioPlayer 来加载和播放音频。 关键点: 按钮触发:点击按钮会调用 playAudio() 播放音频。音频加载:通过 Bundle.main.url(forResource:) 加载音频文件。播…...
表单元素(标签)有哪些?
HTML 中的表单元素(标签)用于收集用户输入的数据,常见的有以下几种: 文本输入框 <input type"text">:用于单行文本输入,如用户名、密码等。可以通过设置maxlength属性限制输入字符数&…...
大型ERP系统GL(总账管理)模块需求分析
主要介绍了GL系统的需求分析,包括系统概述、功能描述、帐薄管理、报表管理、期末处理、财务报表以及凭证的快速输入方式、可用性设计、保存、自动审核和打印等方面的内容。系统概述部分介绍了系统的功能结构和模块流程图。 功能描述部分详细描述了系统的基础资料和业…...
SQL常用语句(基础)大全
SQL语句的类型 1.DDL 1.库2.表 2.DML 1.插入数据 insert inot2.删除数据 delete / truncate3.修改数据 update set 3.DQL 1.无条件查询2.查询 什么开始 到什么结束3.指定条件查询 1.单个条件 ro in2.多个条件 and4.查询不为NULL值 is not null ,为NULL值 is null5.模糊查询 li…...
关于HarmonyOS Next中卡片的使用方法
关于Harmony OS中卡片的使用方法 在Harmony OS中,静态卡片是一种非常有用的组件,用于提供应用内功能组件的交互和信息展示。本文将详细介绍如何在Harmony OS中使用静态卡片以及相关的API接口。 1. 概述 静态卡片是Harmony OS中的一种交互组件…...
Retrofit和rxjava 实现窜行请求,并行请求,循环多次请求,递归请求,错误重试
在使用 Retrofit 和 RxJava 时,可以通过多种方式实现多次请求,比如串行请求、并行请求、依赖请求等。以下是一些常见的实现方式: 1. 串行请求(依赖关系) 一个请求的结果作为另一个请求的输入,可以用 flat…...
C# OpenCV机器视觉:目标跟踪
在一个阳光明媚的下午,阿强正在实验室里忙碌,突然他的同事小杨走了进来,脸上挂着一丝困惑。 “阿强,我的目标跟踪项目出了问题!我想跟踪一个移动的物体,但总是跟丢!”小杨一边说,一…...
LeetCode 191 位1的个数
计算正整数二进制表示中汉明重量的两种实现方式对比 在编程的世界里,我们常常会遇到一些有趣又实用的小问题,今天就来和大家分享一下如何计算一个正整数二进制表示中设置位(也就是 1 的个数,专业术语叫汉明重量)的问题…...
【软件测试面试】银行项目测试面试题+答案(二)
前言 面试题:贷款有哪几种形式? 贷款是指金融机构或其他信贷机构向借款人提供资金,并按照约定的条件和期限收取一定利息的行为。根据贷款的不同形式,贷款可以分为以下几种: 按照还款方式分:分期付款贷款、到期一次…...
分布式消息队列RocketMQ
一、RocketMQ概述 1.1 MQ 概述 MQ,Message Queue,是一种提供消息队列服务的中间件,也成为消息中间件,是一套提供了消息生产、存储、消费全过程API的软件系统。消息即数据 1.2 MQ 用途 MQ的用途总结起来可分为以下三点 限流削峰…...
Temporary failure resolving ‘security.ubuntu.com‘
apt-get update 的时候出现: Temporary failure resolving security.ubuntu.com Temporary failure resolving archive.ubuntu.com具体信息: > ERROR [devel 3/17] RUN bash ./install_base.sh 3.12.3 && rm install_base.sh …...
0基础跟德姆(dom)一起学AI 自然语言处理10-LSTM模型
1 LSTM介绍 LSTM(Long Short-Term Memory)也称长短时记忆结构, 它是传统RNN的变体, 与经典RNN相比能够有效捕捉长序列之间的语义关联, 缓解梯度消失或爆炸现象. 同时LSTM的结构更复杂, 它的核心结构可以分为四个部分去解析: 遗忘门输入门细胞状态输出门…...
设计模式 创建型 建造者模式(Builder Pattern)与 常见技术框架应用 解析
单例模式(Singleton Pattern),又称生成器模式,是一种对象构建模式。它主要用于构建复杂对象,通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建出具有不同表示的对象。该模式的核心思想是将…...
cJson—json和XML比较
cJson—json和XML比较 前言1. 数据结构与表达能力2. 效率(性能)3. 存储占用与传输效率4. 开发难易程度5. 跨平台支持与兼容性6. 灵活性与扩展性7. 错误处理与验证**总结:JSON 与 XML 的优缺点对比选择建议 前言 在嵌入式设备开发中ÿ…...
【项目】智能BI洞察引擎 测试报告
目录 一、项目背景BI介绍问题分析项目背景 二、项目功能三、功能测试1、登录测试测试用例测试结果 2、注册测试测试用例测试结果出现的bug 3、上传文件测试测试用例测试结果 4、AI生成图表测试测试用例测试结果 5、分析数据页面测试(异步)测试用例测试结…...
基于SpringBoot的野生动物保护发展平台的设计与实现(源码+SQL+LW+部署讲解)
文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…...
QEMU网络配置简介
本文简单介绍下qemu虚拟机网络的几种配置方式。 通过QEMU的支持,常见的可以实现以下4种网络形式: 基于网桥(bridge)的虚拟网络。基于NAT(Network Addresss Translation)的虚拟网络。QEMU内置的用户模式网…...
wps透视数据表
1、操作 首先选中你要的行字段表格 -> 插入 -> 透视数据表 -> 拖动行值(部门)到下方,拖动值(包裹数量、运费)到下方 2、删除 选中整个透视数据表 -> delete 如图:...
Modbus知识详解
Modbus知识详解 ## 1.什么是Modbus?**顾名思义**,它是一个Bus(总线),即总线协议。比如串口协议、IIC协议、SPI都是通信协议。你接触到这种协议,相信你所处的行业是工业电子方面或者你的产品用于工业。好了,…...
c++字节对齐
字节对齐(Byte Alignment)是指计算机存储器中数据存放的位置必须满足特定的地址要求,以提高内存访问效率。在许多计算机系统中,处理器在读取内存中的数据时,需要按照特定的边界进行访问,这种边界通常是2的幂…...
javaEE-文件内容的读写
目录 一.数据流 1.字节流 InputStream的方法: cloes() read() OutPutStream writer()方法 2.字符流 Reader: writer: 代码练习1: 代码练习2: 代码练习3: 一.数据流 java标准库对数据进行了封装,提供了一组类负责进行这些工作. 数据流分为两类:字节流和…...
SWM221系列芯片之电机应用及控制
经过对SWM221系列的强大性能及外设资源,TFTLCD彩屏显示及控制进行了整体介绍后,新迎来我们的电控篇---SWM221系列芯片之电机应用及控制。在微控制器市场面临性能、集成度与成本挑战的当下,SWM221系列芯片以其卓越性能与创新设计,受…...
Mongodb日志报错too many open files,导致mongod进程down
【解决方案】 (1)进入到服务器,执行: ulimit -a 查看:open files这一行的数量,如果查询到的结果是1000左右,那多半是服务器限制。 (2)在当前session窗口执行如下&…...