小白的进阶之路系列之二----人工智能从初步到精通pytorch中分类神经网络问题详解
什么是分类问题?
分类问题涉及到预测某物是一种还是另一种。
例如,你可能想要:
问题类型 | 具体内容 | 例子 |
---|---|---|
二元分类 | 目标可以是两个选项之一,例如yes或no | 根据健康参数预测某人是否患有心脏病。 |
多类分类 | 目标可以是两个以上选项之一 | 判断一张照片是食物、人还是狗。 |
多标签分类 | 目标可以被分配多个选项(标签) | 预测维基百科文章的分类(例如数学、科学和哲学) |
分类和回归是最常见的机器学习问题之一。
在本笔记本中,我们将使用PyTorch解决几个不同的分类问题。
换句话说,获取一组输入并预测这些输入属于哪个类。
本篇文章包括的内容
在本文中,我们将重申PyTorch工作流。
除了试图预测一条直线(预测一个数字,也称为回归问题),我们将研究一个分类问题。
具体来说,我们将涵盖:
主题 | 内容 |
---|---|
分类神经网络的结构 | 神经网络几乎可以有任何形状或大小,但它们通常遵循类似的平面图。 |
准备好二进制分类数据 | 数据几乎可以是任何东西,但为了开始,我们将创建一个简单的二进制分类数据集。 |
构建PyTorch分类模型 | 在这里,我们将创建一个模型来学习数据中的模式,我们还将选择损失函数,优化器并构建特定于分类的训练循环。 |
将模型拟合到数据(训练) | 我们已经有了数据和模型,现在让模型尝试在(训练)数据中找到模式。 |
做出预测和评估模型(推理) | 我们的模型在数据中发现了模式,让我们将其发现与实际(测试)数据进行比较。 |
改进模型(从模型的角度) | 我们已经训练和评估了一个模型,但它不起作用,让我们尝试一些事情来改进它。 |
非线性 | 到目前为止,我们的模型只能模拟直线,那么非线性(非直线)的直线呢? |
复制非线性函数 | 我们使用非线性函数来帮助建模非线性数据,但是这些函数是什么样子的呢? |
用多类分类把它们放在一起 | 让我们把到目前为止我们所做的关于二分类和一个多类分类问题结合起来。 |
0 分类神经网络的结构
在开始编写代码之前,让我们先看看分类神经网络的一般架构:
超参数 | 二元分类 | 多元分类 |
---|---|---|
输入层形状(in_features) | 与心脏病预测的特征数量相同(例如年龄、性别、身高、体重、吸烟状况的5项) | 相同 |
隐藏层 | 特定问题,最小值= 1,最大值=无限 | 相同 |
每个隐藏层的神经元 | 特定于问题,一般为10到512 | 相同 |
输出层形状(out_features) | 1(一类或另一个类) | 每类一个 |
隐藏层激活 | 通常是ReLU(整流线性单元),但也可以是许多其他单元 | 相同 |
输出激活 | Sigmoid (torch.sigmoidin PyTorch) | Softmax (torch.softmax in PyTorch) |
损失函数 | 二进制交叉熵 Binary crossentropy (torch.nn.BCELossin PyTorch) | Cross entropy (torch.nn.CrossEntropyLoss in PyTorch) |
优化器 | SGD (stochastic gradient descent随机梯度下降), Adam (see torch.optim for more options) | 相同 |
当然,这个分类神经网络组件的成分表将根据您正在处理的问题而有所不同。
但这已经足够开始了。
我们将在本文中亲身体验这种设置。
1 准备好二进制分类数据
让我们从制作一些数据开始。
我们将使用Scikit-Learn中的make_circles()方法生成两个带有不同颜色圆点的圆。
from sklearn.datasets import make_circles# Make 1000 samples
n_samples = 1000# Create circles
X, y = make_circles(n_samples,noise=0.03, # a little bit of noise to the dotsrandom_state=42) # keep random state so we get the same values
print(X)
print(y)
输出为:
[[ 0.75424625 0.23148074][-0.75615888 0.15325888][-0.81539193 0.17328203]...[-0.13690036 -0.81001183][ 0.67036156 -0.76750154][ 0.28105665 0.96382443]]
[1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1
...
1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 00]
数据有些多,我们只看前五个数值。
print(f"First 5 X features:\n{X[:5]}")
print(f"\nFirst 5 y labels:\n{y[:5]}")
输出为:
First 5 X features:
[[ 0.75424625 0.23148074][-0.75615888 0.15325888][-0.81539193 0.17328203][-0.39373073 0.69288277][ 0.44220765 -0.89672343]]First 5 y labels:
[1 1 1 1 0]
看起来每个y值对应两个X值。
让我们继续遵循数据浏览器的座右铭:可视化、可视化、可视化,并将它们放入pandas DataFrame中。
# Make DataFrame of circle data
import pandas as pd
circles = pd.DataFrame({"X1": X[:, 0],"X2": X[:, 1],"label": y
})
print(circles.head(10))
输出为:
X1 X2 label
0 0.754246 0.231481 1
1 -0.756159 0.153259 1
2 -0.815392 0.173282 1
3 -0.393731 0.692883 1
4 0.442208 -0.896723 0
5 -0.479646 0.676435 1
6 -0.013648 0.803349 1
7 0.771513 0.147760 1
8 -0.169322 -0.793456 1
9 -0.121486 1.021509 0
看起来每一对X特征(X1和X2)的标签(y)值为0或1。
这告诉我们,我们的问题是二元分类,因为只有两个选项(0或1)。
每个类有多少个值?
# Check different labels
print(circles.label.value_counts())
输出为:
label
1 500
0 500
Name: count, dtype: int64
每个500,又好又平衡。
我们把它们画出来。
# Visualize with a plot
import matplotlib.pyplot as plt
plt.scatter(x=X[:, 0], y=X[:, 1], c=y, cmap=plt.cm.RdYlBu)
plt.show()
好吧,看来我们有问题要解决了。
让我们来看看如何构建PyTorch神经网络来将点分类为红色(0)或蓝色(1)。
[!NOTE]
这个数据集通常被认为是机器学习中的一个玩具问题(一个用来尝试和测试事物的问题)。
但它代表了分类的关键,你有一些用数值表示的数据你想建立一个能够分类的模型,在我们的例子中,把它分成红点或蓝点。
1.1输入输出形状
深度学习中最常见的错误之一是形状错误。
张量和张量操作的形状不匹配将导致模型错误。
我们会在整个课程中看到很多这样的例子。
没有办法保证它们不会发生,但它们会发生。
相反,您可以做的是不断地熟悉您正在处理的数据的形状。
我喜欢把它称为输入和输出形状。
问问你自己:
“我的输入和输出是什么形状?”
让我们来看看。
# Check the shapes of our features and labels
print(X.shape)
print( y.shape)
输出为:
(1000, 2)
(1000,)
看来我们在第一个维度上找到了匹配。
有1000个X和1000个y。
但是X上的第二次元是什么?
它通常有助于查看单个样本的值和形状(特征和标签)。
这样做将帮助您了解期望从模型中得到的输入和输出形状。
# View the first example of features and labels
X_sample = X[0]
y_sample = y[0]
print(f"Values for one sample of X: {X_sample} and the same for y: {y_sample}")
print(f"Shapes for one sample of X: {X_sample.shape} and the same for y: {y_sample.shape}")
输出为:
Values for one sample of X: [0.75424625 0.23148074] and the same for y: 1
Shapes for one sample of X: (2,) and the same for y: ()
这告诉我们X的第二维意味着它有两个特征(向量),而y只有一个特征(标量)。
我们有两个输入对应一个输出。
1.2将数据转换为张量,并创建训练和测试分割
我们已经研究了数据的输入和输出形状,现在让我们为使用PyTorch和建模做好准备。
具体来说,我们需要:
1 将我们的数据转换为张量(现在我们的数据是在NumPy数组中,PyTorch更倾向使用PyTorch张量)。
2 将我们的数据分成训练集和测试集(我们将在训练集上训练一个模型来学习X和y之间的模式,然后在测试数据集上评估这些学习到的模式)。
# Turn data into tensors
# Otherwise this causes issues with computations later on
import torch
X = torch.from_numpy(X).type(torch.float)
y = torch.from_numpy(y).type(torch.float)# View the first five samples
print(X[:5])
print(y[:5])
输出为:
tensor([[ 0.7542, 0.2315],[-0.7562, 0.1533],[-0.8154, 0.1733],[-0.3937, 0.6929],[ 0.4422, -0.8967]])
tensor([1., 1., 1., 1., 0.])
现在我们的数据是张量格式,让我们把它分成训练集和测试集。
为此,让我们使用Scikit-Learn中的有用函数train_test_split()。
我们将使用test_size=0.2(80%训练,20%测试),因为分割是随机发生的,所以我们使用random_state=42,这样分割是可重复的。
# Split data into train and test sets
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, # 20% test, 80% trainrandom_state=42) # make the random split reproducibleprint(len(X_train), len(X_test), len(y_train), len(y_test) )
输出为:
800 200 800 200
好了!看起来我们现在有800个训练样本和200个测试样本。
2 构建PyTorch分类模型
我们已经准备好了一些数据,现在是时候建立一个模型了。
我们将把它分成几个部分。
1 设置与设备无关的代码(所以我们的模型可以在CPU或GPU上运行,如果它可用的话)。
2 通过子类化nn. module来构造一个模型。
3 定义损失函数和优化器。
4 创建一个训练循环(这将在下一节中介绍)。
好消息是,我们已经在上一篇章中完成了上述所有步骤。
不过现在我们要对它们进行调整,让它们与分类数据集一起工作。
让我们从导入PyTorch和torch.nn以及设置设备认知代码。
# Standard PyTorch imports
import torch
from torch import nn# Make device agnostic code
device = "cuda" if torch.cuda.is_available() else "cpu"
print(device)
输出为:
cuda
很好,现在设备已经设置好了,我们可以将它用于我们创建的任何数据或模型,PyTorch将在CPU(默认)或GPU上处理它(如果它可用)。
我们创建一个模型怎么样?
我们需要一个能够处理X数据作为输入并产生y数据形状的输出的模型。
换句话说,给定X(特征),我们希望我们的模型预测y(标签)。
这种有特征和标签的设置被称为监督学习。因为你的数据告诉你的模型,给定一个特定的输入,输出应该是什么。
要创建这样一个模型,它需要处理X和y的输入和输出形状。
还记得我说过输入和输出形状很重要吗?下面我们来看看为什么。
让我们创建一个模型类:
1 子类nn。Module(几乎所有PyTorch模型都是nn.Module的子类)。
2 创建2nn。构造函数中的线性层,能够处理X和y的输入和输出形状。
3 定义一个forward()方法,该方法包含模型的前向传递计算。
4 实例化模型类并将其发送到目标设备。
# 1. Construct a model class that subclasses nn.Module
class CircleModelV0(nn.Module):def __init__(self):super().__init__()# 2. Create 2 nn.Linear layers capable of handling X and y input and output shapesself.layer_1 = nn.Linear(in_features=2, out_features=5) # takes in 2 features (X), produces 5 featuresself.layer_2 = nn.Linear(in_features=5, out_features=1) # takes in 5 features, produces 1 feature (y)# 3. Define a forward method containing the forward pass computationdef forward(self, x):# Return the output of layer_2, a single feature, the same shape as yreturn self.layer_2(self.layer_1(x)) # computation goes through layer_1 first then the output of layer_1 goes through layer_2# 4. Create an instance of the model and send it to target device
model_0 = CircleModelV0().to(device)
print(model_0)
输出为:
CircleModelV0((layer_1): Linear(in_features=2, out_features=5, bias=True)(layer_2): Linear(in_features=5, out_features=1, bias=True)
)
这是怎么回事?
我们之前已经看到了一些这样的步骤。
唯一主要的变化是self.ayer_1和self.layer_2之间发生的变化。
self.ayer_1接受2个输入特征in_features=2,并产生5个输出特征out_features=5。
这被称为有5个隐藏单元或神经元。
这一层将输入数据从2个特征变成5个特征。
为什么要这样做?
这使得模型可以从5个数字而不仅仅是2个数字中学习模式,从而可能产生更好的输出。
我说潜在,是因为有时它不起作用。
你可以在神经网络层中使用的隐藏单元的数量是一个超参数(一个你可以自己设置的值),你不需要使用固定的值。
一般来说,越多越好,但也有太多的情况。您选择的数量将取决于您正在使用的模型类型和数据集。
由于我们的数据集既小又简单,我们将保持它很小。
隐藏单位的唯一规则是下一层,在我们的例子中,self。Layer_2必须采用与前一层out_features相同的in_features。
这就是为什么self.layer_2有in_features=5,它从self.layer_1出out_features=5。并对它们执行线性计算,将它们转换为out_features=1(与y相同的形状)。
如下图所示:
您也可以使用nn. Sequential执行与上述相同的操作。
nn.Sequential按照各层出现的顺序对输入数据执行前向传递计算。
# Replicate CircleModelV0 with nn.Sequential
model_0 = nn.Sequential(nn.Linear(in_features=2, out_features=5),nn.Linear(in_features=5, out_features=1)
).to(device)print(model_0)
输出为:
Sequential((0): Linear(in_features=2, out_features=5, bias=True)(1): Linear(in_features=5, out_features=1, bias=True)
)
哇,这看起来比子类化nn,Module 简单多了。那么,为什么不总是使用nn.Sequential呢?
nn.Sequential对于直接计算来说是非常棒的,但是,正如名称空间所说,它总是按顺序运行。
因此,如果您希望发生其他事情(而不仅仅是直接的顺序计算),您将需要定义自己的自定义nn,Module子类。
现在我们有了一个模型,让我们看看当我们通过它传递一些数据时会发生什么。
# Make predictions with the model
untrained_preds = model_0(X_test.to(device))
print(f"Length of predictions: {len(untrained_preds)}, Shape: {untrained_preds.shape}")
print(f"Length of test samples: {len(y_test)}, Shape: {y_test.shape}")
print(f"\nFirst 10 predictions:\n{untrained_preds[:10]}")
print(f"\nFirst 10 test labels:\n{y_test[:10]}")
输出为:
Length of predictions: 200, Shape: torch.Size([200, 1])
Length of test samples: 200, Shape: torch.Size([200])First 10 predictions:
tensor([[ 0.2511],[ 0.3828],[-0.1777],[ 0.3730],[-0.3103],[-0.2288],[ 0.2471],[ 0.1035],[-0.1714],[ 0.3902]], device='cuda:0',
相关文章:
小白的进阶之路系列之二----人工智能从初步到精通pytorch中分类神经网络问题详解
什么是分类问题? 分类问题涉及到预测某物是一种还是另一种。 例如,你可能想要: 问题类型具体内容例子二元分类目标可以是两个选项之一,例如yes或no根据健康参数预测某人是否患有心脏病。多类分类目标可以是两个以上选项之一判断一张照片是食物、人还是狗。多标签分类目标…...
日志根因分析:Elastic Observability 的异常检测与日志分类功能
作者:来自 Elastic Bahubali Shetti Elastic Observability 不仅提供日志聚合、指标分析、APM 和分布式追踪,Elastic 的机器学习能力还能帮助分析问题的根因,让你将时间专注于最重要的任务。 随着越来越多的应用程序迁移到云端,收…...
web基础
域名概述 2-1 域名的概念:IP 地址不易记忆,域名是互联网络上识别和定位计算机的层次结构式的字符标识,与该计算机的互联网协议 (IP) 地址相对应,用于在数据传输时标识计算机的电子方位,方便人们记忆和输入。 早期使用…...
WebRTC技术EasyRTC音视频实时通话驱动智能摄像头迈向多场景应用
一、方案背景 在物联网蓬勃发展的当下,智能摄像头广泛应用于安防、家居、工业等领域。但传统智能摄像头存在视频传输延迟高、设备兼容性差、网络波动时传输不稳定等问题,难以满足用户对实时流畅交互视频的需求。EasyRTC凭借低延迟、高可靠、跨平台特性…...
替换word中的excel
PostMapping("/make/report/target/performance/first") public AjaxResult makeTargetReportFirst(RequestBody MakeReportDTO makeReportDTO) {Map<String, String> textReplaceMap new HashMap<>();// 替换日期LocalDateTime nowData LocalDateTime…...
【氮化镓】低剂量率对GaN HEMT栅极漏电的影响
2024 年 2 月 22 日,中国科学院新疆理化技术研究所的Li等人在《IEEE ACCESS》期刊发表了题为《Degradation Mechanisms of Gate Leakage in GaN-Based HEMTs at Low Dose Rate Irradiation》的文章,基于实验分析和 TCAD 仿真,研究了低剂量率辐照下基于 GaN 的 p 型栅高电子迁…...
win10使用nginx做简单负载均衡测试
一、首先安装Nginx: 官网链接:https://nginx.org/en/download.html 下载完成后,在本地文件中解压。 解压完成之后,打开conf --> nginx.config 文件 1、在 http 里面加入以下代码 upstream GY{#Nginx是如何实现负载均衡的&a…...
Java 06API时间类
API-时间类 Date jdk8之前1.构造 代表当前的日期和时间 1.Date d1new Date();当前的时间编译成对象 2.Date d2new Date(long time);时间毫秒值代表的Date日期对象 long 类型需要在写L 及8L2.常用方法 public long getTime();获取从1970-1-1到现在的毫秒值总数 void setTime…...
2.11 筹资管理
11.1 筹资主体 11.1.1 企业筹资 1.内源筹资 企业自由资金、应付息税以及未使用或者分配专项基金。自由资金:留存收益、应收账款、闲置资产变卖未使用或者分配专项基金:更新改造基金、生产发展基金以及职工福利基金 2.外源筹资 权益筹资:普通股筹资、优先股筹资债务筹资:借…...
什么是 AI 人工智能?什么是机器学习?什么是深度学习?三者啥关系
AI 到底是个啥?跟咱有啥关系?一文帮你搞懂! 最近是不是老听到 “AI”、“人工智能” ,“机器学习”,“深度学习”这些词?感觉挺高大上,但又有点懵?别担心,今天咱们就用大…...
C语言经典面试题及答案100道
# C语言经典面试题及答案100道 ## 基础概念部分 1. **什么是C语言?** - 答:C语言是一种通用的、过程式的计算机编程语言,由Dennis Ritchie于1972年在贝尔实验室开发,主要用于系统软件开发。 2. **C语言的特点是什么…...
RocketMQ 顺序消息实现原理详解
RocketMQ 的顺序消息实现原理主要围绕生产者发送顺序性、Broker存储顺序性和消费者消费顺序性三个核心环节展开,具体分为全局有序和分区有序两种模式。 一、顺序消息的分类 1. 全局有序 定义:某个Topic下所有消息严格按FIFO顺序处理。实现:…...
SpringBoot与GeoHash整合,实现骑手就近派单功能
通过使用GeoHash结合Redis的地理空间功能,能够实时管理和查询骑手的位置信息,并根据订单量和评分等因素动态分配最近的骑手来完成配送任务. 空间索引: GeoHash是一种将地理坐标(经纬度)编码为字符串的算法,可以用于空间索引。 这使得我们可以方便地在Redis这样的内存数据库…...
spark任务的提交流程
目录 spark任务的提交流程1. 资源申请与初始化2. 任务划分与调度3. 任务执行4. 资源释放与结果处理附:关键组件协作示意图扩展说明SparkContext介绍 spark任务的提交流程 用户创建一个 Spark Context;Spark Context 去找 Cluster Manager 申请资源同时说明需要多少 CPU 和内…...
阿博图书馆管理系统 Java+Spring Boot+MySQL 实战项目分享
一、项目简介 为了提升图书馆的管理效率和用户体验,我们基于 Java Spring Boot MySQL 开发了一款完整的图书馆管理系统 —— 阿博图书馆管理系统。系统采用前后端分离架构,功能模块丰富,操作逻辑清晰,适合用于毕业设计、实训项…...
es学习小结
1.客户端类型 推荐场景 版本兼容性 Elasticsearch Java API Client 新项目、ES 8.x集群 8.x及以上 Spring Data Elasticsearch Spring生态项目、简化ORM操作 ES 7.x-8.x(需版本匹配) Low-Level REST Client 需要底层HTTP控制、兼容多版本ES …...
【数据库课程设计】网上投票管理系统
目录 前言: 一,系统需求分析 1,需求概述 2,系统功能图 3,业务流程图 业务流程分析 业务流程图 4,数据流程图 5,数据字典 二,概念结构设计 1,实体分析 2&am…...
STM32+ESP8266+ONENET+微信小程序上传数据下发指令避坑指南
之前只做过类似的但是以为这种烂大街的功能应该不难结果还是踩了不少坑,记录几个需要注意的点 1、创建产品的时候选择onejson,自定义方案。这样选择的就是物模型,之后可以去使用物模型的API调试。 2、设置物模型 大概有以下几种比较常用的&…...
不同消息队列保证高可用实现方案
消息队列的高可用性(High Availability, HA)是分布式系统中的核心需求,不同消息队列通过多种技术手段实现高可用。以下是主流消息队列的高可用实现方案及对比: 一、Apache Kafka 副本机制(Replication) 每个…...
Android 蓝牙开发 - 蓝牙相关权限(蓝牙基本权限、Android 12 蓝牙新增权限、位置权限)
蓝牙基本权限 1、基本介绍 <uses-permission android:name"android.permission.BLUETOOTH" />BLUETOOTH:允许应用连接配对的蓝牙设备 <uses-permission android:name"android.permission.BLUETOOTH_ADMIN" />BLUETOOTH_ADMIN&am…...
【Linux】第二十一章 管理存储堆栈
1. 分别说明LVM中物理卷、物理区块、卷组、逻辑卷的概念以及它们之间的关系。 在 LVM (Logical Volume Management) 中,硬盘的管理变得更加灵活,允许动态地调整磁盘空间的分配。 物理卷(PV):LVM使用底层物理设备&…...
OpenCV 人脸识别:从基础到实践全解析
在人工智能与计算机视觉蓬勃发展的今天,人脸识别技术已深入我们生活的方方面面,从手机解锁到安防监控,其应用无处不在。而 OpenCV 作为计算机视觉领域最受欢迎的开源库之一,为开发者提供了一套高效且易用的人脸识别解决方案。本文…...
【HTML-2】HTML 标题标签:构建网页结构的基础
在网页开发中,标题标签(<h1>到<h6>)是构建内容层次结构和语义化标记的基础元素。这些标签不仅影响内容的视觉呈现,更对网页的可访问性和SEO有着深远影响。 1. 标题标签的基本用法 HTML提供了六个级别的标题标签: <h1>这…...
vue3前端后端地址可配置方案
在开发vue3项目过程中,需要切换不同的服务器部署,代码中配置的服务需要可灵活配置,不随着run npm build把网址打包到代码资源中,不然每次切换都需要重新run npm build。需要一个配置文件可以修改服务地址,而打包的代码…...
HTML应用指南:利用POST请求获取全国申通快递服务网点位置信息
申通快递(STO Express)作为中国领先的综合物流服务商,自1993年创立以来,始终秉持“正道经营、长期主义”的发展理念,深耕快递物流领域,开创了行业加盟制先河。经过30余年的发展,申通已成长为国家…...
《医院运营管理典型应用数据资源建设指南2025》全面分析
引言:医院数据资源建设的时代背景与意义 医院运营管理数据资源建设正迎来前所未有的发展机遇与挑战。在深化支付改革与公立医院高质量发展政策驱动下,医院亟需建立智慧化运营管理体系,而数据资源作为关键要素,其建设水平直接关系到医院管理的科学性与效率。《医院运营管理…...
.NET外挂系列:3. 了解 harmony 中灵活的纯手工注入方式
一:背景 1. 讲故事 上一篇我们讲到了 注解特性,harmony 在内部提供了 20个 HarmonyPatch 重载方法尽可能的让大家满足业务开发,那时候我也说了,特性虽然简单粗暴,但只能解决 95% 的问题,言外之意还有一些…...
taro 小程序 CoverImage Image src无法显示图片的问题
目录 一、问题描述 二、解决方案 一、问题描述 使用taro开发的微信小程序图片无法正常显示,并报如下错误: [渲染层网络层错误] Failed to load local image resource /assets/icon/message.png the server responded with a status of 500 (HTTP/1.…...
05_核支持向量机
描述 核支持向量机(通常简称为SVM)可以推广到更复杂模型的扩展,这些模型无法被输入空间的超平面定义。 SVM 的核心思想是找到一个最优的超平面,将不同类别的数据分开。这个超平面不仅要能够正确分类数据,还要使得两个…...
[解决方案] Word转PDF
背景: 之前做过一些pdf导出, 客户提了一个特别急的需求, 要求根据一个模版跟一个csv的数据源, 批量生成PDF, 因为之前用过FOP, 知道调整样式需要特别长的时间, 这个需求又特别急, 所…...
Oracle 11g post PSU Oct18 设置ssl连接(使用wallets)
说明 oracle 11g 从PSU 2018Oct(含)及之后的补丁不支持MD5. 要使用JDBC SSL要使用TSL1.2. 有两种方法,一种使用wallet, 一种使用JKS. 本文档使用wallets. 1. 为什么用TSL 1.2 https://blogs.oracle.com/developers/post/ssl-connection-to…...
linux关闭某端口暂用的进程
查看是哪个端口暂用 sudo netstat -tulpn | grep :80根据图片 显示 80端口暂用的 进程id是 3002 结束进程id为3002的进程 sudo kill -9 3002...
web开发全过程总结
目录 利用pnpm创建vue3的文件 使用pnpm创建项目 项目配置 在idea中创建Spring Boot项目 配置基础项目架构(三层架构) 利用pnpm创建vue3的文件 1.打开cmd,以管理员的身份运行 2.切换到自己想要建立项目的文件的目录下或者直接在文件中以cmd的形式打开 输入指令安装pnpm n…...
经典Java面试题的答案——Java 基础
大家好,我是九神。这是互联网技术岗的分享专题,废话少说,进入正题: 1.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境…...
Fiddler 指定链接断点
问题背景 在使用Fiddler进行抓包和mock数据时,由于前端页面通常依赖多个前置接口(如JS、CSS、登录态等),导致抓包过程中难以精准定位到目标接口。这种复杂性增加了调试和mock数据的难度。 常见挑战 前置接口过多:页…...
C# 语法篇:字段的定义和运算
对于字段来说,是在对象创建时就被初始化了;而构造函数的运行是在这之后。 因此,不能对字段进行需要用到“构造函数赋值的变量”的运算,因为此时这些变量的值都为0或者随机值,编译器不允许这时候做运算。 因此…...
音频应用的MediaSession冲突
前提条件 系统级应用,使用了sharedUserId 应用在AndroidManifest.xml中声明了系统级UID:android:sharedUserId"android.uid.system"该配置使应用具有系统级权限,可以访问系统级API和资源 使用MediaSession框架 应用通过MediaSessi…...
【QT】类A接收TCP数据并通过信号通知类B解析
以下是基于Qt的完整示例代码,包含类A接收TCP数据并通过信号通知类B解析的实现: ------------------ ClassA.h 网络数据接收类 ------------------ #pragma once#include <QTcpServer> #include <QTcpSocket> #include <QObject>class…...
【Jitsi Meet】(腾讯会议的平替)Docker安装Jitsi Meet指南-使用内网IP访问
Docker安装Jitsi Meet指南-使用内网IP访问 下载官方代码配置环境变量复制示例环境文件并修改配置:编辑 .env 文件: 修改 docker-compose.yml 文件生成自签名证书启动服务最终验证 腾讯会议的平替。我们是每天开早晚会的,都是使用腾讯会议。腾…...
微服务架构中的多进程通信--内存池、共享内存、socket
目录 1 引言 2 整体架构简介 3 疑问 3.1 我们的共享内存消息机制是用的posix还是system V 3.2 rmmt中,不同线程之间的比如访问同一个内存,用的什么锁控制的 3.3 疑问:假如一个进程发送给了另外两个进程,然后另外两个进程都同…...
使用 adb 命令截取 Android 设备的屏幕截图
使用 adb 命令截取 Android 设备的屏幕截图。以下是两种常见的方法: 方法一:截屏后保存到电脑 adb shell screencap -p /sdcard/screenshot.png adb pull /sdcard/screenshot.png解释: adb shell screencap -p /sdcard/screenshot.png&…...
Jenkins服务器配置密钥对
1. 在 Jenkins 服务器上执行以下命令 # 生成 SSH 密钥对 ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N ""# 查看公钥内容 cat ~/.ssh/id_rsa.pub 2. 将显示的公钥内容复制,然后在目标服务器上执行 # 在目标服务器上执行 mkdir -p /root/.ssh chmod …...
Docker中部署Alertmanager
在 Docker 中部署 Alertmanager(通常与 Prometheus 告警系统配合使用)的步骤如下: 一、拉取镜像prom/alertmanager docker pull prom/alertmanager二、 创建 Alertmanager 配置文件 首先准备Alertmanager的配置文件 alertmanager.yml(如存…...
Keil软件中STM32(ARM)与C51兼容方法
推荐其他UP主:Keil5安装教程(包含C51与MDK共存) - Kojull - 博客园 我已经实现了!...
青少年编程与数学 02-019 Rust 编程基础 19课题、项目发布
青少年编程与数学 02-019 Rust 编程基础 19课题、项目发布 一、准备工作1. 创建和配置项目2. 编写代码和测试3. 文档注释 二、构建发布版本1. 构建优化后的可执行文件2. 静态链接(可选) 三、发布到 crates.io1. Crates.io核心功能使用方法特点最新动态 2…...
一洽小程序接入说明
接入说明 文档以微信小程序作为示例介绍,其他小程序接入操作与此类似 1、添加校验文件 开发者使用微信小程序提供的 webview 组件可以实现打开一洽的H5对话 小程序的“域名配置”中添加一洽的对话域名地址,需要获取校验文件提供给一洽放在域名根目录下…...
RabbitMQ的基本使用
RabbitMQ 是一个非常流行的消息中间件,用于实现生产者与消费者之间的异步通信。它基于 AMQP 协议(高级消息队列协议),支持多种编程语言和平台。 以下是 RabbitMQ 的基本使用说明,包括安装、核心概念、基本操作和 Pyth…...
CSS专题之常见布局
前言 石匠敲击石头的第 13 次 作为一名前端开发,在日常开发中,写页面是必不可少的工作,但有时候发现很多的页面结构都是类似的,所以打算写一篇文章来梳理一下日常开发中常见的布局,如果哪里写的有问题欢迎指出。 单列…...
CentOS 7连接公司网络配置指南
在物理主机上安装了一个CentOS 7,需要连接公司的网络,但是公司的网络需要输入用户名密码才能连接 解决方案 需要 同时设置 wifi-sec.key-mgmt 和 802-1x 参数。以下是分步操作: 1. 创建基础 Wi-Fi 连接 sudo nmcli con add con-name &quo…...
RustDesk CentOS自建中继节点
一、需开放端口 TCP: 21115, 21116, 21117, 21118, 21119 UDP: 21116 二、安装docker 1.使用 root 权限登录 CentOS。确保 yum 包更新到最新 yum update 2. 卸载旧版本 yum remove docker 3. 安装 Docker 所需依赖 yum -y install yum-utils device-mapper-persistent-d…...