自学机器学习,从入门到精通

  • 导论
    • 机器学习的基本框架设计目标
    • 机器学习框架基本组成原理
    • 机器学习生态
  • 机器学习工作流
    • 环境配置
    • 数据处理
    • 模型定义
    • 损失函数和优化器
    • 训练及保存模型
    • 测试及验证模型
  • 定义深度神经网络
    • 以层为核心定义神经网络
    • 神经网络层实现原理
    • 自定义神经网络层
  • 时间有限,有需要的同学可以看下面博主的博客链接,介绍的更为详细。

导论

本章主要讲解机器学习的应用背景以及基本的介绍。

机器学习的基本框架设计目标

机器学习框架如雨后春笋般出现(较为知名的例子包括TensorFlow、PyTorch、MindSpore、MXNet、PaddlePaddle、OneFlow、CNTK等)
神经网络编程:。根据应用的需求,人们需要定制不同的神经网络,如卷积神经网络(Convolutional Neural Networks)和自注意力神经网络(Self-Attention Neural Networks)等。这些神经网络需要一个共同的系统软件进行开发、训练和部署。

自动微分: 训练神经网络会具有模型参数。这些参数需要通过持续计算梯度(Gradients)迭代改进。梯度的计算往往需要结合训练数据、数据标注和损失函数(Loss Function)。考虑到大多数开发人员并不具备手工计算梯度的知识,机器学习框架需要根据开发人员给出的神经网络程序,全自动地计算梯度。这一过程被称之为自动微分。

数据管理和处理: 机器学习的核心是数据。这些数据包括训练、验证、测试数据集和模型参数。因此,需要系统本身支持数据读取、存储和预处理(例如数据增强和数据清洗)。

模型训练和部署: 为了让机器学习模型达到最佳的性能,需要使用优化方法来通过多步迭代反复计算梯度,这一过程称之为训练。训练完成后,需要将训练好的模型部署到推理设备。

硬件加速器: 神经网络的相关计算往往通过矩阵计算实现。这一类计算可以被硬件加速器(例如,通用图形处理器-GPU)加速

分布式执行: 随着训练数据量和神经网络参数量的上升,机器学习系统的内存用量远远超过了单个机器可以提供的内存。因此,机器学习框架需要天然具备分布式执行的能力。

机器学习框架基本组成原理

在这里插入图片描述
编程接口: *机器学习框架首先需要提供以高层次编程语言(如Python)为主的编程接口。同时,机器学习框架为了优化运行性能,需要支持以低层次编程语言(如C和C++)为主的系统实现,从而实现操作系统(如线程管理和网络通讯等)和各类型硬件加速器的高效使用。

计算图: 利用不同编程接口实现的机器学习程序需要共享一个运行后端。实现这一后端的关键技术是计算图技术。计算图定义了用户的机器学习程序,其包含大量表达计算操作的算子节点(Operator Node),以及表达算子之间计算依赖的边(Edge)。

编译器前端: 机器学习框架往往具有AI编译器来构建计算图,并将计算图转换为硬件可以执行的程序。这个编译器首先会利用一系列编译器前端技术实现对程序的分析和优化。编译器前端的关键功能包括实现中间表示、自动微分、类型推导和静态分析等。

编译器后端和运行时: 完成计算图的分析和优化后,机器学习框架进一步利用编译器后端和运行时实现针对不同底层硬件的优化。常见的优化技术包括分析硬件的L2/L3缓存大小和指令流水线长度,优化算子的选择或者调度顺序。

异构处理器: 机器学习应用的执行由中央处理器(Central Processing Unit,CPU)和硬件加速器(如英伟达GPU、华为Ascend和谷歌TPU)共同完成。其中,非矩阵操作(如复杂的数据预处理和计算图的调度执行)由中央处理器完成。矩阵操作和部分频繁使用的机器学习算子(如Transformer算子和Convolution算子)由硬件加速器完成。

数据处理: 机器学习应用需要对原始数据进行复杂预处理,同时也需要管理大量的训练数据集、验证数据集和测试数据集。这一系列以数据为核心的操作由数据处理模块(例如TensorFlow的tf.data和PyTorch的DataLoader)完成。

模型部署: 在完成模型训练后,机器学习框架下一个需要支持的关键功能是模型部署。为了确保模型可以在内存有限的硬件上执行,会使用模型转换、量化、蒸馏等模型压缩技术。同时,也需要实现针对推理硬件平台(例如英伟达Orin)的模型算子优化。最后,为了保证模型的安全(如拒绝未经授权的用户读取),还会对模型进行混淆设计。

分布式训练: 机器学习模型的训练往往需要分布式的计算节点并行完成。其中,常见的并行训练方法包括数据并行、模型并行、混合并行和流水线并行。这些并行训练方法通常由远端程序调用(Remote Procedure Call, RPC)、集合通信(Collective Communication)或者参数服务器(Parameter Server)实现。

机器学习生态

在这里插入图片描述
联邦学习: 随着用户隐私保护和数据保护法的出现,许多机器学习应用无法直接接触用户数据完成模型训练。因此这一类应用需要通过机器学习框架实现联邦学习(Federated Learning)。

推荐系统: 相比于传统基于规则的推荐系统,深度学习推荐系统能够有效分析用户的海量特征数据,从而实现在推荐准确度和推荐时效性上的巨大提升。

强化学习: 强化学习具有数据收集和模型训练方法的特殊性。因此,需要基于机器学习框架进一步开发专用的强化学习系统。

可解释AI: 随着机器学习在金融、医疗和政府治理等关键领域的推广,基于机器学习框架进一步开发的可解释性AI系统正得到日益增长的重视。

机器人: 机器人是另一个开始广泛使用机器学习框架的领域。相比于传统的机器人视觉方法,机器学习方法在特征自动提取、目标识别、路径规划等多个机器人任务中获得了巨大成功。

图学习: 图(Graph)是最广泛使用的数据结构之一。许多互联网数据(如社交网络、产品关系图)都由图来表达。机器学习算法已经被证明是行之有效的分析大型图数据的方法。这种针对图数据的机器学习系统被称之为图学习系统(Graph Learning System)。

机器学习集群调度: 机器学习集群一般由异构处理器、异构网络甚至异构存储设备构成。同时,机器学习集群中的计算任务往往具有共同的执行特点(如基于集合通信算子AllReduce迭代进行)。因此,针对异构设备和任务特点,机器学习集群往往具有特定的调度方法设计。

量子计算: 量子计算机一般通过混合架构实现。其中,量子计算由量子计算机完成,而量子仿真由传统计算机完成。由于量子仿真往往涉及到大量矩阵计算,许多量子仿真系统(如TensorFlow Quantum和MindQuantum)都基于机器学习框架实现。

机器学习工作流

在这里插入图片描述
数据处理: 用户需要数据处理API来支持将数据集从磁盘读入。进一步,用户需要对读取的数据进行预处理,从而可以将数据输入后续的机器学习模型中。

模型定义: 完成数据的预处理后,用户需要模型定义API来定义机器学习模型。这些模型带有模型参数,可以对给定的数据进行推理。

优化器定义: 模型的输出需要和用户的标记进行对比,这个对比差异一般通过损失函数(Loss function)来进行评估。因此,优化器定义API允许用户定义自己的损失函数,并且根据损失来引入(Import)和定义各种优化算法(Optimisation algorithms)来计算梯度(Gradient),完成对模型参数的更新。

训练: 给定一个数据集,模型,损失函数和优化器,用户需要训练API来定义一个循环(Loop)从而将数据集中的数据按照小批量(mini-batch)的方式读取出来,反复计算梯度来更新模型。这个反复的过程称为训练。

测试和调试: 训练过程中,用户需要测试API来对当前模型的精度进行评估。当精度达到目标后,训练结束。这一过程中,用户往往需要调试API来完成对模型的性能和正确性进行验证。

环境配置

一般环境的配置需要各个版本相匹配,个人通常按照下面的流程进行环境的配置。
第一步:下载Anconda,可以在CSDN上找到相关的文章,一步步跟着配置即可,最重要的是在自己的电脑上配置好环境变量。此软件可以配置多个环境变量,为以后的工作开展会更加便利。
第二步:IDE工具一般用的是Pycahrm,Vscode也是可以的。个人认为Pycahrm2022的版本是最好用的。
第三步:如果用的是开源的代码,一般会给出项目的依赖环境库,可以直接使用pip命令行进行安装。

数据处理

API提供了大量Python函数支持用户用一行命令即可读入常见的训练数据集(如MNIST,CIFAR,COCO等)。 在加载之前需要将下载的数据集存放在./datasets/MNIST_Data路径中;
tf或者pytorch均提供了用于数据处理的API模块dataset,用于存储样本和标签。
在加载数据集前,通常会对数据集进行一些处理dataset也集成了常见的数据处理方法。 以下代码读取了MNIST的数据是大小为28x28的图片,返回DataSet对象。

import tensorflow as tf
# 设置数据集路径
DATA_DIR = './datasets/MNIST_Data/train'
mnist_dataset = tf.data.Dataset.list_files(DATA_DIR + "/*/*.png", shuffle=False)

有了DataSet对象后,通常需要对数据进行增强,常用的数据增强包括翻转、旋转、剪裁、缩放等;在tf中是使用map将数据增强的操作映射到数据集中的,之后进行打乱(Shuffle)和批处理(Batch)。

import tensorflow as tf# 数据处理过程
def create_dataset(data_path, batch_size=32, repeat_size=1, num_parallel_workers=1):# 加载 MNIST 数据集# TensorFlow 提供了内置的 MNIST 数据集加载方法(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()# 选择训练集或测试集images = train_images if "train" in data_path else test_imageslabels = train_labels if "train" in data_path else test_labels# 将数据转换为 TensorFlow 数据集mnist_ds = tf.data.Dataset.from_tensor_slices((images, labels))# 定义数据预处理函数def preprocess(image, label):# 调整图像大小image = tf.image.resize(image[..., tf.newaxis], (32, 32))  # 添加通道维度并调整大小# 归一化图像image = tf.cast(image, tf.float32) / 255.0# 标准化图像(使用与 MindSpore 示例相同的均值和标准差)mean = 0.1307std = 0.3081image = (image - mean) / std# 转换标签为 int32label = tf.cast(label, tf.int32)return image, label# 应用预处理函数mnist_ds = mnist_ds.map(preprocess, num_parallel_calls=num_parallel_workers)# 打乱数据buffer_size = 10000mnist_ds = mnist_ds.shuffle(buffer_size=buffer_size)# 重复数据集mnist_ds = mnist_ds.repeat(repeat_size)# 批量处理mnist_ds = mnist_ds.batch(batch_size, drop_remainder=True)return mnist_ds
# 示例用法
data_path = './datasets/MNIST_Data/train'  # 示例路径,实际路径可能不同
batch_size = 32
repeat_size = 1
num_parallel_workers = tf.data.AUTOTUNE  # 使用自动调整线程数# 创建数据集
mnist_dataset = create_dataset(data_path, batch_size, repeat_size, num_parallel_workers)# 查看数据集
for images, labels in mnist_dataset.take(1):print("Images shape:", images.shape)print("Labels shape:", labels.shape)

模型定义

在 TensorFlow 中,定义神经网络通常使用 tf.keras.Model 或 tf.keras.Sequential。以下是一个基于 TensorFlow 的实现,等效于你描述的 MindSpore 神经网络结构。这个网络包含一个输入层、一个 Flatten 层将输入数据压平为一维向量,然后是三个全连接层,最后输出层有 10 个神经元,对应于 MNIST 数据集中的 10 个类别。

import tensorflow as tf
from tensorflow.keras import layers, models
# 定义神经网络模型
class MyModel(tf.keras.Model):def __init__(self):super(MyModel, self).__init__()# 定义网络层self.flatten = layers.Flatten(input_shape=(28, 28))  # 将输入图像压平为一维向量self.fc1 = layers.Dense(128, activation='relu')      # 第一个全连接层,128个神经元self.fc2 = layers.Dense(64, activation='relu')       # 第二个全连接层,64个神经元self.fc3 = layers.Dense(10, activation='softmax')    # 输出层,10个神经元,对应10个类别def call(self, inputs):# 定义前向传播过程x = self.flatten(inputs)x = self.fc1(x)x = self.fc2(x)x = self.fc3(x)return x

损失函数和优化器

有了神经网络组件构建的模型我们还需要定义损失函数来计算训练过程中输出和真实值的误差。
均方误差(Mean Squared Error,MSE)是线性回归中常用的,是计算估算值与真实值差值的平方和的平均数。
平均绝对误差(Mean Absolute Error,MAE)是计算估算值与真实值差值的绝对值求和再求平均。
交叉熵(Cross Entropy,CE)是分类问题中常用的,衡量已知数据分布情况下,计算输出分布和已知分布的差值。
上面3个就是常用的损失函数。

有了损失函数,我们就可以通过损失值利用优化器对参数进行训练更新。神经网络的优化器种类很多,一类是学习率不受梯度影响的随机梯度下降(Stochastic Gradient Descent)及SGD的一些改进方法,如带有Momentum的SGD;另一类是自适应学习率如AdaGrad、RMSProp、Adam等。
SGD的更新是对每个样本进行梯度下降,因此计算速度很快,但是单样本更新频繁,会造成震荡;为了解决震荡问题,提出了带有Momentum的SGD,该方法的参数更新不仅仅由梯度决定,也和累计的梯度下降方向有关,使得增加更新梯度下降方向不变的维度,减少更新梯度下降方向改变的维度,从而速度更快也减少震荡。
自适应学习率AdaGrad是通过以往的梯度自适应更新学习率,不同的参数Wi具有不同的学习率。AdaGrad对频繁变化的参数以更小的步长更新,而稀疏的参数以更大的步长更新。因此对稀疏的数据表现比较好。
Adadelta是对AdaGrad的改进,解决了AdaGrad优化过程中学习率a单调减少问题;Adadelta不对过去的梯度平方进行累加,用指数平均的方法计算二阶动量,避免了二阶动量持续累积,导致训练提前结束。
Adam可以理解为Adadelta和Momentum的结合,对一阶二阶动量均采用指数平均的方法计算。

# 创建模型实例
model = MyModel()
# 打印模型结构
model.summary()
# 编译模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])

训练及保存模型

# 示例:加载 MNIST 数据集并训练模型
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_images = train_images.reshape((60000, 28, 28)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28)).astype('float32') / 255
# 训练模型
model.fit(train_images, train_labels, epochs=5, batch_size=32)
# 保存模型
model.save('my_mnist_model.h5')
print("模型已保存到 'my_mnist_model.h5'")
# 加载模型
loaded_model = tf.keras.models.load_model('my_mnist_model.h5')
print("模型已加载")
# 评估模型
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Test accuracy: {test_acc}")

测试及验证模型

测试是将测试数据集输入到模型,运行得到输出的过程。通常在训练过程中,每训练一定的数据量后就会测试一次,以验证模型的泛化能力。
在训练完毕后,参数保存在checkpoint中,可以将训练好的参数加载到模型中进行验证。

# 定义测试函数
def test_net(model, data_path):"""定义验证的方法"""ds_eval = create_dataset(os.path.join(data_path, "test"), is_train=False)loss, accuracy = model.evaluate(ds_eval)print(f"Test accuracy: {accuracy:.4f}")# 定义加载模型并进行预测的函数
def predict_with_model(model_path, data_path):# 加载模型model = tf.keras.models.load_model(model_path)# 创建测试数据集,batch_size设置为1,则取出一张图片ds_test = create_dataset(os.path.join(data_path, "test"), batch_size=1, is_train=False)data = next(iter(ds_test))# 获取测试图片和实际分类images, labels = dataimages = images.numpy()labels = labels.numpy()# 使用模型进行预测output = model.predict(images)predicted = np.argmax(output, axis=1)# 输出预测分类与实际分类print(f'Predicted: "{predicted[0]}", Actual: "{labels[0]}"')# 主函数
if __name__ == "__main__":# 定义数据路径mnist_path = "./datasets/MNIST_Data"# 创建模型并编译model = create_model()model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 创建训练数据集ds_train = create_dataset(os.path.join(mnist_path, "train"), is_train=True)# 训练模型model.fit(ds_train, epochs=5)# 保存模型model.save('my_mnist_model.h5')print("模型已保存到 'my_mnist_model.h5'")# 验证模型精度test_net(model, mnist_path)# 加载模型并进行预测predict_with_model('my_mnist_model.h5', mnist_path)

定义深度神经网络

随着深度神经网络的飞速发展,各种深度神经网络结构层出不穷,但是不管结构如何复杂,神经网络层数量如何增加,构建深度神经网络结构始终遵循最基本的元素:

  • 1.承载计算的节点;
  • +2.可变化的节点权重(节点权重可训练);
  • 3.允许数据流动的节点连接。

因此在机器学习编程库中深度神经网络是以层为核心,它提供了各类深度神经网络层基本组件;
将神经网络层组件按照网络结构进行堆叠、连接就能构造出神经网络模型。

以层为核心定义神经网络

神经网络层包含构建机器学习网络结构的基本组件,如计算机视觉领域常用到卷积(Convolution)、池化(Pooling)、全连接(Fully Connected);
自然语言处理常用到循环神经网络(Recurrent Neural Network,RNN);为了加速训练,防止过拟合通常用到批标准化(BatchNorm)、Dropout等。
全连接是将当前层每个节点都和上一层节点一一连接,本质上是特征空间的线性变换;可以将数据从高维映射到低维,也能从低维映射到高维度。 如下图所示了全连接的过程,对输入的n个数据变换到大小为m的特征空间,再从大小为m的特征空间变换到大小为p的特征空间;
可见全连接层的参数量巨大,两次变换所需的参数大小为nxm和mxp。
在这里插入图片描述

卷积操作是卷积神经网络中常用的操作之一,卷积相当于对输入进行滑动滤波。根据卷积核(Kernel)、卷积步长(Stride)、填充(Padding)对输入数据从左到右,从上到下进行滑动,每一次滑动操作是矩阵的乘加运算得到的加权值。 如下图所示的卷积操作主要由输入、卷积核、输出组成输出又被称为特征图(Feature Map)。
在这里插入图片描述
卷积的具体运算过程我们通过下图进行演示。该图输入为4x4的矩阵,卷积核大小为3x3,卷积步长为1,不填充,最终得到的2x2的输出矩阵。 计算过程为将3x3的卷积核作用到左上角3x3大小的输入图上;输出为(1 \times 1 + 2 \times 0 + 2 \times 1 + 3 \times 0 + 2 \times 1 + 3 \times 0 + 4 \times 1 + 1 \times 0 + 3 \times 1 = 12), 同理对卷积核移动1个步长再次执行相同的计算步骤得到第二个输出为11;当再次移动将出界时结束从左往右,执行从上往下移动1步,再进行从左往右移动;依次操作直到从上往下再移动也出界时,结束整个卷积过程,得到输出结果。
我们不难发现相比于全连接,卷积的优势是参数共享(同一个卷积核遍历整个输入图)和参数量小(卷积核大小即是参数量)。
在这里插入图片描述
在卷积过程中,如果我们需要对输出矩阵大小进行控制,那么就需要对步长和填充进行设置。还是上面的输入图,如需要得到和输入矩阵大小一样的输出矩阵,步长为1时就需要对上下左右均填充一圈全为0的数。

在上述例子中我们介绍了一个输入一个卷积核的卷积操作。通常情况下我们输入的是彩色图片,有三个输入,这三个输入称为通道(Channel),分别代表红、绿、蓝(RGB)。
在这里插入图片描述

此时我们执行卷积则为多通道卷积,需要三个卷积核分别对RGB三个通道进行上述卷积过程,之后将结果加起来。 具体如上图描述了一个输入通道为3,输出通道为1,卷积核大小为3x3,卷积步长为1的多通道卷积过程;需要注意的是,每个通道都有各自的卷积核,同一个通道的卷积核参数共享。如果输出通道为out_c,输入通道为in_c,那么需要outc​×inc个卷积核。

池化是常见的降维操作,有最大池化和平均池化。池化操作和卷积的执行类似,通过池化核、步长、填充决定输出;最大池化是在池化核区域范围内取最大值,平均池化则是在池化核范围内做平均。与卷积不同的是池化核没有训练参数
池化层的填充方式也有所不同,平均池化填充的是0,最大池化填充的是(-inf)。 如下图是对4x4的输入进行2x2区域池化,步长为2,不填充;图左边是最大池化的结果,右边是平均池化的结果。
在这里插入图片描述
有了卷积、池化、全连接组件就可以构建一个非常简单的卷积神经网络了, 如下图展示了一个卷积神经网络的模型结构。 给定输入3x64x64的彩色图片,使用16个3x3x3大小的卷积核做卷积,得到大小为16x64x64的特征图; 再进行池化操作降维,得到大小为16x32x32的特征图; 对特征图再卷积得到大小为32x32x32特征图,再进行池化操作得到32x16x16大小的特征图; 我们需要对特征图做全连接,此时需要把特征图平铺成一维向量这步操作称为Flatten,压平后输入特征大小为32x16x16=8192; 之后做一次全连接对大小为8192特征变换到大小为128的特征,再依次做两次全连接分别得到64,10。 这里最后的输出结果是依据自己的实际问题而定,假设我们的输入是包含0到9的数字图片,做分类那输出对应是10个概率值,分别对应0到9的概率大小。

在卷积神经网络的计算过程中,前后的输入是没有联系的,然而在很多任务中往往需要处理序列信息,如语句、语音、视频等,为了解决此类问题诞生出循环神经网络(Recurrent Neural Network,RNN);
循环神经网络很好的解决了序列数据的问题,但是随着序列的增加,长序列又导致了训练过程中梯度消失和梯度爆炸的问题,因此有了长短期记忆(Long Short-term Memory,LSTM);
在语言任务中还有Seq2Seq它将RNN当成编解码(Encoder-Decoder)结构的编码器(Encoder)和解码器(Decode); 在解码器中又常常使用注意力机制(Attention);基于编解码器和注意力机制又有Transformer; Transformer又是BERT模型架构的重要组成。

神经网络层实现原理

如下图所示描述了神经网络构建过程中的基本细节。
在这里插入图片描述

基类需要初始化训练参数、管理参数状态以及定义计算过程;神经网络模型需要实现对神经网络层和神经网络层参数管理的功能。在机器学习编程库中,承担此功能有MindSpore的Cell、PyTorch的Module。Cell和Module是模型抽象方法也是所有网络的基类。
现有模型抽象方案有两种,一种是抽象出两个方法分别为Layer(负责单个神经网络层的参数构建和前向计算),Model(负责对神经网络层进行连接组合和神经网络层参数管理);另一种是将Layer和Model抽象成一个方法,该方法既能表示单层神经网络层也能表示包含多个神经网络层堆叠的模型,Cell和Module就是这样实现的。

自定义神经网络层

假设已经有了神经网络模型抽象方法Cell,构建Conv2D将继承Cell,并重构__init__和__call__方法,在__init__里初始化训练参数和输入参数,在__call__里调用低级API实现计算逻辑。

# 接口定义:
卷积层的接口:convolution(input, filters, stride, padding)
变量:Variable(value, trainable=True)
高斯分布初始化方法:random_normal(shape)
神经网络模型抽象方法:Cell# 定义卷积层
class Conv2D(Cell):def __init__(self, in_channels, out_channels, ksize, stride, padding):# 卷积核大小为 ksize x ksize x inchannels x out_channelsfilters_shape = (out_channels, in_channels, ksize, ksize)self.stride = strideself.padding = paddingself.filters = Variable(random_normal(filters_shape))def __call__(self, inputs):outputs = convolution(inputs, self.filters, self.stride, self.padding)

有了上述定义在使用卷积层时,就不需要创建训练变量了。 如我们需要对30x30大小10个通道的输入使用3x3的卷积核做卷积,卷积后输出通道为20。 调用方式如下:

conv = Conv2D(in_channel=10, out_channel=20, filter_size=3, stride=2, padding=0)
output = conv(input)

在执行过程中,初始化Conv2D时,__setattr__会判断属性,属于Cell把神经网络层Conv2D记录到self._cells,属于parameter的filters记录到self._params。
查看神经网络层参数使用conv.parameters_and_names;查看神经网络层列表使用conv.cells_and_names;执行操作使用conv(input)。

时间有限,有需要的同学可以看下面博主的博客链接,介绍的更为详细。

https://www.cnblogs.com/nickchen121/p/11686958.html#tid-bhXdce

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

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

相关文章

Excel 转 JSON by WTSolutions API 文档

Excel 转 JSON by WTSolutions API 文档 简介 Excel 转 JSON API 提供了一种简单的方式将 Excel 和 CSV 数据转换为 JSON 格式。该 API 接受制表符分隔或逗号分隔的文本数据,并返回结构化的 JSON。 接口端点 POST https://mcp.wtsolutions.cn/excel-to-json-api 请求…

git版本发布

cvs和svn都是集中式版本控制系统,而git是分布式版本控制系统。 1、集中式版本控制系统必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,呵呵。分布式版本控制系统…

138-EMD-KPCA-CPO-CNN-BiGRU-Attention模型!

138-EMD-KPCA-CPO-CNN-BiGRU-Attention基于经验模态分解和核主成分分析的长短期记忆网络改进多维时间序列预测MATLAB代码!其中(含CPO-CNN-BiGRU-attention、EMD-CPO-CNN-BiGRU-Attention、EMD-KPCA-CPO-CNN-BiGRU-Attention三个模型的对比) 可…

系统思考:多元胜过能力

系统思考:从整体出发,打破瓶颈,拥抱多元 我们是否曾经陷入过这样的困境? 1、专注能力提升,却无法突破瓶颈:我和团队日复一日地努力提升个人能力,投入无数时间和精力,但始终无法打破现…

qt样式整合持续更新中(实测有效的)

// 仅显示上边框 一般可以作为直线使用 border-top: 2px solid black; //画虚线 border-bottom: 2px dashed white; //单个圆角 border-bottom-left-radius: 8px; border-bottom-right-radius: 8px; //透明背景 background:rgba(0,0,0,0); //设置字体 font:15pt; //给button设置…

[java][springboot]@PostConstruct的介绍和用法

在 Spring Boot(以及整个 Spring Framework)中,PostConstruct 是一个非常常用的注解,用于在 依赖注入完成后 执行一些初始化操作。import jakarta.annotation.PostConstruct; import org.springframework.stereotype.Component;Co…

Leaflet面试题及答案(41-60)

查看本专栏目录 文章目录 🟢 面试问题及答案(41-60)41. 如何判断某个点是否在地图可视区域内?42. 如何动态更新 Marker 位置?43. 如何清除地图上的所有图层?44. 如何保存地图截图?45. 如何检测浏览器是否支持触摸?46. Leaflet 是否支持 TypeScript?47. 如何修改默认图…

Redis事件机制

Redis 采用事件驱动机制来处理大量的网络IO。它并没有使用 libevent 或者 libev 这样的成熟开源方案,而是自己实现一个非常简洁的事件驱动库 ae_event。事件机制Redis中的事件驱动库只关注网络IO,以及定时器。该事件库处理下面两类事件:文件事…

Linux基础开发工具

目录 1.写在前面 2.权限 3.file命令 4.基础开发工具 1.软件包管理器 5.编辑器vim 1.写在前面 我们在上一讲解中讲解了权限是人事物属性,还知道了拥有者所属组其他人这三个概念,知道了33一组,rwx分别代表什么。那么下面我们继续进行权限…

ICCV2025 特征点检测 图像匹配 RIPE

目测对刚性物体效果比较好代码:https://github.com/fraunhoferhhi/RIPE 论文:https://arxiv.org/abs/2507.04839import cv2 import kornia.feature as KF import kornia.geometry as KG import matplotlib.pyplot as plt import numpy as np import torc…

Ubuntu22.0.4安装PaddleNLP

Ubuntu22.0.4安装PaddleNLP环境说明安装底层框架Paddle安装PddleNLP1. pip安装2. 验证安装3. 最后问题集锦环境说明 1. miniconda 25.5.1 2. python 3.12.11 3. pip 25.1 4. nvidia 570.144 5. cuda 12.8**注意:**安装过程可能遇到的一些问题,参考末尾的…

【HTTP服务端】Cookie?Session?Token?

文章目录cookie与sessiontoken什么是JWT?JWT的组成结构1. Header(头部)2. Payload(负载)3. Signature(签名)JWT工作原理JWT的特点安全注意事项cookie与session cookie有哪些属性 键值对&#xf…

安装Git

Git安装避坑指南技术 操作系统选择与准备 Windows用户需注意系统版本兼容性,建议使用Windows 10及以上版本 Mac用户需检查是否安装Xcode Command Line Tools Linux用户需区分apt/yum等包管理器命令差异 安装包下载注意事项 从官方渠道(git-scm.com&a…

UDP服务器的优缺点都包含哪些?

UDP协议不需要像TCP协议那样进行复杂的连接建立与拆除过程,在进行传输数据信息的过程中,应用层将数据交给UDP层,UDP层直接加上首部就发往网络层,极大地减少了处理时间和资源消耗。例如在一些简单的网络监控程序中,只是…

sqli-labs靶场通关笔记:第7-8关 布尔盲注

第七关1.审题这里判断出是))闭合,但是页面只有正确和错误的回显状态,报错的回显也是固定的,没有显示报错具体信息。这关使用的方法是布尔盲注。为什么叫布尔盲注?因为它返回的结果只有true和false 两个值,攻击者需要通…

理解支持向量机(SVM):理论、数学和实现的综合指南

支持向量机(SVMs)是强大的监督学习算法,用于分类和回归任务,尽管它们主要用于分类。由Vladimir Vapnik及其同事在1990年代引入,SVMs基于统计学习理论,特别适用于需要将数据点稳健分离到不同类别的任务。本博…

使用Navicat对PostgreSQL数据表添加列,自动记录当前行的添加日期

点开表设计,向如下这样一个字段: 字段名称可以自定义,博主这里叫做:add_date_time类型选择:timestamp长度写成:6默认值输入:CURRENT_TIMESTAMP 添加行:默认值:

VR协作海外云:跨国企业沉浸式办公解决方案

随着全球化进程加速,VR协作海外云正成为跨国企业数字化转型的核心解决方案。本文将深入解析这项技术如何突破地理限制,实现沉浸式远程协作,并探讨其在跨文化团队管理、实时3D数据交互等场景中的独特优势。 VR协作海外云:跨国企业沉…

[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)

ps:这是你为了点灯最繁琐的一次 1.软件下载 vscode下载地址:Documentation for Visual Studio Codeesp_idf下载地址:https://dl.espressif.cn/dl/esp-idf/?idf4.4 (从上往下第三) 2.软件安装 可以均默认安装,但建议不要放在C盘&…

tailwindcss详解

Tailwind CSS 详解:实用主义的现代 CSS 框架 Tailwind CSS 是一个功能优先(utility-first)的 CSS 框架,它通过提供低级别的实用类来快速构建自定义设计,而无需离开 HTML 文件。以下是全面解析: 一、核心概念…