第五节:基于Pytorch的相关可视化

2023-05-16

第五节:基于Pytorch的相关可视化

在Pytorch发布后,网络及训练过程的可视化工具也相应的被开发出来来帮助用户监督所建立的模型的结构和训练过程

本章将讲解HiddenLayer库,HiddenLayer库是一个非常简单、已与扩展、可用于可视化深度学习训练过程及网络结构的、可以喝Jupyter Notebook完美兼容的库
HiddenLayer开发的初衷是对于小型的项目,没有必要使用TensorBoard这类复杂的高级工具来进行检测,所以HiddenLayer是一个轻量化、小型的可视化工具,除了对Pytorch的支持外,HiddenLayer还支持Keras、TensorFlow等高级工具

此外我们还会介绍PyTorchViz这个用于创建PyTorch执行图和跟踪的可视化图库,这个库非常的请谅解,我们可以使用其提供的make_dot函数来可视化网络结构

tensorboardX是PyTorch用于链接TensorFlow的tensorboard可视化工具的库,通过tensorboardX我们可以使用深度学习可视化神奇tensorboard来监督、查看PyTorch的深度学习网络的训练过程,并且tensorboardX库非常容易使用

最后我们会介绍Visdom库,Visdom库是FB为PyTorch专门开发的一款可视化工具,该库使用时较为灵活,可用于创建、组织和共享实时丰富数据的可视化图像,可以直接对Tensor进行操作,也可以直接操作Numpy库,能够胜任大部分数据可视化任务

通常来说我们以文本的形式来展示网络的结构是非常不利于理解的,因为层与层之间之间会具有联系,例如ResNet

想要直观的了解网络的结构需要求我们以图片的形式进行展示

此外我们能够直观的检测网络训练过程将会帮助我们更好的进行训练

因此我们接下来可视化分为两部分:可视化网络以及可视化训练过程

准备网络和数据

我们首先定义一个简单的CNN来对手写数字进行分类,我们接下来的可视化都将基于这个网络来进行

首先导包

import torch
import torch.nn as nn
import torchvision
import torchvision.utils as vutils
from torch.optim import SGD
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import numpy as np

接下来导入数据集并进行加载

train_data=torchvision.datasets.MNIST(root='./data/MNIST/',
                                      train=True,
                                      transform=torchvision.transforms.ToTensor(),
                                      download=False)
train_loader=Data.DataLoader(dataset=train_data,shuffle=True,num_workers=2,batch_size=128)

test_data=torchvision.datasets.MNIST(root='./data/MNIST/',train=False,transform=torchvision.transforms.ToTensor(),
                                    download=False)
test_data_X=test_data.data.type(torch.FloatTensor) / 255.0
test_data_X=torch.unsqueeze(input=test_data_X,dim=1)
test_data_y=test_data.targets
for step,(batch_x,batch_y) in enumerate(train_loader):
    if step>0:
        break
print(len(train_loader))
print(batch_x.shape)
print(batch_y.shape)
print(test_data_X.shape)
print(test_data_y.shape)
>>>
469
torch.Size([128, 1, 28, 28])
torch.Size([128])
torch.Size([10000, 1, 28, 28])
torch.Size([10000])

接下来定义并实例化一个网络

class ConvNet(nn.Module):
    def __init__(self):
        super(ConvNet,self).__init__()
        self.conv1=nn.Sequential(\
                                nn.Conv2d(in_channels=1,out_channels=16,kernel_size=(3,3),stride=1,padding=1),
                                nn.ReLU(),
                                nn.AvgPool2d(kernel_size=(2,2),stride=2))
        self.conv2=nn.Sequential(\
                                nn.Conv2d(in_channels=16,out_channels=32,kernel_size=(3,3),stride=1,padding=1),
                                nn.ReLU(),
                                nn.MaxPool2d(kernel_size=(2,2),stride=2))
        self.fc=nn.Sequential(\
                              nn.Linear(in_features=32*7*7,out_features=128),
                              nn.ReLU(),
                              nn.Linear(in_features=128,out_features=64),
                              nn.ReLU())
        self.predict=nn.Linear(in_features=64,out_features=10)
        
    def forward(self,x):
        x=self.conv1(x)
        x=self.conv2(x)
        x=self.fc(x)
        output=self.predict(x)
        return x
    
MyConvNet=ConvNet()
print(MyConvNet)
>>>
ConvNet(
  (conv1): Sequential(
    (0): Conv2d(1, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU()
    (2): AvgPool2d(kernel_size=(2, 2), stride=2, padding=0)
  )
  (conv2): Sequential(
    (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU()
    (2): MaxPool2d(kernel_size=(2, 2), stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (fc): Sequential(
    (0): Linear(in_features=1568, out_features=128, bias=True)
    (1): ReLU()
    (2): Linear(in_features=128, out_features=64, bias=True)
    (3): ReLU()
  )
  (predict): Linear(in_features=64, out_features=10, bias=True)
)

可视化网络

HiddenLayer可视化网络

接下里我们使用HiddenLayer库来可视化网络

HiddenLayer库中包含一个build_graph函数可以方便的帮助我们进行可视化

HiddenLayer可视化的原理就是跟踪一个输入,然后绘制出该输入经过的结构,即网络的结构

 import hiddenlayer as hl
MyConvNet_graph=hl.build_graph(MyConvNet,torch.zeros(size=[1,1,28,28]))
MyConvNet_graph.theme=hl.graph.THEMES['blue'].copy()
MyConvNet_graph.save(path='./MyConvNetArchitect.png',format='png')

上面的程序中我们使用了Hidden、

Layer的build_graph函数,为其传入需要绘制结构的网络,接下来我们又传入了一个可用于网络计算的输入x来进行追踪

我们又设置需要绘制的图像的主题为蓝色

最后我们使用svae函数来保存绘制的图像,需要为save函数传入保存的路径和格式即可

得到的结构图如下

在这里插入图片描述

PyTorchViz可视化

除了使用HiddenLayer来可视化网络以外,我们还可以使用PyTorchViz来可视化网络

PyTorchViz主要使用make_dot函数来进行绘制,其原理和HiddenLayer相同,都是对输入进行追踪

不过不同的是HiddenLayer对输入的追踪集成到了函数内部,PyTorchViz则需要通过PyTorch来进行追踪

from torchviz import make_dot
x=torch.randn(size=(1,1,28,28)).requires_grad_(True)
y=MyConvNet(x)
MyConvNetVis=make_dot(y,params=dict(list(MyConvNet.named_parameters())+[('x',x)]))
MyConvNetVis.format='png'
MyConvNetVis.directory='./'
MyConvNetVis.view()

这里我们首先通过PyTorch初始化了一个输入x,并指明需要计算其梯度,接下来进行计算得到其输出

然后我们使用make_dot类进行绘图,我们需要指定输出和网络中所有的参数来帮助我们绘图,即这列的list(MyConvNet.named_parameters())+['x',x]

我们指定format属性来设置格式,指定directory来指定路径,最后使用view来显示图像

得到的效果如下

在这里插入图片描述

可视化训练过程

网络结构可视化主要帮助我们理解搭建的网络或者搭建网络时存在的错误

而对训练过程进行可视化则是为了监督训练过程、增加对网络的理解等等

接下来我们将使用tensorboardX和HiddenLayer库来可视化我们的训练过程

tensorboardX可视化训练过程

tensorboard是TensorFlow的可视化工具,能够帮助我们对TensorFlow搭建出的网络进行较好的可视化

而PyTorch本身却并没有自带的可视化工具,因此tensorboardX是基于tensorboard为PyTorch开发的,调用tensorboard的库

tensorboard可视化训练过程的基本思想是创建一个编写器来对每一次训练进行记录(Summary),我们每次向其中添加本次训练的参数即可

tensorboardX常用的库

tensorboardX库中常用的功能和调用方式如下

函数功能用法
SummaryWrite创建编写器,保存日志writer=SummaryWrite()
weiter.add_scalar()添加标量writer.add_scalar(‘myscalar’,value,iteration)
writer.add_image()添加图像writer.add_image(‘imresult’,x,iteration)
writer.addhistogram()添加直方图writer.add_histogram(‘hist’,array,iteration)
writer.add_graph()添加网络结构writer.add_graph(model,input_to_model=None)
writer.add_audio()添加音频writer.add_audio(tag,audio,iteration,sample_true)
writer.add_text()添加文本weiter.add_text(tag,text_string,global_step=None)

上面列举了常用的可视化方法,如在图像中添加标量,文本,音频,直方图等等

下面将使用上面的网络来进行可视化

tensorboardX进行可视化

from tensorboardX import SummaryWriter
SummaryWriter=SummaryWriter(log_dir='./log')
optimizer=torch.optim.Adam(params=MyConvNet.parameters(),lr=0.0003,betas=(0.9,0.999),eps=1e-8)
lossFunc=torch.nn.CrossEntropyLoss()
train_loss=0
print_step=100
for epoch in range(5):
    for step,(batch_x,batch_y) in enumerate(train_loader):
        output=MyConvNet(batch_x)
        loss=lossFunc(output,batch_y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        train_loss+=loss
        niter=epoch*len(train_loader)+step+1
        if niter % print_step ==0:
            SummaryWriter.add_scalar('train loss',train_loss.item()/niter,global_step=niter)
            output=MyConvNet(test_data_X)
            _,pre_lab=torch.max(output,1)
            acc=accuracy_score(test_data_y,pre_lab)
            SummaryWriter.add_scalar('test acc',acc.item(),niter)
            batch_x_image=vutils.make_grid(batch_x,nrow=12)
            SummaryWriter.add_image('train image sample',batch_x_image,niter)
            for name,param in MyConvNet.named_parameters():
                SummaryWriter.add_histogram(name,param.data)
        if niter%500==0:
            print('in training')

这里我们在训练的过程中每100轮训练进行一次记录,我们使用add_scalar记录需要保存的常数及其tag/标签

对于add_scalar函数,我们使用的时候需要指定保存的tag,保存的对象的值和当前值在全局的训练轮次

最后我们对数字进行了可视化,首先使用torchvision.utils中的make_grid生成了数字的网格图

然后使用add_image方法将图像添加到我们的编写器中

查看tensorboardX可视化的结果

接下来我们就需要查看可视化的结果,上面我们将日志保存到了log文件夹下

我们生成的是tensorboardX得到的编写器是一个需要使用tensorboard来读取的文件

在这里插入图片描述

我们在命令行中输入如下语句,就会得到一个保存了所有内容的本地网页

(pytorchlearning) jack@jack-Alienware-Area-51m:~/PytorchLearning$ tensorboard --logdir='./log/'
>>>
TensorBoard 1.13.1 at http://jack-Alienware-Area-51m:6006 (Press CTRL+C to quit)

打开这个网页其中就是我们可视化的结果

scalar栏目下就是我们记录的所有的常量

在这里插入图片描述

在这里插入图片描述

虽然tensorboard可视化训练过程的效果很强大,但是对于小型的网络进行可视化就很繁琐了

HiddenLayer可视化训练过程

下面我们将使用HiddenLayer库进行可视化,通常对于小型网络的可视化我们都是使用HiddenLayer进行的

使用HiddenLayer进行可视化实际上和使用tensorboard进行可视化的过程都是大同小异的

%%time
import hiddenlayer as hl
import time
MyConvNet=ConvNet()
optimzer=torch.optim.Adam(MyConvNet.parameters(),lr=0.0003)
lossFunc=nn.CrossEntropyLoss()
history1=hl.History()
canvas1=hl.Canvas()
print_step=100
for epoch in range(5):
    for step,(batch_x,batch_y) in enumerate(train_loader):
        output=MyConvNet(batch_x)
        loss=lossFunc(output,batch_y)
        optimzer.zero_grad()
        loss.backward()
        optimzer.step()
        if step%100==0:
            output=MyConvNet(test_data_X)
            _,pre_lab=torch.max(output,1)
            acc=accuracy_score(test_data_y,pre_lab)
            history1.log((epoch,step),train_loss=loss,test_acc=acc,hidden_weight=MyConvNet.fc[2].weight)
with canvas1:
    canvas1.draw_plot(history1['train_loss'])
    canvas1.draw_plot(history1['test_acc'])
    canvas1.draw_image(history1['hidden_weight'])
>>>
CPU times: user 4min 2s, sys: 20 s, total: 4min 22s
Wall time: 34.4 s

我们训练的过程都是大同小异的,不同之处在于我们一开始初始化了HiddenLayer的History对象来记录训练数据,以及初始化了Canvas对象来进行绘图,我们在训练的时候调用history对象的log方法来保存日志,最后调用canvas的draw_plot方法来绘制图像

在这里插入图片描述

Visdom可视化

Visdom是FB专门为PyTorch开发的可视化工具,这个库非常灵活,可以用于创建、组织和共享实时丰富数据的可视化

Visdom的可视化是基于网页实现的,能够让用户以多种方式来进行交互的可视化,从而对数据的可视化理解更加直观

可视化对象支持PyTorch中的tensor和Numpy的数组

Visdom中常用的可视化结构函数和功能如下

可视化函数功能
vis.image可视化图像
vis.images可视化一个batch的图像或一个图像列表
vis.text可视化文本
vis.video播放视频
vis.audio播放音频
vis.matplot可视化matplot中的图像
vis.scatter可视化散点图
vis.line可视化线图
vis.stem可视化茎叶图
vis.heatmap可视化热力图
vis.bar可视化条形图
vis.histogram可视化直方图
vis.boxplot可视化箱型图
vis.surf可视化曲面图
vis.contour可视化等高线图
vis.quiver可视化箭头图
vis.mesh可视化网格图

我们下面将使用鸢尾花数据集来进行讲解

我们首先导包

from visdom import Visdom
from sklearn.datasets import load_iris

此外,我们首先需要在命令行执行如下命令来开启visdom后台服务器,来实现实时绘图,绘图期间需要保持该命令行终端开启

我们执行命令后就会得到一个本地的地址,例如我这里是http://localhost:8097,我们在浏览器中打开就可以看到实时绘制的图像

python -m visdom.server
>>>
(pytorchlearning) jack@jack-Alienware-Area-51m:~$ python -m visdom.server
/home/jack/anaconda3/envs/pytorchlearning/lib/python3.7/site-packages/visdom/server.py:39: DeprecationWarning: zmq.eventloop.ioloop is deprecated in pyzmq 17. pyzmq now works with default tornado and asyncio eventloops.
  ioloop.install()  # Needs to happen before any tornado imports!
It's Alive!
INFO:root:Application Started
You can navigate to http://localhost:8097

绘制二维/三维散点图

我们使用Visdom绘图的时候首先需要实例化一个Visdom对象,接下来调用Visdom对象的scatter方法来进行绘图

需要注意的是,scatter方法能够自动的识别我们传入的是二维数据还是三维数据,从而自动的生成二维点与三维点

vis = Visdom()
vis.scatter(iris_x[:,0:2],Y=iris_y+1,win='windows1',env='main')
vis.scatter(iris_x[:,0:3],Y=iris_y+1,win='3D 散点图',env='main',opts=dict(markersize=4,xlabel='特征1',ylabe='特征2'))

需要注意的是,Visdom将一个网页分为了多个windows和environment,我们在绘制图像的时候还需要指定对应的窗口和环境,此外我们在绘制三维散点图的时候指定opts参数来设定点的格式

执行后打开网页就会看到实时渲染的图片,我们能够看到上方的选项卡中有环境的选择,而我们的两个图片都在各自的窗口中,我们使用鼠标就可以进行交互

在这里插入图片描述

绘制折线图

下面我们将绘制折线图,绘制折线图主要使用的是visdom对象的line方法

Sigmoid=nn.Sigmoid()
ReLu=nn.ReLU()
Tanh=nn.Tanh()
x=torch.linspace(start=-6,end=6,steps=100).view((-1,1))
plot_y=torch.cat((Sigmoid(x),ReLu(x),Tanh(x)),dim=1)
plot_x=torch.cat((x,x,x),dim=1)
vis.line(Y=plot_y,X=plot_x,win="line plot",env='new',
        opts=dict(dash=np.array(['soild','dash','dashshot']),
                 legend=['Sigmoid','ReLu','Tanh']))

这里我们指定图像绘制在新环境new中,同事指定线条样式和图例

在这里插入图片描述

绘制茎叶图

下面我们使用visdom对象的stem方法绘制一个茎叶图

x=torch.linspace(-6,6,300).view((-1,1))
y1=torch.sin(x)
y2=torch.cos(x)
plot_x=torch.cat((x,x),dim=1)
plot_y=torch.cat((y1,y2),dim=1)
vis.stem(X=plot_y,Y=plot_x,win='stem plot',env='stem',
        opts=dict(legend=['sin','cos'],title='茎叶图'))

需要注意的是吗,这里有一个坑就是我们的stem函数中X是我们要绘制的图像的输入,我们需要输入plot_y,Y则是我们需要输入的ploy_x

0可视化的结果如下

在这里插入图片描述

绘制热力图

我们调用heatmap来绘制热力图

iris_corr=torch.from_numpy(np.corrcoef(iris_x,rowvar=False))
vis.heatmap(X=iris_corr,win='new',env='heatmap',
           opts=dict(rownames=['x1','x2','x3','x4'],
                    columnnames=['x1','x2','x3','x4'],
                    title='热力图'))

我们首先使用numpy的corrcoef函数来求出输入的相关系数矩阵,接下来使用heatmap来进行可视化

在这里插入图片描述

可视化图像

我们下面分别使用image和images两个接口来可视化单张图像和一个batch的图像

vis.image(batch_x[0,:,:,:],win='one image',env='Image',
         opts=dict(title='单张图像'))
vis.images(batch_x,win='many images',env='Image',
          nrow=16,opts=dict(title='多张图像'))

可视化结果如下

在这里插入图片描述

可视化文本

我们使用text接口来可视化文本

texts='A flexible tool for creating, organizaing, and sharing visualization of live, rich data. Supports Torch and Numpu'
vis.text(texts,win='texts plot',env='Text',opts=dict(title='可视化文本'))

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第五节:基于Pytorch的相关可视化 的相关文章

  • STM32CubeMX(05) 移植陀螺仪MPU6050的DMP库读取三轴角度,加速度

    文章目录 前言一 MPU6050是什么 xff1f 二 STM32CubeMX配置2 1 IIC配置2 2 开启中断2 3 硬件连接2 4 软件编写 三 导入DMP库3 1 keil配置3 2 添加头文件路径3 3 添加头文件3 4 添加初
  • 基于STM32的智能GPS定位系统(云平台、小程序)

    如需源码或成品可以私我 背景及目标 前阵子 xff0c 准确的说是好几个月前买了一辆电瓶车 xff0c 当时呢因为车停得很随意 xff0c 所以想给小电驴装一个GPS xff0c 一方面是防盗 xff0c 另一方面是为了测速和绘制骑行轨迹
  • 蓝桥杯大赛

    第十一届蓝桥杯单片机比赛心得 前期的准备十月份省赛十一月份国赛错过结果发布 想要做一点事情 xff0c 传承 前期的准备 本次蓝桥杯大赛由于疫情原因延迟了将近7个月举行 xff0c 原先是3月份举行 xff0c 拖到了10月份 xff0c
  • 蓝桥杯模块练习之关闭外设

    蓝桥杯单片机比赛系列1初探关闭外设 关闭LED关闭继电器和蜂鸣器 关闭LED 本节将会介绍板子上的最简单最基础的部分 比赛一般上来需要关闭无关外设 xff0c 蓝桥杯的板子比较特殊 xff0c 51上电默认P0 O1 P2 P3都是高电平
  • 蓝桥杯模块练习之温度传感器DS18B20

    蓝桥杯单片机比赛系列4温度传感器DS18B20 温度传感器DS18B20原理相关电路onewire总线几个需要知道的暂存器和命令 代码解释修改代码自写代码 实现代码 温度传感器DS18B20原理 相关电路 DS18B20遵循onewire总
  • 被锡膏坑了一把

    锡膏 61 锡珠 43 助焊剂 把锡膏放大来看如下图 我是去年买的一罐锡膏 xff0c 138度的 xff0c 用了一两次 xff0c 然后就放在哪里没动它 xff0c 盖子也盖好了 xff0c 没有放冰箱 今年又拿出来用 xff0c 用钢
  • 蓝桥杯模块练习之AD/DA

    蓝桥杯单片机比赛系列6AD DA转换 AD DA原理相关电路pcf8591器件地址 代码解释修改代码AD自写代码ADDA AD DA原理 相关电路 通过pcf8591芯片实现ad转换 板子上ad采集主要采集滑动变阻器的电压值和与光敏电阻串联
  • 蓝桥杯模块练习之EEPROM

    蓝桥杯单片机比赛系列7EEPROM EEPROM原理相关电路AT24C02器件地址 EEPROM自写代码 EEPROM原理 相关电路 有了系列6的基础 xff0c 上手eeprom就简单多了 xff0c 板子上对应的器件是AT24C02 A
  • Openmv学习day1——色块识别

    find blobs函数 image find blobs thresholds roi 61 Auto x stride 61 2 y stride 61 1 invert 61 False area threshold 61 10 pi
  • 蓝桥杯嵌入式模块练习之扩展版MEME

    三轴传感器 PA4 7都不能作为其他用处 xff0c 三周传感器需要使用到这四个引脚资源 当然 xff0c 如果不用中断 xff0c 也可以只结PA4 5 xff0c PA6 7可接到温度传感器和温湿度传感器 这个外设的通信协议也是I2C跟
  • Github Pages 搭建网站

    个人站点 访问 https 用户名 gitub io 搭建步骤 1 创建个人站点 gt 新建仓库 xff08 仓库名必须是 用户名 github io xff09 2 在仓库下新建index heml文件即可 3 Github pages仅
  • 普通io口模拟串口通信

    之前公司在做项目的时候需要用到多串口 xff0c 板载串口资源不足 xff0c 就在网上找相关内容 xff0c 结合自己的理解做出虚拟串口 模拟串口需要用到两个普通io引脚 xff0c 一个定时器 软件串口的实现 IO模拟串口 波特率 xf
  • UART,SPI,IIC,RS232通信时序和规则

    一 UART 1 串口通信方式 2 串口通信步骤 注意 xff1a 串口协议规定 xff0c 闲置时必须是高电平 校验位 xff1a 是使用奇偶校验 停止位必须高电平 一个0和多个0区分是靠掐时间 异步通信 xff1a 时钟各不一样 二 I
  • kvaser pcie can 在ros中使用socketcan开发

    kvaser pcie can 在ros中使用socketcan开发 0 系统配置 Ubuntu 16 04 6 LTS Linux version 4 15 0 45 generic 1 官网下载地址 https www kvaser c
  • 算法训练 - 连接字符串 编程将两个字符串连接起来。例如country与side相连接成为countryside。   输入两行,每行一个字符串(只包含小写字母,长度不超过100);输出一行一个字符

    问题描述 编程将两个字符串连接起来 例如country与side相连接成为countryside 输入两行 xff0c 每行一个字符串 xff08 只包含小写字母 xff0c 长度不超过100 xff09 xff1b 输出一行一个字符串 例
  • 笔记 FreeRtos任务创建失败原因

    问题 使用NXP的S32芯片开发 xff0c 环境是S32DS 2018 xff0c 创建了三个任务 xff0c 最后发现只有一个任务在运行 找问题 S32DS自带了Freertos的分析调试工具 xff0c 打开后可以显示任务的状态 xf
  • 3.提升不同专业能力的差别?

    有段时间没写博客了 今天来谈谈最近工作的一些感悟 首先 我觉得工资和个人能力是成正相关的 这应该是是所有人都认同的吧 如果工资是一个函数的话 也可以说 工资 Y 是一个与个人能力 X 有关的一次函数Y aX b 方然我们不能忽略行业之间的差
  • 网络通讯学习(1)---TCP通讯

    TCP IP四层模型 UDP TCP协议 TCP xff08 The Transmission Control Protocol xff09 xff1a 传输控制协议 UDP TCP协议都属于传输层协议 xff0c 都位于IP协议以上 xf
  • 网络通讯学习(3)-----UDP通讯(仅了解)

    理论 UDP xff08 用户数据报协议 xff09 是一个无连接 xff0c 不可靠的数据传输 xff0c 其特点是简单 xff0c 快捷 相比与TCP xff0c UDP不需要建立连接 xff08 不需connect accept函数
  • WIFI模块不支持MQTT协议,可通过MCU实现

    1 话题原因 我们使用某款WIFI模块 xff0c 在物联网开发时 xff0c 平台端的开发者想要使用MQTT协议 xff0c 但是我们当前使用的模块不支持MQTT协议 xff08 好像ESP8266可以通过重新烧录固件的方式支持 xff0

随机推荐

  • (一) 路径规划算法---Astar与C++可视化在RVIZ的三维点云地图

    Astar与C 43 43 可视化在RVIZ的三维点云地图 文章目录 Astar与C 43 43 可视化在RVIZ的三维点云地图1 功能包介绍2 算法功能包的组成与介绍2 1文件系统组成2 2 头文件说明2 3 源文件说明 3 相关坐标系说
  • SpringSecurity整合OAuth2.0

    SpringSecurity整合OAuth2 一 概述与原理1 1 OAuth2 0 是什么 xff1f 1 2 OAuth2 0中角色解释1 3 OAuth2 0的4中授权模式1 3 1 授权码模式 xff08 重点 xff09 1 3
  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart)里面的中断接收函数

    目录 前言1 UART Receive IT2 HAL UART Receive3 HAL UART Receive IT 前言 看了很长时间串口中断的HAL库 xff0c 最容易混淆的就是函数的名称 xff0c 主要集中在UART Rec
  • 位操作读写寄存器一个字节的多个位

    一 写寄存器多个位 方法一 span class token comment bitStart 目标字节的起始位 length 位长度 data 存放改变目标字节位的值 b 写入后的一个字节值 span u8 mask
  • STM32 电压采集上位机 C#

    工具箱中添加progressBar 添加一个事件函数 xff0c 用于串口接收数据 xff0c 并显示电压值 private void PortDataReceivedEvent object sender SerialDataReceiv
  • cmake使用教程(一)多目录下多个文件的构建

    1 采用 out of source 外部构建多个目录多个文件 这里的文件存储方式如下 xff1a 其中build是构建目录 xff0c 即构建的结果和中间产物都在该目录下 include是包含目录 src是子函数的目录或是依赖文件的目录
  • vue 实现遍历后端接口数据并展示在表格中

    用前端的vue遍历接口 首先就需要有后端的JSON数据 这里可以自己去写接口 可以伪造JSON数据 整理是伪造的JSON数据 34 userId 34 1 34 deptId 34 103 34 userName 34 34 admin 3
  • STM32的存储器映射中的指针操作

    例如 xff1a GPIOB的端口输出数据寄存器ODR的地址是0x4001 0C0C 并且ODR寄存器是32位的 那么我们可以用如下代码对寄存器进行操作 xff1a unsigned int 0x4001 0C0C 61 0xFFFFFFF
  • Mac 启动Redis报错 没有指定的conf文件

    报错如下 xff1a Warning no config file specified span class token punctuation span span class token keyword using span the de
  • java 优化双重for循环

    首先我们要有两个对象分别是 学生信息 和 学生住宿信息 span class token keyword class span span class token class name Student span span class toke
  • 微服务 - gateway网关配置

    server port 10010 网关端口 spring application name gateway 服务名称 cloud nacos server addr localhost 8848 nacos地址 gateway route
  • 如何在手机或平板上编写代码?

    下面给大家推荐一款免费的 在线协作式 基于浏览器的 IDE的在线编程网站 支持语言包括 Java C 43 43 C C JavaScript CSS PHP等50多种主流开发语言 地址 The collaborative browser
  • 羊了个羊, 低配版开源代码来啦~

    前几天朋友圈突然被一个小游戏 羊了个羊 刷屏了 xff0c 出于好奇我也打算小玩一把试试 xff0c 结果没想到上头了 游戏的玩法非常简单 xff0c 类似 消消乐 xff0c 从一堆方块中找到相同图案的 3 个方块并消除即可 但没想到 x
  • MySQL 使用索引和不使用索引的区别(附17W条数据SQL文件)

    MySQL 使用索引可以减少查询的时间 xff0c 而不使用索引的查询会更加耗时 xff0c 因为MySQL需要扫描整个表 此外 xff0c 使用索引可以提高查询的性能 xff0c 同时也可以提高查询的可读性和可维护性 换句话来说 使用索引
  • 如何使用AI来帮你写代码(Cursor使用教程)

    x1f4ac 产品介绍 cursor是一个新的Ide xff0c 它使用Ai来帮助您重构理解调试并使用Cursor编写代码我们的目标是使构建软件的过程更快 更愉快 我们从头开始构建了一个代码编辑器 xff0c 对我们的第一个功能进行了原型设
  • [Java多线程-基础] 如何定位线程中的死锁问题?

    x1f512 死锁代码 下面提供的代码演示了死锁的情况 程序创建了两个线程 xff0c 线程1和线程2 xff0c 它们都试图以不同的顺序获取两个不同的资源 xff0c resource1和resource2 线程1首先获取resource
  • [Java多线程-基础] 避免线程死锁问题(ReentrantLock的使用)

    ReentrantLock 的设计初衷是为了提供一种比 synchronized 更加灵活和可控的锁机制 与 synchronized 相比 xff0c ReentrantLock 提供了更多的功能 xff0c 如可重入性 公平锁和中断锁等
  • IDEA插件:智能代码生成器,附带注释和性能/安全检测功能

    x1f680 1 安装插件 在插件中搜索关键字 biot 点击安装 x1f680 2 代码生成 右侧的侧边栏点击biot后 在下方的输入框中输入你要问的内容 x1f680 3 biot AI 选中选区中的代码 点击鼠标右键让ai来帮你改代码
  • 安装Windows Server 2016 服务器 标准版

    注意事项 xff1a 安装带桌面版的 管理员密码设置 xff0c 要 注意大小写加数字 xff0c 不然会设置失败 安装文件下载 xff1a MSDN 我告诉你 PE U盘 微PE 服务器的驱动 xff0c 可以自己到对应服务器厂家的官网上
  • 第五节:基于Pytorch的相关可视化

    第五节 xff1a 基于Pytorch的相关可视化 在Pytorch发布后 xff0c 网络及训练过程的可视化工具也相应的被开发出来来帮助用户监督所建立的模型的结构和训练过程 本章将讲解HiddenLayer库 xff0c HiddenLa