人工智能学习框架—飞桨Paddle人工智能

1.人工智能框架

机器学习的三要素:模型、学习策略、优化算法。

当我们用机器学习来解决一些模式识别任务时,一般的流程包含以下几个步骤:

uTools_1691925173170

1.1.浅层学习和深度学习

浅层学习(Shallow Learning):不涉及特征学习,其特征主要靠人工经验或特征转换方法来抽取。

底层特征VS高层语义:人们对文本、图像的理解无法从字符串或者图像的底层特征直接获得

深度学习通过构建具有一定“深度”的模型,可以让模型来自动学习好的特征表示(从底层特征,到中层特征,再到高层特征),从而最终提升预测或识别的准确性。

uTools_1691925398973

深度学习的数学描述

uTools_1691925529241

fl(x)为非线性函数,不一定连续。

深度学习的难点

y=f^5^(f^4^(f^3^(f^2^(f^1^(x)))))

贡献度分配问题:一个复杂系统中每个组件对最终评价的贡献。

uTools_1691925707504

如何解决贡献度分配问题:

其中我们一般采用的方法就是求偏导数,也就是使用误差反向传播算法,这是我们学习神经网络的时候接触到过的。

贡献度:

uTools_1691926340292

我们要知道一点,那就是神经网络天然不是深度学习,但深度学习天然是神经网络!

1.2.神经网络与深度学习的关系

人工智能的一个子领域

神经网络:一种以(人工)神经元为基本单元的模型

深度学习:一类机器学习问题,主要解决贡献度分配问题

uTools_1691926405209

我们都明白,机器(深度)学习非常有可能成为计算机学科的关键技术。

机器学习必然会发展到深度学习,不一定是神经网络,基于不可微架构的深度学习可能是未来方向。对于计算机学科是如此,而对于其他学科也是联系十分的紧密,深度学习也越来越多地成为传统学科的关键技术,涉及到数学、物理、化学、医药、天文、地理。

经过两周腾讯比赛,我对深度学习和强化学习有了自己的感悟:

  1. 理论支撑不足

  2. 调参一头雾水

  3. 模型无法解释

  4. 改进没有方向

当然,也有玩笑的成分在里面,也算是我和人工智能的第一次接触下来的感慨吧,领域多、知识点多,理论和实践紧密结合。

面对这些问题我们该怎么做嘞?

没错,就是肝各种前置知识,当然并行一起也可以。数学方面,就是线性代数、微积分、变分法、概率论、优化以及信息论。

我们需要在学习中逐步形成下面这张图的知识体系:

uTools_1691928991675

机器学习实践流程中的五要素:

uTools_1691929291525

1.3.Runner类

uTools_1691929456233

看到图上的箭头了吗,我们在模型准备中就是通过相应的损失函数、评价指标之后,也就是runner运行以后确定了模型合规,然后送到训练中,可能是强化训练进行探索,也可能是别的东西。像我们在腾讯开悟的比赛中,就是这样的形式,训练一定的时间就会出相应的模型,再提交到指定的平台进行模型评价和测试评估。

代码模板:

class Runner(object):
    def __init__(self, model, optimizer, loss_fn, metric):
        self.model = model #模型
        self.optimizer = optimizer #优化器
        self.1oss_fn = 1oss_fn #损失函数
        self.metric = metric #评价指标
        
    # 模型训练
    def train(self, train_dataset, dev_dataset=None, **kwargs):
        pass
    
    # 模型评价
    def evaluate(self, data_set, **kwargs):
        pass
    
    # 模型预测
    def predict(self, x, **kwargs):
        pass
    
    # 模型保存
    def save_model(self, save_path):
        pass
    
    # 模型加载
    def load_model(self, model_path):
        pass

1.4.张量与算子

数据的表现形式是张量

uTools_1691936884794

模型的基本单位:算子

class Op(object):
    def __init__(self):
        pass
    
    def __call__(self, inputs):
        return self.forward(inputs)
    
    # 前向函数
    # 输入:张量inputs
    # 输出:张量outputs
    def forward(self, inputs):
        # return outputs
        raise NotImplementedError
        
    # 反向函数
    # 输入:最终输出对outputs的梯度outputs_grads
    # 输出:最终输出对inputs的梯度inputs_grads
    def backward(self,outputs_grads):
        # return inputs_grads
        raise NotImplementedError

加法算子的前向和反向计算过程

uTools_1691937846915

一个复杂的机器学习模型(比如神经网络)可以看做一个复合函数

uTools_1691936991723

参数学习:梯度计算

uTools_1691937058504

为了继承飞桨的paddle.nn.layer

uTools_1691937923275

蒲公英一书中实现的Runner类:

RunnerV1

用于线性回归模型的训练,其中训练过程通过直接求解析解的方式得到模型参数,没有模型优化及计算损失函数过程,模型训练结束后保存模型参数

Runner V2

主要增加的功能为:①在训练过程中引入梯度下降法进行模型优化.

②在模型训练过程中计算训练集和验证集上的损失及评价指标并打印,在训练过程中保存最优模型

Runner V3

主要增加三个功能:使用随机梯度下降法进行参数优化.训练过程使用DataLoader加载批量数据.模型加载与保存中,模型参数使用state_dict方法获取,使用state_dist加载

Runner V3基本上可以应用于大多数机器学习任务。

算子库nndl

从模型构建角度出发,借鉴深度学习框架中算子的概念,从基础开始一步步实现自定义的基本算子库,进一步通过组合自定义算子来搭建机器学习模型,最终搭建自己的机器学习模型库nndl。

在实践过程中不仅知其然还知其所以然,更好地掌握深度学习的模型和算法,并理解深度学习框架的实现原理。

2.NNDL开源库

NNDL (Neural Network Distillation Library) 是一个用于深度学习研究的开源库,主要用于知识蒸馏(Knowledge Distillation)任务。

知识蒸馏是一种将大型预训练模型(教师模型)的知识转移到小型模型(学生模型)的方法。NNDL 提供了一个框架,支持使用图像分类任务进行知识蒸馏,包括模型定义、训练和测试等过程。

该库主要特点包括:

  1. 支持多种流行的深度学习框架,如 TensorFlow 和 PyTorch。

  2. 提供多个预训练的教师模型,以及学生模型的蒸馏训练。

  3. 针对图像分类任务,支持各种数据增强和网络结构。

  4. 可用于开发高效的神经网络模型,包括卷积神经网络、循环神经网络等。

请注意,NNDL 是一个相对较新的开源库,可能存在一些限制和缺陷。在使用过程中,请确保您理解其工作原理和适用范围,并根据需要进行适当的调整和优化。

NNDL案例与实践的特色在于

  1. 深入理论内部的实践,比如:从0实现反向传播、卷积、transformer等。

  2. 关键理论原理的实践,比如:SRN的记忆能力与梯度爆炸、LSTM的记忆能力等。

  3. 贴近产业场景的实践,比如:cnn实现图像分类、mn实现文本分类、transformer实现语义匹配等。

  4. 贴近产业工程的实践,比如:基于训练框架Runnert的实验、逐步完善的nnd工具包、模型精度速度的分析方法等。

  5. 兼顾理论与实践的作业设计,比如:基础知识回顾与实践,动手比赛和产业应用实践等。

uTools_1692010723000

3.模型训练

使用Runner,进行相关模型训练配置,即可启动模型训练

# 指定运行设备
use_gpu = True if paddle.get_device().startswith("gpu") else False
if use_gpu:
    paddle.set_device('gpu:0')
# 学习率大小
lr = 0.001
# 批次大小
batch_size = 64
# 加载数据
train_loader = io.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
dev_loader = io.DataLoader(dev_dataset, batch_size=batch_size)
test_loader = io.DataLoader(test_dataset, batch_size=batch_size)
# 定义网络
model = resnet19_model
# 定义优化器,这里使用Adam优化器以及l2正则化策略,相关内容在后续会有相应的教程
optimizer = opt.Adam(learning_rate=lr, parameters=model.parameters(), weight_decay=0.005)
# 定义损失函数
loss_fn = F.cross_entropy
# 定义评价指标
runner = RunnerV3(model, optimizer, loss_fn, metric)
# 启动训练
log_steps = 3000
eval_steps = 3000
runner.train(train_loader,dev_loader,num_epochs=30,log_steps=log_steps,
             eval_steps=eval_steps,save_path="best_model.pdparams")

4.残差网络

  1. 残差网络:在神经网络模型中给非线性层增加直连边的方式来缓解梯度消失问题,从而使训练深度神经网络变得更加容易

  2. 残差单元:一个典型的残差单元由多个级联的卷积层和一个跨层的直连边组成ResBlock f(x) = f(x; θ)+x

  3. Transformer:加与规范层,H=LN(H+X)

  4. Gradient BoostingGreedy Function Approximation:A Gradient Boosting MachineGBDT:Gradient Boosting Decision Tree

uTools_1692012181100

uTools_1692012202408

ResNet18整体结构与实现

uTools_1692012728749

# 定义完整网络
class Model_ResNet18(nn.Layer):
    def __init__(self, in_channels=3, num_classes=10, use_residual=Ture):
        super(Model_ResNet18, self).__init__()
        b1 = make_first_block(in_channels)
        b2, b3, b4, b5 = make_blocks(use_residual)
        # 封装模板1到模板6
        self.net = nn.Sequential(b1, b2, b3, b4, b5,
                                # 模块6:汇聚层、全连接层
                                nn.AdaptiveAvgPool2D(1),
                                nn.Flatten(), nn.Linear(512, num_classes))

然后针对构建ResNet18中各模块,后序会有所介绍,这里就以b1为例,展示一下它相应的代码

def make_first_block(in_channels):
    # m模块1:7*7卷积、批归一化、汇聚
    b1 = nn.Sequential(nn.Conv2D(in_channels, 64, kernel_size=7, stride=2, padding=3),
                      nn.BatchNorm2D(64), nn.ReLU(),
                      nn.MaxPool2D(kernel_size=3, stride=2, padding=1))
    return b1

通常而言,特别是是在模型评价中,不带残差连接的ResNet18网络的准确率是远小于加了残差连接的神经网络的,模型效果差别是相当显著的。

5.卷积神经网络应用及原理

5.1.卷积神经网络

卷积一词我们并不陌生,我们在学习深度学习或者强化学习经常会遇到卷积这个概念。简而言之,卷积就是将我们的数据进行处理,处理得足够小,足以让我们的机器去识别。

在二维卷积算子中,我们的目的是在具体实现上,以互相运算来代替卷积,对于一个输入矩阵X∈RM*N,使用滤波器W∈RU*V进行运算。

uTools_1692013957228

上面的深色区域也就是我们所说的滑动窗口(嘿嘿,情不自禁想起了y总算法基础课里的滑动窗口一题,那个是一个典型的动态规划问题),为了实现局部信息到全局信息的融合,通过权值共享实现了参数量的不增加,降低了网络模型的复杂度,减少了权值的数目。参数的。在整个网络的训练过程中,包含权值的卷积核也会随之更新,直到训练完成。

输出特征图大小M' = M - U + 1 N' = N - V + 1

特性

  1. 局部连接:第i层中的每一个神经元都只和第i-1层中某个局部窗口内的神经元相连,构成一个局部连接网络。

  2. 权重共享:所有作为参数的卷积核W∈RU*V对于第i层的所有神经元都是相同的。

二维卷积算子

可以随机构造一个二维输入矩阵

paddle.seed(100)
inputs = paddle.to_tensor([[[1.,2.,3.],[4.,5.,6.],[7.,8.,9.]]])
​
conv2d = Conv2D(kernel_size=2)
outputs = conv2d(inputs)
print("input:{}\noutput:{}"format(inputs,outputs))

5.2.API说明

API(Application Programming Interface,应用程序编程接口)是一种定义软件组件之间如何通信的规范。它提供了一种标准化的接口,允许不同的软件系统之间进行交互和通信。

API通常是一组预先定义的函数、方法、类和对象,开发人员可以使用这些接口来调用软件组件的功能。API还规定了如何传递参数、返回值以及错误处理等细节。

API说明通常包括以下内容:

  1. 接口名称和功能描述:提供接口的名称和功能描述,让开发人员了解该接口的作用和用途。
  2. 输入参数说明:详细说明每个输入参数的名称、类型、意义和用法,以确保开发人员正确地使用这些参数。
  3. 返回值说明:解释每个返回值的含义和用法,以及在成功或失败时返回什么样的数据。
  4. 错误处理说明:描述可能会出现的错误和异常情况,并提供相应的处理方法。
  5. 其他注意事项:提供其他与接口相关的信息和注意事项,例如使用限制、安全要求等。

通过阅读API说明,开发人员可以更好地理解接口的用途和使用方法,从而更有效地使用API进行软件开发和集成。

paddle.create_parameter(shape,dtype,attr=None)

功能:创建一个可学习的Parameter变量

输入:Parameter变量的形状、数据类型、属性

输出:创建的Parameter变量

二维卷积算子的参数量

对于一个输入矩阵X∈RMxN,使用滤波器W∈RUxV进行运算,卷积核的参数量为:U×V

假设有一个32×32大小的图像,使用隐藏层神经元个数为1的全连接前馈网络进行处理:

uTools_1692017872092

32 * 32 + 1 =1025

使用3 * 3卷积核进行处理,参数量为:9

5.3.二维卷积算子的计算量

计算量:网络乘加运算总次数

FLOPs=M' * N' * U * V

假设有一个32×32大小的图像,使用3×3卷积核进行处理,计算量为:

M' = M - U + 1 = 30

N' = N - V + 1 = 30

FL0Ps = M' × N' × U × V = 30 × 30 × 3 × 3 = 8100

5.4.感受野

这个概念也不陌生,是指神经元或感受器能接受刺激的空间范围。在视觉系统中,它通常指的是视网膜上一个简单的、没有特定方向性的感受器(即非方向性光感受器)能接收到的空间范围。在中枢中,某一神经元的感受野是分布于其胞体和树突上,是在时间和空间上能被神经元响应的各种形式的光刺激模式(即特定的空间频率特性)的总和。

就如下面两个特征图:

uTools_1692018794565

感受野大小:3 x 3

输出特征图上的像素点所能感受到的输入数据的范围

uTools_1692018861836

5.5.带步长和零填充的二维卷积算子

步长(Stride)

在所有维度上每隔S个元素计算一次,S称为卷积的步长

对于一个输入矩阵X∈RMxW,使用滤波器W∈RUxV进行运算

uTools_1692020011940

零填充(Zero Padding)

如果不进行填充,当卷积核尺寸大于时,输出特征会缩减

对输入进行零填充可以对卷积核的宽度和输出的大小进行独立的控制

对于一个输入矩阵X∈RMxN,使用滤波器W∈RUxV进行运算,步长为S,并进行零填充后,输出矩阵大小为:

uTools_1692020088081

参数量:U x V

uTools_1692020121840

带步长和零填充的二维卷积算子代码

class Conv2D(nn.Layer):
    def __init__(self, kernel_size, stride=1, padding=0,
                 weight_attr=paddle.ParamAttr(initializer=nn.initializer.Constant(value=1.0))):
        super(Conv2D, self).__init__()
        self.weight = paddle.create_parameter(shape=[kernel_size,kernel_size],
                                             dtype='float32',
                                             attr=weight_attr)
        # 步长
        self.stride = stride
        # 零填充
        self.padding = padding
        
    def forward(self, X):
        # 零填充
        new_X = paddle.zeros([X.shape[0], X.shape[1]+2*self.padding, X.shape[2]+2*self.padding])
        new_X[:, self.padding:X.shape[1]+self.padding, self.padding:X.shape[2]+self.padding] = X
        u, v = self.weight.shape
        output_w = (new_X.shap[1] - u) // self.stride + 1
        output_h = (new_X.shap[2] - u) // self.stride + 1
        output = paddle.zeros([X.shape[0], output_w, output_h])
        for i in range(0, output.shape[1]):
            for j in range(0, output.shape[2]):
                output[:, i, j] = paddle.sum(
                new_X[:, self.stride*i:self.stride*i+u, self.stride*j:self.stride*j+v]*self.weight,
                axis=[1,2])
                return output
            
inputs = paddle.randn(shape=[2, 8, 8])
conv2d_padding = Conv2D(kernel_size=3, padding=1)
outputs = conv2d_padding(inputs)
print("When kernel_size=3,padding=1 stride=1,input's shape:{}output's shape:()"format(inputs.shape,outputs.shape))
conv2d_stride Conv2D(kernel_size=3,stride=2,padding=1)
outputs conv2d_stride(inputs)

卷积神经网络

uTools_1692026218401

6.卷积层算子

输入通道:等于输入特征图的深度D

例如:输入是灰度图像,则输入通道数为1;输入是彩色图像,分别有R、G、B三个通道,则输入通道数为3;输入是深度D的特征图,则输入通道数为D

uTools_1692026260543

6.1.多通道卷积层算子

class Conv2D(nn.Layer):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0,
                weight_attr=paddle.ParamAttr(initializer=nn.initializer.Constant(value=1.0)),
                bias_attr=paddle.ParamAttr(initializer.Constant(value=0.0))):
        super(Conv2D, self).__init__()
        #创建卷积核
        self.weight = paddle.create_parameter(shape=[out_channels, in_channels, kernel_size, kernel_size],
                                              dtype='float32',
                                              attr=weight_attr)
        #创建偏置
        self.bias = paddle.create_parameter(shape=[out_channels, 1],
                                            dtype='float32',
                                            attr=bias_attr)
        self.stride = stride
        self.padding = padding
        #输入通道数
        self.in_channels = in_channels
        #输出通道数
        self.out_channels = out_channels
    #基础卷积运算
    def single_forward(self, X, weight):
        #零填充
        new_X = paddle.zeros([X.shape[0],X.shape[1]+2*self.padding,X.shape[2]+2*self.padding])
        new_X[:,self.padding:X.shape[1]+self.padding,self.padding:X.shape[2]+self.padding]=x
        u,v weight.shape
        output_w =(new_X.shape[1]u)//self.stride +1
        output_h (new_X.shape[2]-v)//self.stride 1
        output paddle.zeros([X.shape[e],output_w,output_h])
        for i in range(0,output.shape[1]):
            for j in range(0, output.shape[2]):
                output[:, i, j] = paddle.sum(
                new_X[:, self.stride*i:self.stride*i+u, self.stride*j:self.stride*j+v]*self.weight,
                axis=[1,2])
                return output

6.2.汇聚层算子

平均汇聚:将输入特征图划分多个为M'×N'大小的区域,对每个区域内的神经元活性值取平均值作为这个区域的表示

最大汇聚:使用输入特征图的每个子区域内所有神经元的最大活性值作为这个区域的表示

uTools_1692107743509

平移不变:当输入数据做出少量平移时,经过汇聚运算后的大多数输出还能保持不变。

参数量:0 计算量:最大汇聚为0 平均汇聚为M' x N' x P

6.3.双向LSTM和注意力机制的文本分类-注意力层

嵌入层:将输入句子中的词语转换成向量表示;

LSTM层:基于双向LSTM网络来构建句子中的上下文表示;

注意力层:使用注意力机制从LSTM的输出中筛选和聚合有效特征;

线性层:输出层,预测对应的类别得分。

6.4.注意力机制

从N个输入向量中选择出和某个特定任务相关的信息。

输入向量:X=[x1;...;Xn]小,其中Xn是向量,X∈RNxD其中n是序列长度,D表示每个元素的维度

查询向量:q,任务相关

uTools_1692111100737

打分函数

加强模型,双线性模型

点积模型,缩放点积模型

QKV自注意力的深度代码解读

uTools_1692111844835

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

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

相关文章

【云原生】【k8s】Kubernetes+EFK构建日志分析安装部署

目录 EFK安装部署 一、环境准备(所有主机) 1、主机初始化配置 2、配置主机名并绑定hosts,不同主机名称不同 3、主机配置初始化 4、部署docker环境 二、部署kubernetes集群 1、组件介绍 2、配置阿里云yum源 3、安装kubelet kubeadm …

【无线点对点网络时延分析和可视化】模拟无线点对点网络中的延迟以及物理层和数据链路层之间的相互作用(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

34.Netty源码之Netty如何处理网络请求

highlight: arduino-light 通过前面两节源码课程的学习,我们知道 Netty 在服务端启动时会为创建 NioServerSocketChannel,当客户端新连接接入时又会创建 NioSocketChannel,不管是服务端还是客户端 Channel,在创建时都会初始化自己…

【云计算原理及实战】初识云计算

该学习笔记取自《云计算原理及实战》一书,关于具体描述可以查阅原本书籍。 云计算被视为“革命性的计算模型”,因为它通过互联网自由流通使超级计算能力成为可能。 2006年8月,在圣何塞举办的SES(捜索引擎战略)大会上&a…

【蓝桥杯】[递归]母牛的故事

原题链接:https://www.dotcpp.com/oj/problem1004.html 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 我们列一个年份和母牛数量的表格: 通过观察,找规律,我们发现: 当年份小于等于4时&…

非常适合大学附近的校园跑腿和自习室订座小程序

推荐两款非常适合在大学内和大学周边的项目 这两款小程序分别是校园跑腿系统和自习室在线订座系统 1、校园跑腿系统,第一张图所示,支持多校运营、快递代取、校园跑腿、租借服务、代理中心、跑腿中心、人员管理、订单抽成、数据统计、众包接单、消息通…

云计算虚拟仿真实训平台

一、云计算虚拟仿真系统概述 云计算虚拟仿真系统是一种基于云计算技术和虚拟化技术的系统,用于实现各种仿真和模拟任务。它可以提供强大的计算能力和资源管理,为用户提供灵活、高效、可扩展的仿真环境。 该系统通常由一组服务器、网络和存储设备组成&am…

【前端】快速掌握HTML+CSS核心知识点

文章目录 1.HTML核心基础知识1.1.编写第一个HTML网页1.2.超链接a标签和路径1.3.图像img标签的用法1.4.表格table标签用法1.5.列表ul、ol、dl标签用法1.6.表单form标签用法1.7.区块标签和行内标签用法 2.CSS核心基础知识2.1.CSS标签选择器viewport布局2.2.CSS样式的几种写法2.3.…

Python Opencv实践 - 图像金字塔

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像上采样 #cv.pyrUp(src, dstNone, dstsizeNone, borderTypeNone) #参考资料:https://blo…

基于深度学习的铁路异物侵限检测算法研究_整体认知感觉欠点意思,但是有一个新的变形卷积-Octave 卷积

相比于其他的交通运输方式,铁路运输具有准时性高、连续性强、速度快、运输量大、运输成本低以及安全可靠等优点。同时由于国家高速铁路网络建设的不断推进,铁路运输逐渐成为我国客运与货运的主要运输方式。虽然铁路运输为人们出行和货物运输带来的极大的…

BOXTRADE-天启量化分析平台 主要功能介绍

BOXTRADE-天启量化分析平台 主要功能介绍 potato 数学 web 缘起 月晕而风,础润而雨 BOXTRADE-天启量化 欢迎来到天启量化!这是一个专注于量化分析的网站。我们致力于为用户提供市场行情技术指标和量化策略分析方面的优质内容和资源。 我们的使命是 做…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价

近年来,国内外学者在生态系统的敏感性、适应能力和潜在影响等方面开展了大量的生态脆弱性研究,他们普遍将生态脆弱性概念与农牧交错带、喀斯特地区、黄土高原区、流域、城市等相结合,评价不同类型研究区的生态脆弱特征,其研究内容…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)四(116)

需求::前端根据后端的返回数据:画统计图; 1.动态获取地域数据以及数据中的平均值,按照平均值降序排序; 说明: X轴是动态的,有对应区域数据则展示; X轴 区域数据降序排序…

C语言案例 判断是否为回文数-06.1

题目:随机输入一个5位数,判断它是不是回文数 步骤一:定义程序的目标 编写C程序,随机输入一个5位数,判断它是不是回文数 步骤二:程序设计 原理:即12321是回文数,个位与万位相同&#…

回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测(多指标,多图)效果一览基…

Spring事件监听源码解析

spring事件监听机制离不开容器IOC特性提供的支持,比如容器会自动创建事件发布器,自动识别用户注册的监听器并进行管理,在特定的事件发布后会找到对应的事件监听器并对其监听方法进行回调。Spring帮助用户屏蔽了关于事件监听机制背后的很多细节…

对象内存布局与对象头

对象内存布局 在Hotspot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头、实例数据、对齐填充。 对象头 在64为系统中,Mark word 占了8个字节,cla ss Pointer 占了8个字节。从jdk1.8开始,存在指针压缩&am…

Python tkinter Notebook标签添加关闭按钮元素,及左侧添加存储状态提示图标案例,类似Notepad++页面

效果图展示 粉色框是当前页面,橙色框是鼠标经过,红色框是按下按钮,灰色按钮是其他页面的效果; 存储标识可以用来识别页面是否存储:例如当前页面已经保存用蓝色,未保存用红色,其他页面已经保存用…

基于.Net Core开发的医疗信息LIS系统源码

SaaS模式.Net Core版云LIS系统源码 医疗信息LIS系统是专为医院检验科设计的一套实验室信息管理系统,能将实验仪器与计算机组成网络,使病人样品登录、实验数据存取、报告审核、打印分发,实验数据统计分析等繁杂的操作过程实现了智能化、自动化…

在 OpenCV 中使用深度学习进行年龄检测-附源码

文末附完整源码和模型文件下载链接 在本教程中,我们将了解使用 OpenCV 创建年龄预测器和性别分类器项目的整个过程。 年龄检测 我们的目标是创建一个程序,使用图像来预测人的性别和年龄。但预测年龄可能并不像你想象的那么简单,为什么呢?您可能会认为年龄预测是一个回归问…