[深度学习实战]基于PyTorch的深度学习实战(上)[变量、求导、损失函数、优化器]

news2024/11/30 7:31:17

目录

  • 一、前言
  • 二、深度学习框架——PyTorch
    • 2.1 PyTorch介绍
    • 2.2 Python安装详解
    • 2.3 PyTorch安装详解
  • 三、变量
  • 四、求导
  • 五、损失函数
    • 5.1 nn.L1Loss
    • 5.2 nn.SmoothL1Loss
    • 5.3 nn.MSELoss
    • 5.4 nn.BCELoss
    • 5.5 nn.CrossEntropyLoss
    • 5.6 nn.NLLLoss
    • 5.7 nn.NLLLoss2d
  • 六、优化器Optim
    •  6.1 SGD
      •   6.1.1 用法
      •   6.1.2 参数
      •   6.1.3 好处
    • 6.2 RMSprop
      •   6.2.1 具体实现
      •   6.2.2 每步迭代过程
      •   6.2.3 用法
      •   6.2.4 参数
    • 6.3 Adagrad
      •   6.3.1 具体实现
      •   6.3.2 每步迭代过程
      •   6.3.3 优点
      •   6.3.4 缺点
      •   6.3.5 用法
      •   6.3.6 参数
    • 6.4 Adadelta
      •   6.4.1 用法
      •   6.4.2 参数
    • 6.5 Adam
      • 6.5.1 具体实现
      • 6.5.2 每步迭代过程
      •   6.5.3 用法
      •   6.5.4 参数
    • 6.6 Adamax
      •   6.6.1 参数


PyTorch——开源的Python机器学习库

一、前言

  用了Matlab搭建神经网络才愈发感觉"人生苦短,我用PyTorch“是多么正确。毕竟新的神经网络架构还是得自己一点点敲,现在是一点都笑不出来了,指望Matlab提供的老框架和训练算法也做不出什么算法方法的突破,顶多就是在实现功能上方便点罢了
  本博文要求读者有一定的Python编程基础!对机器学习和神经网络有一定的了解!。如果是零基础学习人群,请参看我之前的Python基础语法博文和人工智能相关博文。读完它们不会花费你太多的时间,并且如果你能做到简单地阅览完这些博文,就完全有足够的知识储备来彻底搞懂这篇博文的全部内容了。
  以下贴上我之前写的关于神经网络相关的博文,Python相关的也可以去我的博客主页去找。
[深度学习入门]基于Python的理论与实现[感知机、神经网络、误差反向传播法及相关技巧]

[深度学习入门]什么是神经网络?[神经网络的架构、工作、激活函数]


二、深度学习框架——PyTorch

2.1 PyTorch介绍

  PyTorch是 Facebook 发布的一款深度学习框架,和Tensorflow,Keras,Theano等其他深度学习框架都不同。作为动态计算图模式,其应用模型支持在运行过程中根据运行参数动态改变,而其他几种框架都是静态计算图模式,其模型在运行之前就已经确定。
  Python模块可以通过pip安装临时使用时可以使用下述命令:

pip install pythonModuleName -i
https://pypi.douban.com/simple

  也可以永久更改:/root/.pip/pip.conf:

[global]
index-url = https://pypi.douban.com/simple

2.2 Python安装详解

  安装Python就略去不写了,都是可视化界面也没什么可说的。安装后查看当前版本
在这里插入图片描述

[root@iZ25ix41uc3Z ~]# python --version
Python 3.10.9

  下载 setuptools

wget --no-check-certificate 
http://pypi.python.org/packages/source/s/setuptools/setuptools-
解压之后进入目录setuptools-0.6c11
安装python setup.py install

  安装 pip,和 setuptools 过程类似:

wget --no-check-certificate 
https://github.com/pypa/pip/archive/1.5.5.tar.gz
解压之后进入目录pip-1.5.5
安装python setup.py install

  看看 pip 安装是否成功,执行:

pip list

在这里插入图片描述
  如果显示的不是上方的画面,则我们先安装 openssl

yum install openssl openssl-devel -y

  然后再重新安装 python,别的不用重新安装了

[root@iZ25ix41uc3Z Python-3.10.9]# pip list
pip (1.5.4)
setuptools (27.3.0)
wsgiref (0.1.2)

  最后我们就可以安装 numpy,scipy 等科学计算库了。

pip install numpy
pip install scipy

在这里插入图片描述
  最后验证一下 numpy
在这里插入图片描述
  大功告成,如此一来我们已经成功安装 numpy


2.3 PyTorch安装详解

  先试试看 pip 安装能不能成功。输入命令 pip install pytorch,显示结果如下:
在这里插入图片描述
  看来PyTorch不支持pip安装,这里提示到 pytorch.org 下载安装,同时,浏览器自动打开网址:
http://pytorch.org/#pip-install-pytorch
  跟着上面的安装步骤安装就是了,这里也可以去网上找找安装教程。因为这里不是我们的重点,讲多了也没什么意思。
  安装完成后,我们输入命令 python进入 python 交互环境,写一段 pytorch 程序验证一下是不是安装成功了,这段代码调用 torch 的ones 方法,看看能不能正常显示结果:
在这里插入图片描述
  看来没什么问题,安装成功了。下面,我们来一步步学习 pytorch 吧。


三、变量

  先看看 Tensorpytorch 中的数据都是封装成 Tensor 来引用的Tensor实际上就类似于 numpy 中的数组,两者可以自由转换
  我们先生成一个3*4维的数组

import torch
x = torch.Tensor(3,4)
print("x Tensor: ",x)

在这里插入图片描述
  可以看到 torch.Tensor() 方法生成制定维度的随机数。
  下面看看 Variable 的基本操作,引用 Variable

import torch
from torch.autograd import Variable
x=Variable(torch.Tensor(2,2))
print("x variable: ",x)

在这里插入图片描述
  Variable 不光包含了数据,还包含了其他东西,那么,还包含什么东西呢?
  默认 Variable 是有导数 grad 的,x.data 是数据,这里 x.data 就是 Tensor。x.grad 是计算过程中动态变化的导数

print ("x.data: ",x.data, ",x.grad: ",x.grad)

  此时 Variable 还未进行计算,因此 x.grad 为 None。


四、求导

  神经网络中的求导的作用用导数对神经网络的权重参数进行调整
  Pytorch 中为求导提供了专门的包,包名叫autograd如果用autograd.Variable 来定义参数,则 Variable 自动定义了两个变量data代表原始权重数据;而 grad 代表求导后的数据,也就是梯度每次迭代过程就用这个 grad 对权重数据进行修正
在这里插入图片描述

import torch
from torch.autograd import Variable
x = Variable(torch.ones(2, 2), requires_grad=True)
print(x)

  输出为:
在这里插入图片描述

y=x+2
print(y)

  输出为:
在这里插入图片描述

z = y * y * 3
out = z.mean()
print(z, out)

  输出为:
在这里插入图片描述

out.backward()

  反向传播,也就是求导数的意思。输出 out 对 x 求导:

print(x.grad)

在这里插入图片描述
  4.5 是怎么算出来的呢,从前面的公式可以看出 z=(x+2) * (x+2) * 3,它的导数是 3 * (x+2) / 2,当 x=1 时导数的值就是 3 * (1+2) / 2=4.5,和 pytorch 计算得出的结果是一致的。
  权值更新方法

weight = weight + learning_rate * gradient
learning_rate = 0.01
for f in model.parameters():
f.data.sub_(f.grad.data * learning_rate)

  learning_rate 是学习速率,多数时候就叫做 lr,是学习步长用步长 * 导数就是每次权重修正的 delta 值lr 越大表示学习的速度越快,相应的精度就会降低


五、损失函数

  损失函数,又叫目标函数,是编译一个神经网络模型必须的两个参数之一。另一个必不可少的参数是优化器。
  损失函数是指用于计算标签值和预测值之间差异的函数,在机器学习过程中,有多种损失函数可供选择,典型的有距离向量,绝对值向量等
在这里插入图片描述
  上图是一个用来模拟线性方程自动学习的示意图。粗线是真实的线性方程,虚线是迭代过程的示意,w1 是第一次迭代的权重,w2 是第二次迭代的权重,w3 是第三次迭代的权重。随着迭代次数的增加,我们的目标是使得 wn 无限接近真实值
  那么怎么让 w 无限接近真实值呢?其实这就是损失函数和优化器的作用了。图中 1/2/3 这三个标签分别是 3 次迭代过程中预测 Y 值和真实 Y 值之间的差值(这里差值就是损失函数的意思了,当然了,实际应用中存在多种差值计算的公式),这里的差值示意图上是用绝对差来表示的,那么在多维空间时还有平方差,均方差等多种不同的距离计算公式,也就是损失函数了。
  这里示意的是一维度方程的情况,扩展到多维度,就是深度学习的本质了
  下面介绍几种常见的损失函数的计算方法pytorch 中定义了很多类型的预定义损失函数,需要用到的时候再学习其公式也不迟。
  我们先定义两个二维数组,然后用不同的损失函数计算其损失值。
在这里插入图片描述

import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
sample = Variable(torch.ones(2,2))
a=torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
target = Variable (a)

  sample 的值为:[[1,1],[1,1]]。
  target 的值为:[[0,1],[2,3]]。


5.1 nn.L1Loss

在这里插入图片描述
  L1Loss 计算方法很简单,取预测值和真实值的绝对误差的平均数即可

criterion = nn.L1Loss()
loss = criterion(sample, target)
print(loss)

在这里插入图片描述
  最后的结果为1,计算步骤为:
  先计算绝对差总和:|0-1|+|1-1|+|2-1|+|3-1|=4;
  然后再平均:4/4=1。


5.2 nn.SmoothL1Loss

  SmoothL1Loss 也叫作 Huber Loss,误差在 (-1,1) 上是平方损失,其他情况是 L1 损失
在这里插入图片描述

criterion = nn.SmoothL1Loss()
loss = criterion(sample, target)
print(loss)

在这里插入图片描述
  最后结果是:0.625。


5.3 nn.MSELoss

  平方损失函数。其计算公式是预测值和真实值之间的平方和的平均数
在这里插入图片描述

criterion = nn.MSELoss()
loss = criterion(sample, target)
print(loss)

在这里插入图片描述
  最后结果是:1.5。


5.4 nn.BCELoss

  二分类用的交叉熵,其计算公式较复杂,这里主要是有个概念即可,一般情况下不会用到。
在这里插入图片描述

criterion = nn.BCELoss()
loss = criterion(sample, target)
print(loss)

  最后结果是:-50。
在这里插入图片描述


5.5 nn.CrossEntropyLoss

  交叉熵损失函数
在这里插入图片描述
  该公式用的也较多,比如在图像分类神经网络模型中就常常用到该公式

criterion = nn.CrossEntropyLoss()
loss = criterion(sample, target)
print(loss)

在这里插入图片描述
  最后结果是:2.0794。
  看文档我们知道 nn.CrossEntropyLoss 损失函数是用于图像识别验证的对输入参数有各式要求,这里有这个概念就可以了,在后续的图像识别方向中会有正确的使用方法。


5.6 nn.NLLLoss

  负对数似然损失函数(Negative Log Likelihood)
在这里插入图片描述
  在前面接上一个 LogSoftMax 层就等价于交叉熵损失了。注意这里的xlabel 和上个交叉熵损失里的不一样,这里是经过 log 运算后的数值。
  这个损失函数一般也是用在图像识别模型上。

criterion = F.nll_loss()
loss = criterion(sample, target)
print(loss)
loss=F.nll_loss(sample,target)

  最后结果为报错,看来不能直接调用。
  Nn.NLLLoss 和 nn.CrossEntropyLoss 的功能是非常相似的。通常都是用在多分类模型中,实际应用中我们一般用 NLLLoss 比较多
在这里插入图片描述


5.7 nn.NLLLoss2d

  和上面类似,但是多了几个维度,一般用在图片上。

input, (N, C, H, W)
target, (N, H, W)

  比如用全卷积网络做分类时,最后图片的每个点都会预测一个类别标签
在这里插入图片描述
  最后结果报错,看来不能直接这么用。


六、优化器Optim

  优化器用通俗的话来说就是一种算法,是一种计算导数的算法
  各种优化器的目的和发明它们的初衷其实就是能让用户选择一种适合自己场景的优化器
  优化器的最主要的衡量指标就是优化曲线的平稳度最好的优化器就是每一轮样本数据的优化都让权重参数匀速的接近目标值,而不是忽上忽下跳跃的变化。因此损失值的平稳下降对于一个深度学习模型来说是一个非常重要的衡量指标
  pytorch 的优化器都放在 torch.optim 包中。常见的优化器有:SGD,Adam,Adadelta,Adagrad,Adamax 等。如果需要定制特殊的优化器,pytorch 也提供了定制化的手段,不过这里我们就不去深究了,毕竟预留的优化器的功能已经足够强大了。


 6.1 SGD

  SGD 指stochastic gradient descent,即随机梯度下降随机的意思是随机选取部分数据集参与计算,是梯度下降的 batch 版本。SGD 支持动量参数支持学习衰减率。SGD 优化器也是最常见的一种优化器,实现简单,容易理解

  6.1.1 用法

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)

  6.1.2 参数

  lr:大于 0 的浮点数,学习率。
  momentum:大于 0 的浮点数,动量参数。
  parameters:Variable 参数,要优化的对象。

  对于训练数据集,我们首先将其分成 n 个 batch每个 batch 包含 m 个样本。我们每次更新都利用一个 batch 的数据 ,而非整个训练集,即:

  xt+1=xt+Δxt
  Δxt=-ηgt

  其中,η 为学习率,gt 为 x 在 t 时刻的梯度

  6.1.3 好处

  这么做的好处在于:
  (1)当训练数据太多时,利用整个数据集更新往往时间上不现实。batch的方法可以减少机器的压力,并且可以更快地收敛
  (2)当训练集有很多冗余时(类似的样本出现多次),batch 方法收敛更快。以一个极端情况为例,若训练集前一半和后一半梯度相同,那么如果前一半作为一个 batch,后一半作为另一个 batch,那么在一次遍历训练集时,batch 的方法向最优解前进两个 step,而整体的方法只前进一个 step


6.2 RMSprop

  RMSProp 通过引入一个衰减系数,让 r 每回合都衰减一定比例类似于Momentum 中的做法,该优化器通常是面对递归神经网络时的一个良好选择。

  6.2.1 具体实现

  需要:全局学习速率 ϵ,初始参数 θ,数值稳定量 δ,衰减速率 ρ
  中间变量:梯度累计量 r(初始化为 0)

  6.2.2 每步迭代过程

  (1)从训练集中的随机抽取一批容量为 m 的样本 {x1,…,xm} 以及相关的输出 yi
  (2)计算梯度和误差更新 r再根据 r 和梯度计算参数更新量
在这里插入图片描述

  6.2.3 用法

keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)

  6.2.4 参数

  lr:大于 0 的浮点数,学习率。
  rho:大于 0 的浮点数。
  epsilon:大于 0 的小浮点数,防止除 0 错误。


6.3 Adagrad

  AdaGrad 可以自动变更学习速率,只是需要设定一个全局的学习速率 ϵ,但是这并非是实际学习速率,实际的速率是与以往参数的模之和的开方成反比的。也许说起来有点绕口,不过用公式来表示就直白的多:
在这里插入图片描述
  其中 δ 是一个很小的常量,大概在 10-7,防止出现除以 0 的情况.。

  6.3.1 具体实现

  需要:全局学习速率 ϵ,初始参数 θ,数值稳定量 δ
  中间变量:梯度累计量 r(初始化为 0)

  6.3.2 每步迭代过程

  (1) 从训练集中的随机抽取一批容量为 m 的样本 {x1,…,xm} 以及相关。
  (2)计算梯度和误差,更新r,再根据 r 和梯度计算参数更新量
在这里插入图片描述

  6.3.3 优点

  能够实现学习率的自动更改。如果这次梯度大,那么学习速率衰减的就快一些;如果这次梯度小,那么学习速率衰减的就慢一些。

  6.3.4 缺点

  仍然要设置一个变量 ϵ 。
  经验表明,在普通算法中也许效果不错,但在深度学习中,深度过深时会造成训练提前结束

  6.3.5 用法

keras.optimizers.Adagrad(lr=0.01, epsilon=1e-06)

  6.3.6 参数

  lr:大于 0 的浮点数,学习率。
  epsilon:大于 0 的小浮点数,防止除 0 错误。


6.4 Adadelta

  Adagrad 算法存在三个问题:
  (1)其学习率是单调递减的,训练后期学习率非常小。
  (2)其需要手工设置一个全局的初始学习率。
  (3)更新 xt 时,左右两边的单位不统一。

  Adadelta 针对上述三个问题提出了比较漂亮的解决方案。
  首先,针对第一个问题,我们可以只使用 adagrad 的分母中的累计项离当前时间点比较近的项,如下式:
在这里插入图片描述
  这里ρ 是衰减系数 ,通过这个衰减系数,我们令每一个时刻的 gt 随时间按照 ρ 指数衰减这样就相当于我们仅使用离当前时刻比较近的gt信息,从而使得还很长时间之后,参数仍然可以得到更新。
  针对第三个问题,其实 sgd 跟 momentum 系列的方法也有单位不统一的问题。sgd、momentum 系列方法中:
在这里插入图片描述
  类似的,adagrad 中,用于更新 Δx 的单位也不是 x 的单位,而是 1
  而对于牛顿迭代法
在这里插入图片描述
  其中 H 为 Hessian 矩阵,由于其计算量巨大,因而实际中不常使用。其单位为:
在这里插入图片描述
  注意,这里f 无单位 。因而,牛顿迭代法的单位是正确的
  所以,我们可以模拟牛顿迭代法来得到正确的单位。注意到:
在这里插入图片描述
  这里,在解决学习率单调递减的问题的方案中,分母已经是 ∂f/∂x 的一个近似了。这里我们可以构造 Δx 的近似,来模拟得到 H-1 的近似从而得到近似的牛顿迭代法。具体做法如下:
在这里插入图片描述
  可以看到,如此一来adagrad 中分子部分需要人工设置的初始学习率也消失了 ,从而顺带解决了上述的第二个问题。

  6.4.1 用法

keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=1e-06)

建议保持优化器的默认参数不变。

  6.4.2 参数

  lr:大于 0 的浮点数,学习率。
  rho:大于 0 的浮点数。
  epsilon:大于 0 的小浮点数,防止除 0 错误。


6.5 Adam

  Adam 是一种基于一阶梯度来优化随机目标函数的算法
  Adam 这个名字来源于 adaptive moment estimation,自适应矩估计。概率论中矩的含义是:如果一个随机变量 X 服从某个分布,X 的一阶矩是E(X),也就是样本平均值,X 的二阶矩就是 E(X^2),也就是样本平方的平均值
  Adam 算法根据损失函数对每个参数的梯度的一阶矩估计和二阶矩估计动态调整针对于每个参数的学习速率。Adam 也是基于梯度下降的方法,但是每次迭代参数的学习步长都有一个确定的范围,不会因为很大的梯度导致很大的学习步长,参数的值比较稳定。
  Adam(Adaptive Moment Estimation)本质上是带有动量项的 RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam 的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳

6.5.1 具体实现

  需要:步进值 ϵ,初始参数 θ,数值稳定量 δ,一阶动量衰减系数 ρ1,二阶动量衰减系数 ρ2 。
  其中几个取值一般为:δ=10-8,ρ1=0.9,ρ2=0.999 。
  中间变量:一阶动量 s,二阶动量 r,都初始化为 0 。

6.5.2 每步迭代过程

  (1)从训练集中的随机抽取一批容量为 m 的样本 {x1,…,xm} 以及相关的输出 yi
  (2)计算梯度和误差,更新 r 和 s,再根据 r 和 s 以及梯度计算参数更新量
在这里插入图片描述

  6.5.3 用法

keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)

  6.5.4 参数

  lr:大于 0 的浮点数,学习率。
  beta_1/beta_2:浮点数, 0<beta<1,通常很接近 1。
  epsilon:大于 0 的小浮点数,防止除0错误。


6.6 Adamax

keras.optimizers.Adamax(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08)

  Adamax 优化器的方法是基于无穷范数的 Adam 方法的变体。

  6.6.1 参数

  lr:大于 0 的浮点数,学习率。
  beta_1/beta_2:浮点数, 0<beta<1,通常很接近 1。
  epsilon:大于 0 的小浮点数,防止除 0 错误。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM Coresight 系列文章 8 - ARM Coresight 通过 APBIC 级联使用

文章目录 APBIC 回顾APBIC 级联 上篇文章&#xff1a;ARM Coresight 系列文章 7 - ARM Coresight 通过 AHB-AP 访问 异构 cpu 内部 coresight 组件 APBIC 回顾 APBIC 可以连接一个或者多个APB BUS masters&#xff0c; 例如连接一个 APB-AP 组件和带有 APB 接口的 Processor&…

Java源码规则引擎:jvs-rules数据扩展及函数配置说明

jvs-rules数据拓展节点 数据拓展是数据可视化加工过程中的重要工具&#xff0c;它核心的作用是对原有数据表进行加工扩展&#xff0c;实现功能如下图所示 函数配置操作过程 操作说明 1、拖动数据拓展字段&#xff0c;并将字段拓展与之前的历史节点连接起来&#xff0c;点击数…

浅谈linux前台进程与后台进程同步异步执行的理解

最近书上看到前台进程以及后台进程的定义&#xff0c;有点令人费解。 linux终端输入一条命令&#xff0c;创建一个子进程运行这条命令&#xff0c;在这条命令进程执行完之前&#xff0c;终端shell都无法接收新的一条命令&#xff1b;只有这条命令运行结束后&#xff0c;当前终…

Vue项目实现在线预览pdf,并且可以批量打印pdf

最近遇到一个需求,就是要在页面上呈现pdf内容,并且还能用打印机批量打印pdf,最终效果如下: 当用户在列表页面,勾选中两条数据后,点击“打印表单”按钮之后,会跳到如下的预览页面: 预览页面顶部有个吸顶的效果,然后下方就展示出了2个pdf文件对应的内容,我们接着点击“…

Vsiual Stdio 生成动态链接库 / 命令行CMD工具打不开 / 64和32位动态链接库生成 dll

打开vistual studio&#xff0c;选择目标文件夹。 菜单栏选择工具->命令行->开发者命令提示 通过 这种方法打开的编译器版本是 32位&#xff08;x86&#xff09;的 64位的编译器通过以下方法打开 修改文件路径 1)Cd 路径 2) 盘符&#xff1a; 输入命令行代码 cl /c Se…

SpringBoot整合SpringSecurity+JWT

SpringBoot整合SpringSecurityJWT 整合SpringSecurity步骤 编写拦截链配置类&#xff0c;规定security参数拦截登录请求的参数&#xff0c;对该用户做身份认证。通过登录验证的予以授权&#xff0c;这里根据用户对应的角色作为授权标识。 整合JWT步骤 编写JWTUtils&#xf…

精智达在科创板上市:募资约11亿元,深创投等为其股东

7月18日&#xff0c;深圳精智达技术股份有限公司&#xff08;下称“精智达”&#xff0c;SH:688627&#xff09;在上海证券交易所科创板上市。本次上市&#xff0c;精智达的发行价为46.77元/股&#xff0c;发行数量为2350.2939万股&#xff0c;募资总额为10.99亿元&#xff0c;…

封装cpp-httplib成dll包,为老项目提供http网络支持

项目介绍&#xff1a; 公司内某些老的项目不支持https或者http1.1的一些新功能&#xff0c;需要开发对应的SDK供其调用&#xff0c;以便维护老项目。 第一步&#xff1a;下载cpp-httplib 点击这里去下载最新的代码&#xff1a;mirrors / yhirose / cpp-httplib GitCode 直接下…

QT:问题、解决与原因

在这里记录一些自己遇到的在QT开发上面的小问题和tips 目录 QComboBox 设置qss样式不生效qt按钮设置点击释放效果实现效果 QComboBox 设置qss样式不生效 我设置的样式是&#xff1a; box->setStyleSheet("QComboBox {""border: none;""padding:…

适用于 Type-C接口PD应用的智能二极管保护开关

日前&#xff0c;集设计、研发、生产和全球销售一体的著名功率半导体、芯片及数字电源产品供应商Alpha and Omega Semiconductor Limited&#xff08;AOS, 纳斯达克代码:AOSL) 推出一款采用理想二极管运作进行反向电流保护的新型Type-C PD 高压电源输入保护开关。AOZ13984DI-02…

上市公司前端开发规范参考

上市公司前端开发规范参考 命名规则通用约定文件与目录命名HTML命名CSS命名JS命名 代码格式通用约定HTML格式CSS格式JS格式注释 组件组件大小单文件组件容器组件组件使用说明Prop指令缩写组件通讯组件的挂载和销毁按需加载第三方组件库的规定 脚手架使用规范移动端脚手架PC端脚…

Linux下安装Elasticsearch以及ES-head插件

Linux下安装ElasticSearch以及ES-head插件 安装Elasticsearch 由于Elasticsearch客户端版本和ElasticSearch版本有对应关系&#xff0c;所以建议安装之前先考虑安装哪个版本的ElasticSearch。 ElasticSearch、Spring Data Elasticsearch、SpringBoot、Spring版本对应关系 安…

OpenCV for Python 学习第五天:图片属性的获取

上一篇博文当中&#xff0c;我们学习了如何获取图片的通道&#xff0c;我们了解了通道的分离方法split()和通道的组合方法merge()。那么我们今天就来对图片的属性做一个深入的了解。 文章目录 图片属性OpenCV中属性介绍图片属性的获取 图片属性 图片属性是指描述和定义一张图片…

爬虫与反爬虫的攻防对抗

一、爬虫的简介 1 概念 爬虫最早源于搜索引擎&#xff0c;它是一种按照一定的规则&#xff0c;自动从互联网上抓取信息的程序&#xff0c;又被称为爬虫&#xff0c;网络机器人等。按爬虫功能可以分为网络爬虫和接口爬虫&#xff0c;按授权情况可以分为合法爬虫和恶意爬虫。恶…

【NLP】从预训练模型中获取Embedding

从预训练模型中获取Embedding 背景说明下载IMDB数据集进行分词下载并预处理GloVe词嵌入数据构建模型训练模型并可视化结果结果对比其他代码 在NLP领域中&#xff0c;构建大规模的标注数据集非常困难&#xff0c;以至于仅用当前语料无法有效完成特定任务。可以采用迁移学习的方法…

hbuilder创建基于vue2的uniapp小程序项目

参考vant官网&#xff1a;https://vant-contrib.gitee.io/vant/v3/#/zh-CN/quickstart#an-zhuang官网 参考别人博客&#xff1a;https://www.yii666.com/blog/465379.html 1.创建项目 1.1 hbuilder进去右上角点击文件–新建–项目 1.2 vue2项目如下图 2.安装依赖 2.1 2.2…

Linux搭建SVN环境(最新版)

最新版本号(svn-1.14) https://opensource.wandisco.com/centos/7 更新版本库 sudo tee /etc/yum.repos.d/wandisco-svn.repo <<-EOF [WandiscoSVN] nameWandisco SVN Repo baseurlhttp://opensource.wandisco.com/centos/$releasever/svn-1.14/RPMS/$basearch/ enabled…

TypeScript 学习笔记(七):条件类型

条件类型 TS中的条件类型就是在类型中添加条件分支&#xff0c;以支持更加灵活的泛型&#xff0c;满足更多的使用场景。内置条件类型是TS内部封装好的一些类型处理&#xff0c;使用起来更加便利。 一、基本用法 当T类型可以赋值给U类型时&#xff0c;则返回X类型&#xff0c…

一探究竟:人工智能、机器学习、深度学习

一、人工智能 1.1 人工智能是什么&#xff1f; 1956年在美国Dartmounth 大学举办的一场研讨会中提出了人工智能这一概念。人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;简称AI&#xff0c;是计算机科学的一个分支&#xff0c;它企图了解智能的实质&am…

拦截器是什么

拦截器 package com.qf.config;import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class MyIntercep…