当前位置: 首页 > news >正文

Pytorch模型量化

在深度学习中,量化指的是使用更少的bit来存储原本以浮点数存储的tensor,以及使用更少的bit来完成原本以浮点数完成的计算。这么做的好处主要有如下几点:

  • 更少的模型体积,接近4倍的减少;
  • 可以更快的计算,由于更少的内存访问和更快的int8计算,可以快2~4倍。

一个量化后的模型,其部分或者全部的tensor操作会使用int类型来计算,而不是使用量化之前的float类型。当然,量化还需要底层硬件支持,x86 CPU(支持AVX2)、ARM CPU、Google TPU、Nvidia Volta/Turing/Ampere、Qualcomm DSP这些主流硬件都对量化提供了支持。

PyTorch对量化的支持目前有如下三种方式:

  • Post Training Dynamic Quantization:模型训练完毕后的动态量化;
  • Post Training Static Quantization:模型训练完毕后的静态量化;
  • QAT (Quantization Aware Training):模型训练中开启量化。

在开始这三部分之前,先介绍下最基础的Tensor的量化。

Tensor的量化

量化:$$公式1:xq=round(\frac{x}{scale}+zero\_point)$$

反量化:$$公式2:x = (xq-zero\_point)*scale$$

式中,scale是缩放因子,zero_point是零基准,也就是fp32中的零在量化tensor中的值

  为了实现量化,PyTorch 引入了能够表示量化数据的Quantized Tensor,可以存储 int8/uint8/int32类型的数据,并携带有scale、zero_point这些参数。把一个标准的float Tensor转换为量化Tensor的步骤如下:

import torch

x = torch.randn(2, 2, dtype=torch.float32)
# tensor([[ 0.9872, -1.6833],
#         [-0.9345,  0.6531]])

# 公式1(量化):xq = round(x / scale + zero_point)
# 使用给定的scale和 zero_point 来把一个float tensor转化为 quantized tensor
xq = torch.quantize_per_tensor(x, scale=0.5, zero_point=8, dtype=torch.quint8)
# tensor([[ 1.0000, -1.5000],
#         [-1.0000,  0.5000]], size=(2, 2), dtype=torch.quint8,
#        quantization_scheme=torch.per_tensor_affine, scale=0.5, zero_point=8)

print(xq.int_repr())  # 给定一个量化的张量,返回一个以 uint8_t 作为数据类型的张量
# tensor([[10,  5],
#         [ 6,  9]], dtype=torch.uint8)

# 公式2(反量化):xdq = (xq - zero_point) * scale
# 使用给定的scale和 zero_point 来把一个 quantized tensor 转化为 float tensor
xdq = xq.dequantize()
# tensor([[ 1.0000, -1.5000],
#         [-1.0000,  0.5000]])

xdq和x的值已经出现了偏差的事实告诉了我们两个道理:

  • 量化会有精度损失
  • 我们随便选取的scale和zp太烂,选择合适的scale和zp可以有效降低精度损失。不信你把scale和zp分别换成scale = 0.0036, zero_point = 0试试

而在PyTorch中,选择合适的scale和zp的工作就由各种observer来完成。

Tensor的量化支持两种模式:per tensor 和 per channel。

  • Per tensor:是说一个tensor里的所有value按照同一种方式去scale和offset;
  • Per channel:是对于tensor的某一个维度(通常是channel的维度)上的值按照一种方式去scale和offset,也就是一个tensor里有多种不同的scale和offset的方式(组成一个vector),如此以来,在量化的时候相比per tensor的方式会引入更少的错误。PyTorch目前支持conv2d()、conv3d()、linear()的per channel量化。

在我们正式了解pytorch模型量化前我们再来检查一下pytorch的官方量化是否能满足我们的需求,如果不能,后面的都不需要看了

 静态量化动态量化
nn.linearYY
nn.Conv1d/2d/3dYN (因为pytorch认为卷积参数来了个太小了,对卷积核进行量化会造成更多损失,所以pytorch选择不量化)
nn.LSTMN(LSTM的好像又可以了,官方给出了一个例子,传送门)Y
nn.GRUNY
nn.RNNCellNY
nn.GRUCellNY
nn.LSTMCellNY
nn.EmbeddingBagY(激活在fp32)Y
nn.EmbeddingYN
nn.MultiheadAttentionNN
Activations大部分支持不变,计算停留在fp32中

第二点:pytorch模型的动态量化只量化权重,不量化偏置

Post Training Dynamic Quantization (训练后动态量化)

  意思就是对训练后的模型权重执行动态量化,将浮点模型转换为动态量化模型,仅对模型权重进行量化,偏置不会量化。默认情况下,仅对 Linear 和 RNN 变体量化 (因为这些layer的参数量很大,收益更高)。

torch.quantization.quantize_dynamic(model, qconfig_spec=None, dtype=torch.qint8, mapping=None, inplace=False)

参数:

  • model:浮点模型
  • qconfig_spec
    • 下面的任意一种
      • 集合:比如: qconfig_spec={nn.LSTM, nn.Linear} 。罗列 要量化的NN 
      • 字典: qconfig_spec = {nn.Linear : default_dynamic_qconfig, nn.LSTM : default_dynamic_qconfig} 
  • dtype: float16 或 qint8
  • mapping:就地执行模型转换,原始模块发生变异
  • inplace:将子模块的类型映射到需要替换子模块的相应动态量化版本的类型

返回:动态量化后的模型

我们来吃一个栗子:

# -*- coding:utf-8 -*-
# Author:凌逆战 | Never
# Date: 2022/10/17
"""
只量化权重,不量化激活
"""
import torch
from torch import nn

class DemoModel(torch.nn.Module):
    def __init__(self):
        super(DemoModel, self).__init__()
        self.conv = nn.Conv2d(in_channels=1,out_channels=1,kernel_size=1)
        self.relu = nn.ReLU()
        self.fc = torch.nn.Linear(2, 2)

    def forward(self, x):
        x = self.conv(x)
        x = self.relu(x)
        x = self.fc(x)
        return x


if __name__ == "__main__":
    model_fp32 = DemoModel()
    # 创建一个量化的模型实例
    model_int8 = torch.quantization.quantize_dynamic(
        model=model_fp32,  # 原始模型
        qconfig_spec={torch.nn.Linear},  # 要动态量化的NN算子
        dtype=torch.qint8)  # 将权重量化为:float16 \ qint8

    print(model_fp32)
    print(model_int8)

    # 运行模型
    input_fp32 = torch.randn(1,1,2, 2)
    output_fp32 = model_fp32(input_fp32)
    print(output_fp32)

    output_int8 = model_int8(input_fp32)
    print(output_int8)

输出

DemoModel(
  (conv): Conv2d(1, 1, kernel_size=(1, 1), stride=(1, 1))
  (relu): ReLU()
  (fc): Linear(in_features=2, out_features=2, bias=True)
)
DemoModel(
  (conv): Conv2d(1, 1, kernel_size=(1, 1), stride=(1, 1))
  (relu): ReLU()
  (fc): DynamicQuantizedLinear(in_features=2, out_features=2, dtype=torch.qint8, qscheme=torch.per_tensor_affine)
)
tensor([[[[-0.5361,  0.0741],
          [-0.2033,  0.4149]]]], grad_fn=<AddBackward0>)
tensor([[[[-0.5371,  0.0713],
          [-0.2040,  0.4126]]]])
View Code

Post Training Static Quantization (训练后静态量化)

  静态量化需要把模型的权重和激活都进行量化,静态量化需要把训练集或者和训练集分布类似的数据喂给模型(注意没有反向传播),然后通过每个op输入的分布 来计算activation的量化参数(scale和zp)——称之为Calibrate(定标),因为静态量化的前向推理过程自始至终都是int计算,activation需要确保一个op的输入符合下一个op的输入。

PyTorch会使用以下5步来完成模型的静态量化:

1、fuse_model

合并一些可以合并的layer。这一步的目的是为了提高速度和准确度:

fuse_modules(model, modules_to_fuse, inplace=False, fuser_func=fuse_known_modules, fuse_custom_config_dict=None)

比如给fuse_modules传递下面的参数就会合并网络中的conv1、bn1、relu1:

torch.quantization.fuse_modules(F32Model, [['fc', 'relu']], inplace=True)

一旦合并成功,那么原始网络中的fc就会被替换为新的合并后的module(因为其是list中的第一个元素),而relu(list中剩余的元素)会被替换为nn.Identity(),这个模块是个占位符,直接输出输入。举个例子,对于下面的一个小网络:

import torch
from torch import nn

class F32Model(nn.Module):
    def __init__(self):
        super(F32Model, self).__init__()
        self.fc = nn.Linear(3, 2,bias=False)
        self.relu = nn.ReLU(inplace=False)

    def forward(self, x):
        x = self.fc(x)
        x = self.relu(x)
        return x

model_fp32 = F32Model()
print(model_fp32)
# F32Model(
#   (fc): Linear(in_features=3, out_features=2, bias=False)
#   (relu): ReLU()
# )
model_fp32_fused = torch.quantization.fuse_modules(model_fp32, [['fc', 'relu']])
print(model_fp32_fused)
# F32Model(
#   (fc): LinearReLU(
#     (0): Linear(in_features=3, out_features=2, bias=False)
#     (1): ReLU()
#   )
#   (relu): Identity()
# )

modules_to_fuse参数的list可以包含多个item list,或者是submodule的op list也可以,比如:[ ['conv1', 'bn1', 'relu1'], ['submodule.conv', 'submodule.relu']]。有的人会说了,我要fuse的module被Sequential封装起来了,如何传参?参考下面的代码:

torch.quantization.fuse_modules(a_sequential_module, ['0', '1', '2'], inplace=True)

就目前来说,截止目前为止,只有如下的op和顺序才可以 (这个mapping关系就定义在DEFAULT_OP_LIST_TO_FUSER_METHOD中):

  • Convolution, BatchNorm
  • Convolution, BatchNorm, ReLU
  • Convolution, ReLU
  • Linear, ReLU
  • BatchNorm, ReLU
  • ConvTranspose, BatchNorm

2、设置qconfig

qconfig要设置到模型或者Module上。

#如果要部署在x86 server上
model_fp32.qconfig = torch.quantization.get_default_qconfig('fbgemm')

#如果要部署在ARM上
model_fp32.qconfig = torch.quantization.get_default_qconfig('qnnpack')

x86和arm之外目前不支持。

3、prepare

prepare用来给每个子module插入Observer,用来收集和定标数据。

以activation的observer为例,观察输入数据得到 四元组中的 min_val 和 max_val,至少观察个几百个迭代的数据吧,然后由这四元组得到 scale 和 zp 这两个参数的值。

model_fp32_prepared= torch.quantization.prepare(model_fp32_fused)

4、喂数据

这一步不是训练。是为了获取数据的分布特点,来更好的计算activation的 scale 和 zp 。至少要喂上几百个迭代的数据。

#至少观察个几百迭代
for data in data_loader:
    model_fp32_prepared(data)

5、转换模型

第四步完成后,各个op权重的四元组 (min_val,max_val,qmin, qmax) 中的 min_val , max_val 已经有了,各个op activation的四元组 (min_val,max_val,qmin, qmax) 中的 min_val , max_val 也已经观察出来了。那么在这一步我们将调用convert API:

model_prepared_int8 = torch.quantization.convert(model_fp32_prepared)

我们来吃一个完整的例子:

# -*- coding:utf-8 -*-
# Author:凌逆战 | Never
# Date: 2022/10/17
"""
权重和激活都会被量化
"""

import torch
from torch import nn


# 定义一个浮点模型,其中一些层可以被静态量化
class F32Model(torch.nn.Module):
    def __init__(self):
        super(F32Model, self).__init__()
        self.quant = torch.quantization.QuantStub()  # QuantStub: 转换张量从浮点到量化
        self.conv = nn.Conv2d(1, 1, 1)
        self.fc = nn.Linear(2, 2, bias=False)
        self.relu = nn.ReLU()
        self.dequant = torch.quantization.DeQuantStub()  # DeQuantStub: 将量化张量转换为浮点

    def forward(self, x):
        x = self.quant(x)  # 手动指定张量: 从浮点转换为量化
        x = self.conv(x)
        x = self.fc(x)
        x = self.relu(x)
        x = self.dequant(x)  # 手动指定张量: 从量化转换到浮点
        return x


model_fp32 = F32Model()
model_fp32.eval()  # 模型必须设置为eval模式,静态量化逻辑才能工作

# 1、如果要部署在ARM上;果要部署在x86 server上 ‘fbgemm’
model_fp32.qconfig = torch.quantization.get_default_qconfig('qnnpack')

# 2、在适用的情况下,将一些层进行融合,可以加速
# 常见的融合包括在:DEFAULT_OP_LIST_TO_FUSER_METHOD
model_fp32_fused = torch.quantization.fuse_modules(model_fp32, [['fc', 'relu']])

# 3、准备模型,插入observers,观察 activation 和 weight
model_fp32_prepared = torch.quantization.prepare(model_fp32_fused)

# 4、代表性数据集,获取数据的分布特点,来更好的计算activation的 scale 和 zp
input_fp32 = torch.randn(1, 1, 2, 2)  # (batch_size, channel, W, H)
model_fp32_prepared(input_fp32)

# 5、量化模型
model_int8 = torch.quantization.convert(model_fp32_prepared)

# 运行模型,相关计算将在int8中进行
output_fp32 = model_fp32(input_fp32)
output_int8 = model_int8(input_fp32)
print(output_fp32)
# tensor([[[[0.6315, 0.0000],
#           [0.2466, 0.0000]]]], grad_fn=<ReluBackward0>)
print(output_int8)
# tensor([[[[0.3886, 0.0000],
#           [0.2475, 0.0000]]]])

Quantization Aware Training (边训练边量化)

这一部分我用不着,等我需要使用的时候再来补充

保存和加载量化模型

我们先把模型量化

import torch
from torch import nn

class M(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(5, 5,bias=True)
        self.gru = nn.GRU(input_size=5,hidden_size=5,bias=True,)
        self.relu = nn.ReLU()

    def forward(self, x):
        x = self.linear(x)
        x = self.gru(x)
        x = self.relu(x)
        return x

m = M().eval()
model_int8 = torch.quantization.quantize_dynamic(
    model=m,  # 原始模型
    qconfig_spec={nn.Linear,
                  nn.GRU},  # 要动态量化的NN算子
    dtype=torch.qint8, inplace=True)  # 将权重量化为:float16 \ qint8+

保存/加载量化模型 state_dict

torch.save(model_int8.state_dict(), "./state_dict.pth")
model_int8.load_state_dict(torch.load("./state_dict.pth"))
print(model_int8)

保存/加载脚本化量化模型 torch.jit.save 和 torch.jit.load 

traced_model = torch.jit.trace(model_int8, torch.rand(5, 5))
torch.jit.save(traced_model, "./traced_quant.pt")
quantized_model = torch.jit.load("./traced_quant.pt")
print(quantized_model)

获取量化模型的参数

其实pytorch获取量化后的模型参数是比较困难的,我们还是以上面的量化模型为例来取参数的值

print(model_int8)
# M(
#   (linear): DynamicQuantizedLinear(in_features=5, out_features=5, dtype=torch.qint8, qscheme=torch.per_tensor_affine)
#   (gru): DynamicQuantizedGRU(5, 5)
#   (relu): ReLU()
# )
print(model_int8.linear)
print(model_int8.gru)
print(model_int8.relu)

我们来尝试一下获取线性层的权重和偏置

# print(dir(model_int8.linear))  # 获得对象的所有属性和方法
print(model_int8.linear.weight().int_repr())
# tensor([[ 104,  127,   70,  -94,  121],
#         [  98,   53,  124,   74,   38],
#         [-103, -112,   38,  117,   64],
#         [ -46,  -36,  115,   82,  -75],
#         [ -14,  -94,   42,  -25,   41]], dtype=torch.int8)
print(model_int8.linear.bias())
# tensor([ 0.2437,  0.2956,  0.4010, -0.2818,  0.0950], requires_grad=True)

O My God,偏置居然还是浮点类型的,只有权重被量化为了整型

好的,我们再来获取GRU的权重和偏置

print(dir(model_int8.gru))
print(model_int8.gru.get_weight()["weight_ih_l0"].int_repr())   # int8
print(model_int8.gru.get_weight()["weight_hh_l0"].int_repr())   #int8
print(model_int8.gru.get_bias()["bias_ih_l0"])  # float
print(model_int8.gru.get_bias()["bias_hh_l0"])  # float

第一,别问我别问我为什么取值这么麻烦,你以为我想???

第二,静态量化不支持GRU就算了,动态量化偏置还不给我量化了,哎,pytorch的量化真的是还有很长的路要走呀!

参考

【pytorch官方】Quantization(需要非常细心且耐心的去读)

【pytorch官方】Quantization API

【知乎】PyTorch的量化

相关文章:

已解决Encountered error while trying to install package.> lxml

已解决&#xff08;pip安装第三方模块lxml模块报错&#xff09;Building wheels for collected packages: lxml Building wheel for lxml (setup.py) … error error: subprocess-exited-with-error python setup.py bdist_wheel did not run successfully. note: This error o…...

距离度量 —— 闵可夫斯基距离(Minkowski Distance)

Python学习系列文章&#xff1a;&#x1f449; 目录 &#x1f448; 文章目录一、概述二、计算公式1. 闵氏距离公式2. 闵氏距离的参数 p3. 闵氏距离的缺点一、概述 闵可夫斯基距离 (Minkowski Distance)&#xff0c;也被称为 闵氏距离。它不仅仅是一种距离&#xff0c;而是将多…...

python(模块)xlwt

目录一、xlwt简介二、xlwt语法1、模块安装2、模块导入3、向xls文件中写入内容4、设置写入文件的格式4.1 字体设置&#xff08;font&#xff09;4.2 背景颜色设置&#xff08;pattern&#xff09;4.3 边框设置&#xff08;borders&#xff09;4.4 对齐方式设置&#xff08;align…...

Pytorch中torch.unsqueeze()和torch.squeeze()函数解析

一. torch.squeeze()函数解析 1. 官网链接 torch.squeeze()&#xff0c;如下图所示&#xff1a; 2. torch.squeeze()函数解析 torch.squeeze(input, dimNone, outNone) squeeze()函数的功能是维度压缩。返回一个tensor&#xff08;张量&#xff09;&#xff0c;其中 input…...

python绘制相关系数热力图

python绘制相关系数热力图一.数据说明和需要安装的库二.准备绘图三.设置配色&#xff0c;画出多幅图全部代码&#xff1a;本文讲述如何利用python绘制如上的相关系数热力图一.数据说明和需要安装的库 数据是31个省市有关教育的12个指标&#xff0c;如下所示。&#xff0c;在文…...

DeepSpeed使用指南(简略版)

现在的模型越来越大&#xff0c;动辄几B甚至几百B。但是显卡显存大小根本无法支撑训练推理。例如&#xff0c;一块RTX2090的10G显存&#xff0c;光把模型加载上去&#xff0c;就会OOM&#xff0c;更别提后面的训练优化。 作为传统pytorch Dataparallel的一种替代&#xff0c;D…...

【Python】tqdm 介绍与使用

文章目录一、tqdm 简介二、tqdm 使用1. 基于迭代对象运行: tqdm(iterator)2. tqdm(list)3. trange(i)4. 手动更新参考链接一、tqdm 简介 tqdm 是一个快速&#xff0c;可扩展的 Python 进度条&#xff0c;可以在 Python 长循环中添加一个进度提示信息&#xff0c;用户只需要封装…...

Pytorch机器学习(十)—— 目标检测中k-means聚类方法生成锚框anchor

Pytorch机器学习&#xff08;十&#xff09;—— YOLO中k-means聚类方法生成锚框anchor 目录 Pytorch机器学习&#xff08;十&#xff09;—— YOLO中k-means聚类方法生成锚框anchor 前言 一、K-means聚类 k-means代码 k-means算法 二、YOLO中使用k-means聚类生成anchor 读取VO…...

Python的占位格式符

对于print函数里的语句 print("我的名字是%s, 年龄是%d"%(name, age)) 中的%s和%d叫做占位符&#xff0c;它们的完整形态是 %[(name)][flags][width][.precision]typecode 其中带有[]的前缀都是可以省略的。 [(name)]: (name)表示, 根据, 制定的名称(…...

关于sklearn库的安装

对于安装sklearn真的是什么问题都被我遇到了 例如pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out.遇到了 这种也遇到了Requirement already satisfied: numpy in c:\users\yjq\appdata\roamin…...

accuracy_score函数

1.acc计算原理 sklearn中accuracy_score函数计算了准确率。 在二分类或者多分类中&#xff0c;预测得到的label&#xff0c;跟真实label比较&#xff0c;计算准确率。 在multilabel&#xff08;多标签问题&#xff09;分类中&#xff0c;该函数会返回子集的准确率。如果对于一…...

怎么成为稚晖君?

如何成为IT大佬稚晖君——电子系统设计应具备的基本技能和方法论 快速提高电子技术的必经之路_一些老生常谈的道理 嵌入式AI入坑经历 稚晖君软件硬件开发环境总结 首先&#xff0c;机器学习深度学习这些和硬件是两个领域的内容&#xff0c;个人不建议一起学&#xff0c;注意力…...

Pandas库

Pandas是python第三方库&#xff0c;提供高性能易用数据类型和分析工具。Pandas基于NumPy实现&#xff0c;常与NumPy和Matplotlib一同使用。pandas库引用&#xff1a; import pandas as pd 包括两个数据类型&#xff1a;Series&#xff08;相当于一维数据类型&#xff09;&…...

通过两道一年级数学题反思自己

背景 做完这两道题我开始反思自己&#xff0c;到底是什么限制了我&#xff1f;是我自己&#xff1f;是曾经教导我的老师&#xff1f;还是我的父母&#xff1f; 是考试吗&#xff1f;还是什么&#xff1f; 提目 1、正方体个数问题 2、相碰可能性 过程 静态思维&#xff1a; …...

深度学习—卷积神经网络(CNN)全笔记,附代码

本文内容为哔站学习笔记【卷积神经网络-CNN】深度学习&#xff08;唐宇迪带你学AI&#xff09;&#xff1a;卷积神经网络理论详解与项目实战&#xff0c;计算机视觉&#xff0c;图像识别模块实战_哔哩哔哩_bilibili 目录 深度学习基础 什么是深度学习&#xff1f; 机器学习流…...

Building wheel for mmcv-full (setup.py) ... error解决办法!

mmdetection 安装后&#xff0c;根据官方给的程序安装mmcv时&#xff0c;出现&#xff1a;Building wheel for mmcv-full (setup.py) … error 环境&#xff1a;CUDA11.3, Pytorch1.11 安装根据官网给的安装程序&#xff1a;pip install mmcv-full -f https://download.openmm…...

联邦学习开山之作代码解读与收获

参考&#xff1a;联邦学习代码解读&#xff0c;超详细_一只揪的博客-CSDN博客_联邦学习代码 参考文献&#xff1a;[1602.05629] Communication-Efficient Learning of Deep Networks from Decentralized Data (arxiv.org) 参考代码&#xff1a;GitHub - AshwinRJ/Federated-L…...

Python安装第三方库常用方法 超详细~

Python安装第三方库常用方法前言安装方法1. 通过pychram安装2. pip安装大法3. 下载whl文件到本地离线安装3.1 补充4.其他方法4.1 Python官方的Pypi菜单4.2 国内镜像源解决pip安装过慢的问题小结前言 在pyhton的学习中&#xff0c;相信大家通常都会碰到第三方库的安装问题&…...

Python--找出字符串中出现次数最多的字符及其出现的次数

方法一&#xff1a; 1、循环遍历列表或字符串&#xff0c;如果字符在字典中则值加1&#xff0c;如果不在则创建&#xff08;key,value) 2、找到字典中&#xff0c;最大的value值 3、根据最大的value值&#xff0c;找对应的key值&#xff0c;打印出出现次数最多的字符 str &qu…...

滤波笔记一:卡尔曼滤波(Kalman Filtering)详解

本笔记是总结了B站DR_CAN的卡尔曼滤波器的课程&#xff0c;他的B站主页为&#xff1a;DR_CAN的个人空间_哔哩哔哩_bilibili PS:虽然我不是学自控的&#xff0c;但是老师真的讲的很好&#xff01; 目录 Lesson1 递归算法 Lesson2 数学基础_数据融合_协方差矩阵_状态空间方程…...

利用Python求斐波那契数列的第N项以及前N项和(循环、递归、集合)

著名的斐波那契数列&#xff0c;即从第三项开始&#xff0c;每一项都等于前两项之和。 之前写过利用Java语言来编写&#xff0c;由于最近正在学Python&#xff0c;所以将自己的想法记录在此&#xff0c;有需要的朋友可以参考一下。 写在前面&#xff1a;这里的三个方法其实思…...

一文速学(十八)-数据分析之Pandas处理文本数据(str/object)各类操作+代码一文详解(三)

目录 前言 一、子串提取 提取匹配首位子串 提取所有匹配项(extractall)...

Python数据分析-数据预处理

数据预处理 文章目录数据预处理1.前言2.数据探索2.1缺失值分析2.2 异常值分析2.2.1 简单统计量分析2.2.2 3$\sigma$原则2.2.3 箱线图分析2.3 一致性分析2.4 相关性分析3.数据预处理3.1 数据清洗3.1.1 缺失值处理3.1.2 异常值处理3.2 数据集成3.2.1 实体识别3.2.2 冗余属性识别3…...

【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战

&#x1f366;&#x1f366;写这篇AES文章也是有件趣事&#xff0c;有位小伙伴发了段密文&#xff0c;看看谁解密速度快&#xff0c;学过Python的小伙伴一下子就解开来了&#xff0c;内容也挺有趣的。 &#x1f35f;&#x1f35f;原来加解密也可以这么有趣&#xff0c;虽然看起…...

朴素贝叶斯模型及案例(Python)

目录 1 朴素贝叶斯的算法原理 2 一维特征变量下的贝叶斯模型 3 二维特征变量下的贝叶斯模型 4 n维特征变量下的贝叶斯模型 5 朴素贝叶斯模型的sklearn实现 6 案例&#xff1a;肿瘤预测模型 6.1 读取数据与划分 6.1.1 读取数据 6.1.2 划分特征变量和目标变量 6.2 模型…...

python之Tkinter详解

Python之Tkinter详解 文章目录Python之Tkinter详解1、Tkinter是什么2、Tkinter创建窗口①导入 tkinter的库 &#xff0c;创建并显示窗口②修改窗口属性③创建按钮④窗口内的组件布局3、Tkinter布局用法①基本界面、label(标签)和button(按钮)用法②entry(输入)和text(文本)用法…...

【python】python进行debug操作

文章目录前言一、debug环境介绍二、debug按钮介绍2.1、step into:单步执行&#xff08;遇到函数也是单步&#xff09;2.2、step over:单步执行&#xff08;遇到函数&#xff0c;全部运行&#xff09;2.3、step into my code:&#xff08;直接跳到下一个断点&#xff09;2.4、st…...

Python安装tensorflow过程中出现“No matching distribution found for tensorflow”的解决办法

在Pycharm中使用pip install tensorflow安装tensorflow时报错&#xff1a; ERROR: Could not find a version that satisfies the requirement tensorflow(from versions: none) ERROR: No matching distribution found for tensorflow搜了好多帖子有的说可能是网络的问题&…...

pandas中的read_csv参数详解

1.官网语法 pandas.read_csv(filepath_or_buffer, sepNoDefault.no_default**,** delimiterNone**,** headerinfer’, namesNoDefault.no_default**,** index_colNone**,** usecolsNone**,** squeezeFalse**,** prefixNoDefault.no_default**,** mangle_dupe_colsTrue**,** dty…...

Python — — turtle 常用代码

目录 一、设置画布 二、画笔 1、画笔属性 2、绘图命令 (1) 画笔运动命令 (2) 画笔控制命令 (3) 全局控制命令 (4) 其他命令 3. 命令详解 三、文字显示为一个圆圈 四、画朵小花 一、设置画布 turtle为我们展开用于绘图区域&#xff0c;我们可以设置它的…...

【我是土堆 - PyTorch教程】学习随手记(已更新 | 已完结 | 10w字超详细版)

目录 1. Pytorch环境的配置及安装 如何管理项目环境&#xff1f; 如何看自己电脑cuda版本&#xff1f; 安装Pytorch 2. Python编辑器的选择、安装及配置 PyCharm PyCharm神器 Jupyter&#xff08;可交互&#xff09; 3. Python学习中的两大法宝函数 说明 实战操…...

“OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.”解决方法总结

一、问题描述 跑了点神经网络的代码&#xff0c;想画几个激活函数的图像&#xff0c;代码如下&#xff1a; 运行后报了以下错误&#xff1a; 翻译如下&#xff1a; OMP&#xff1a;错误 #15&#xff1a;正在初始化 libiomp5md.dll&#xff0c;但发现 libiomp5md.dll 已经初…...

python3.11.2安装 + pycharm安装

下载 &#xff1a;https://www.python.org/ 2.双击下载的软件&#xff1a; 3.进入安装界面 下一步&#xff0c;点击 是 上一步点击后就看到如下&#xff1a; 安装成功了&#xff0c;接下来检测一下&#xff1a;cmd 安装pycharm PyCharm是一种Python IDE&#xff08;Integr…...

Python中numpy.polyfit的用法详解

numpy中polyfit的用法 参数 polyfit(x, y, deg, rcondNone, fullFalse, wNone, covFalse):x:M个采样点的横坐标数组&#xff1b; y:M个采样点的纵坐标数组&#xff1b;y可以是一个多维数组&#xff0c;这样即可拟合相同横坐标的多个多项式&#xff1b; deg&#xff1a;多项式…...

彻底解决Python包下载慢问题

python默认使用的是国外镜像&#xff0c;有时候下载非常慢&#xff0c;最快的办法就是在下载命令中增加国内源&#xff1a; 常用的国内源如下&#xff1a; 清华大学&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/…...

Anaconda 使用指南,少走弯路

​​​​​​​anaconda包管理器和环境管理器&#xff0c;强烈建议食用 1.下载 官网下载太慢可选用镜像下载 官网下载 &#xff1a;Anaconda | Individual Editionhttps://www.anaconda.com/products/distribution 镜像下载&#xff1a;Index of /anaconda/archive/ | 清华大…...

使用stable diffusion webui时,安装gfpgan失败的解决方案(windows下的操作)

1.问题描述 初次打开stable diffusion webui时&#xff0c;需要安装gfpgan等github项目。但在安装gfpgan时&#xff0c;显示RuntimeError: Couldnt install gfpgan 2.解决方案 无法安装gfpgan的原因是网络问题&#xff0c;就算已经科学上网&#xff0c;并设置为全局&#x…...

Python 中导入csv数据的三种方法

这篇文章主要介绍了Python 中导入csv数据的三种方法,内容比较简单&#xff0c;非常不错&#xff0c;具有一定的参考借鉴价值&#xff0c;需要的朋友可以参考下微点阅读小编收集的文章介绍。 Python 中导入csv数据的三种方法&#xff0c;具体内容如下所示&#xff1a; 1、通过…...

相关性分析、相关系数矩阵热力图

相关性 相关性分析是研究两组变量之间是否具有线性相关关系&#xff0c;所以做相关性分析的前提是假设变量之间存在线性相关性&#xff0c;得到的结果也是描述变量间的线性相关程度。除此之外&#xff0c;相关性分析方法还会有其他的假设条件。而灰色关联度分析首先对数据量要求…...

【python123】题目答案整理 ------更多答案见专栏

目录 二老鼠打洞 来自计算机的问候-任意数量参数 自定义幂函数 来自计算机的问候-多参函数 编写函数输出自除数 最大素数 求数列前n项的平方和 生兔子 计算圆周率——割圆法 数列求前n项和 素数&#xff1a; *如有错误请私聊纠正 二老鼠打洞 nint(input()) # 每日打…...

Python编程题汇总

Python编程复习 1.1找出列表中单词最长的一个 找出列表中单词最长的一个def test():a ["hello", "world", "yoyo", "congratulations"]length len(a[0])# 在列表中循环for i in a:if len(i) > length:length ireturn length p…...

Matplotlib详解

视频教程 1.什么是matplotlib matplotlib: 最流行的Python底层绘图库&#xff0c;主要做数据可视化图表,名字取材于MATLAB&#xff0c;模仿MATLAB构建 2.样例 2.1折线图 eg&#xff1a;假设一天中每隔两个小时(range(2,26,2))的气温(℃)分别是[15,13,14.5,17,20,25,26,26,…...

Jetson AGX Orin安装Anaconda、Cuda、Cudnn、Pytorch、Tensorrt最全教程

文章目录一&#xff1a;Anaconda安装二&#xff1a;Cuda、Cudnn安装三&#xff1a;Pytorch安装四&#xff1a;Tensorrt安装一&#xff1a;Anaconda安装 Jetson系列边缘开发板&#xff0c;其架构都是arm64&#xff0c;而不是传统PC的amd64&#xff0c;深度学习的环境配置方法大…...

pytorch入门篇2 玩转tensor(查看、提取、变换)

上一篇博客讲述了如何根据自己的实际需要在pytorch中创建tensor&#xff1a;pytorch入门篇1——创建tensor&#xff0c;这一篇主要来探讨关于tensor的基本数据变换&#xff0c;是pytorch处理数据的基本方法。 文章目录1 tensor数据查看与提取2 tensor数据变换2.1 重置tensor形状…...

随机森林算法

随机森林1.1定义1.2随机森林的随机性体现的方面1.3 随机森林的重要作用1.4 随机森林的构建过程1.5 随机森林的优缺点2. 随机森林参数描述3. 分类随机森林的代码实现1.1定义 随机森林是一种有监督学习算法&#xff0c;是以决策树为基学习器的集成学习算法。随机森林非常简单&am…...

实证分析 | 中介效应检验原理与Stata代码实现

前言 本文是温忠鳞和叶宝娟2014年刊载于《心理科学进展》的论文《中介效应分析&#xff1a;方法和模型发展》的简要笔记与拓展。 温忠麟、叶宝娟&#xff1a;《中介效应分析&#xff1a;方法和模型发展》&#xff0c;《心理科学进展》&#xff0c;2014年第5期 中介效应检验 要…...

几个代码画出漂亮的词云图,python最简单的词云图教程(建议收藏)

在开始编写程序之前&#xff0c;我们先了解一下词云图的作用&#xff0c;我们拿到一篇文章&#xff0c;想得到一些关键词&#xff0c;但文章篇幅很大&#xff0c;无法短时间得到关键词&#xff0c;这时我们可以通过程序将文章中的每个词组识别出来&#xff0c;统计每个词组出现…...

mac m1,m2 安装 提供GPU支持的pytorch和tensorflow

mac m1,m2 安装 提供GPU支持的pytorch和tensorflowAnaconda安装测试Pytorch参考链接安装步骤安装 Xcode创建conda环境测试加速效果注意Tensorflow参考链接安装步骤安装 Xcode指定安装环境加速效果测试The Endmac m1 刚出的时候&#xff0c;各种支持都不完善。那时候要使用conda…...

如何用Python优雅的合并两个Dict

假设有两个dict x和y&#xff0c;合并成一个新的dict&#xff0c;不改变 x和y的值&#xff0c;例如 x {a: 1, b: 2}y {b: 3, c: 4} 期望得到一个新的结果Z&#xff0c;如果key相同&#xff0c;则y覆盖x。期望的结果是 >>> z {a: 1, b: 3, c: 4} 在PEP448中&#xff…...

python读取文件的几种方式

下面是不同场景较为合适的数据读取方法&#xff1a; 1.python内置方法&#xff08;read、readline、readlines&#xff09; 纯文本格式或非格式化、非结构化的数据&#xff0c;常用语自然语言处理、非结构文本解析、应用正则表达式等后续应用场景下&#xff0c;Python默认的三…...