深度学习入门篇1

2023-05-16

1. 目前流行的深度学习框架简介

深度学习框架(点击跳转)

2.神经网络工具箱torch.autograd与torch.nn

torch.autograd库虽然实现了自动求导与梯度反向传播,但如果我们要完成一个模型的训练,仍需要手写参数的自动更新、训练过程的控制等,还是不够便利。为此,PyTorch进一步提供了集成度更高的模块化接口torch.nn,该接口构建于Autograd之上,提供了网络模组、优化器和初始化策略等一系列功能。

3. 代码学习

epoch:训练次数
batch :批次,一次训练要多少个样本一起求误差
torch.autograd包的主要功能就是完成神经网络后向传播中的链式求导,手动去写这些求导程序会导致重复造轮子的现象。

搭建简易神经网络(不使用torch.autograd或torch.nn工具箱,自己求梯度)

下面我们用torch搭一个简易神经网络:不借助工具箱,自己求梯度
1、我们设置输入节点为1000,隐藏层的节点为100,输出层的节点为10
2、输入100个具有1000个特征的数据,经过隐藏层后变成100个具有10个分类结果的特征,然后将得到的结果后向传播

import torch
batch_n = 100#一个批次输入数据的数量
hidden_layer = 100
input_data = 1000#每个数据的特征为1000
output_data = 10

x = torch.randn(batch_n,input_data)
y = torch.randn(batch_n,output_data)

w1 = torch.randn(input_data,hidden_layer)
w2 = torch.randn(hidden_layer,output_data)

epoch_n = 20
lr = 1e-6

for epoch in range(epoch_n):
    h1=x.mm(w1)#(100,1000)*(1000,100)-->100*100
    print(h1.shape)
    h1=h1.clamp(min=0)
    y_pred = h1.mm(w2)
    
    loss = (y_pred-y).pow(2).sum()
    print("epoch:{},loss:{:.4f}".format(epoch,loss))
    
    grad_y_pred = 2*(y_pred-y)
    grad_w2 = h1.t().mm(grad_y_pred)
    
    grad_h = grad_y_pred.clone()
    grad_h = grad_h.mm(w2.t())
    grad_h.clamp_(min=0)#将小于0的值全部赋值为0,相当于sigmoid
    grad_w1 = x.t().mm(grad_h)
    
    w1 = w1 -lr*grad_w1
    w2 = w2 -lr*grad_w2

torch.autograd实现一个完整的神经网络(不需要自己求梯度)

torch.autograd包的主要功能就是完成神经网络后向传播中的链式求导,手动去写这些求导程序会导致重复造轮子的现象。
自动梯度的功能过程大致为:先通过输入的Tensor数据类型的变量在神经网络的前向传播过程中生成一张计算图,然后根据这个计算图和输出结果精确计算出每一个参数需要更新的梯度,并通过完成后向传播完成对参数的梯度更新。
完成自动梯度需要用到的torch.autograd包中的Variable类对我们定义的Tensor数据类型变量进行封装,在封装后,计算图中的各个节点就是一个Variable对象,这样才能应用自动梯度的功能。
下面我们使用autograd实现一个二层结构的神经网络模型

import torch
from torch.autograd import Variable
batch_n = 100#一个批次输入数据的数量
hidden_layer = 100
input_data = 1000#每个数据的特征为1000
output_data = 10

x = Variable(torch.randn(batch_n,input_data),requires_grad=False)
y = Variable(torch.randn(batch_n,output_data),requires_grad=False)
#用Variable对Tensor数据类型变量进行封装的操作。requires_grad如果是False,表示该变量在进行自动梯度计算的过程中不会保留梯度值。
w1 = Variable(torch.randn(input_data,hidden_layer),requires_grad=True)
w2 = Variable(torch.randn(hidden_layer,output_data),requires_grad=True)

#学习率和迭代次数
epoch_n=50
lr=1e-6

for epoch in range(epoch_n):
    h1=x.mm(w1)#(100,1000)*(1000,100)-->100*100
    print(h1.shape)
    h1=h1.clamp(min=0)
    y_pred = h1.mm(w2)
    #y_pred = x.mm(w1).clamp(min=0).mm(w2)
    loss = (y_pred-y).pow(2).sum()
    print("epoch:{},loss:{:.4f}".format(epoch,loss.data)) 
    loss.backward()#后向传播 
    w1.data -= lr*w1.grad.data
    w2.data -= lr*w2.grad.data 
    w1.grad.data.zero_()
    w2.grad.data.zero_() 

自定义传播函数

其实除了可以采用自动梯度方法,我们还可以通过构建一个继承了torch.nn.Module的新类,来完成对前向传播函数和后向传播函数的重写。在这个新类中,我们使用forward作为前向传播函数的关键字,使用backward作为后向传播函数的关键字。下面我们进行自定义传播函数:

import torch
from torch.autograd import Variable
batch_n = 64#一个批次输入数据的数量
hidden_layer = 100
input_data = 1000#每个数据的特征为1000
output_data = 10
class Model(torch.nn.Module):#完成类继承的操作
    def __init__(self):
        super(Model,self).__init__()#类的初始化
        
    def forward(self,input,w1,w2):
        x = torch.mm(input,w1)
        x = torch.clamp(x,min = 0)
        x = torch.mm(x,w2)
        return x
    
    def backward(self):
        pass
model = Model()
x = Variable(torch.randn(batch_n,input_data),requires_grad=False)
y = Variable(torch.randn(batch_n,output_data),requires_grad=False)
#用Variable对Tensor数据类型变量进行封装的操作。requires_grad如果是F,表示该变量在进行自动梯度计算的过程中不会保留梯度值。
w1 = Variable(torch.randn(input_data,hidden_layer),requires_grad=True)
w2 = Variable(torch.randn(hidden_layer,output_data),requires_grad=True) 
epoch_n=30 
for epoch in range(epoch_n):
    y_pred = model(x,w1,w2) 
    loss = (y_pred-y).pow(2).sum()
    print("epoch:{},loss:{:.4f}".format(epoch,loss.data))
    loss.backward()
    w1.data -= lr*w1.grad.data
    w2.data -= lr*w2.grad.data 
    w1.grad.data.zero_()
    w2.grad.data.zero_()
    

使用torch.nn.Sequential、torch.optim、torch.nn.损失函数搭建完成的神经网络

import torch
from torch.autograd import Variable

batch_n = 100#一个批次输入数据的数量
hidden_layer = 100
input_data = 1000#每个数据的特征为1000
output_data = 10

x = Variable(torch.randn(batch_n,input_data),requires_grad=False)
y = Variable(torch.randn(batch_n,output_data),requires_grad=False)
#用Variable对Tensor数据类型变量进行封装的操作。requires_grad如果是F,表示该变量在进行自动梯度计算的过程中不会保留梯度值。

models = torch.nn.Sequential(
    torch.nn.Linear(input_data,hidden_layer),
    torch.nn.ReLU(),
    torch.nn.Linear(hidden_layer,output_data)
)
#torch.nn.Sequential括号内就是我们搭建的神经网络模型的具体结构,Linear完成从隐藏层到输出层的线性变换,再用ReLU激活函数激活
#torch.nn.Sequential类是torch.nn中的一种序列容器,通过在容器中嵌套各种实现神经网络模型的搭建,
#最主要的是,参数会按照我们定义好的序列自动传递下去。

# loss_fn = torch.nn.MSELoss()
# x = Variable(torch.randn(100,100))
# y = Variable(torch.randn(100,100))
# loss = loss_fn(x,y)

epoch_n=10000
lr=1e-4
loss_fn = torch.nn.MSELoss()

optimzer = torch.optim.Adam(models.parameters(),lr=lr)
#使用torch.optim.Adam类作为我们模型参数的优化函数,这里输入的是:被优化的参数和学习率的初始值。
#因为我们需要优化的是模型中的全部参数,所以传递的参数是models.parameters()

#进行,模型训练的代码如下:
for epoch in range(epoch_n):
    y_pred = models(x)
    loss = loss_fn(y_pred,y)
    print("Epoch:{},Loss:{:.4f}".format(epoch,loss.data))
    optimzer.zero_grad()#将模型参数的梯度归0
    
    loss.backward()
    optimzer.step()#使用计算得到的梯度值对各个节点的参数进行梯度更新。 

torch.nn.Sequential

自定义搭建各种神经网络模型:

models = torch.nn.Sequential(
    torch.nn.Linear(input_data,hidden_layer),
    torch.nn.ReLU(),
    torch.nn.Linear(hidden_layer,output_data)
)

全连接(或称线性模型)torch.nn.Linear(input_data,hidden_layer)

H=X*W,其中H是隐藏层或输出层,X是输入层,W是权重。

torch.nn.Linear(输入神经元个数(特征数),隐藏层(或输出层)神经元个数)

非线性激活函数 torch.nn.ReLU()

Y=激活函数ReLU( H ),其中H是隐藏层或输入,Y是输出。

torch.nn.ReLU()

防止过拟合torch.nn.Dropout

用于防止卷积神经网络(或全连接神经网络)在训练过程中发生过拟合,原理是以一定的随机概率将卷积神经网络模型的部分参数归零,以达到减少相邻两层神经连接的目的。

nn.Dropout(p=0.5)

4.从手写数字识别例子中认识torchvision包

torchvision 是PyTorch中专门用来处理图像的库。这个包中有四个大类。
(1)torchvision.datasets
(2)torchvision.models
(3)torchvision.transforms
(4)torchvision.utils

完整代码

import torch 
import torchvision
from torchvision import datasets,transforms
from torch.autograd import Variable
import numpy as np
import matplotlib.pyplot as plt

#torchvision.transforms: 常用的图片变换,例如裁剪、旋转等;
# transform=transforms.Compose(
#     [transforms.ToTensor(),#将PILImage转换为张量
#      transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))#将[0, 1]归一化到[-1, 1]
#      #前面的(0.5,0.5,0.5) 是 R G B 三个通道上的均值, 后面(0.5, 0.5, 0.5)是三个通道的标准差
#     ])
transform = transforms.Compose([
     transforms.ToTensor(),
     transforms.Lambda(lambda x: x.repeat(3,1,1)),
     transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
 ])   # 修改的位置

data_train = datasets.MNIST(root="./data/",
                           transform=transform,
                           train = True,
                           download = True)
data_test = datasets.MNIST(root="./data/",
                          transform = transform,
                          train = False)

data_loader_train=torch.utils.data.DataLoader(dataset=data_train,
                                       batch_size=64,#每个batch载入的图片数量,默认为1,这里设置为64
                                        shuffle=True,
                                        #num_workers=2#载入训练数据所需的子任务数
                                       )
data_loader_test=torch.utils.data.DataLoader(dataset=data_test,
                                      batch_size=64,
                                      shuffle=True)
                                      #num_workers=2)

#预览
#在尝试过多次之后,发现错误并不是这一句引发的,而是因为图片格式是灰度图只有一个channel,需要变成RGB图才可以,所以将其中一行做了修改:
images,labels = next(iter(data_loader_train))
# dataiter = iter(data_loader_train) #随机从训练数据中取一些数据
# images, labels = dataiter.next()

img = torchvision.utils.make_grid(images)

img = img.numpy().transpose(1,2,0)
std = [0.5,0.5,0.5]
mean = [0.5,0.5,0.5]
img = img*std+mean
print([labels[i] for i in range(64)])
plt.imshow(img)

import math
import torch
import torch.nn as nn
class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        
        #构建卷积层之后的全连接层以及分类器
        self.conv1 = nn.Sequential(
                nn.Conv2d(3,64,kernel_size=3,stride=1,padding=1),
                nn.ReLU(),
                nn.Conv2d(64,128,kernel_size=3,stride=1,padding=1),
                nn.ReLU(),
                nn.MaxPool2d(stride=2,kernel_size=2)
                )
        
        self.dense = torch.nn.Sequential(
                nn.Linear(14*14*128,1024),
                nn.ReLU(),
                nn.Dropout(p=0.5),
                nn.Linear(1024,10)
            )
        
    def forward(self,x):
        x=self.conv1(x)
        x=x.view(-1,14*14*128)
        x=self.dense(x)
        return x

model = Model()
cost = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters())
print(model)

n_epochs = 5

for epoch in range(n_epochs):
    running_loss = 0.0
    running_correct = 0
    print("Epoch {}/{}".format(epoch,n_epochs))
    print("-"*10)
    for data in data_loader_train:
        X_train,y_train = data
        X_train,y_train = Variable(X_train),Variable(y_train)
        outputs = model(X_train)
        _,pred=torch.max(outputs.data,1)
        optimizer.zero_grad()
        loss = cost(outputs,y_train)
        
        loss.backward()
        optimizer.step()
        running_loss += loss.data
        running_correct += torch.sum(pred == y_train.data)
    testing_correct = 0
    for data in data_loader_test:
        X_test,y_test = data
        X_test,y_test = Variable(X_test),Variable(y_test)
        outputs = model(X_test)
        _,pred=torch.max(outputs.data,1)
        testing_correct += torch.sum(pred == y_test.data)
    print("Loss is:{:4f},Train Accuracy is:{:.4f}%,Test Accuracy is:{:.4f}".format(running_loss/len(data_train),100*running_correct/len(data_train)
                                                                                  ,100*testing_correct/len(data_test)))

data_loader_test = torch.utils.data.DataLoader(dataset=data_test,
                                              batch_size = 4,
                                              shuffle = True)
X_test,y_test = next(iter(data_loader_test))
inputs = Variable(X_test)
pred = model(inputs)
_,pred = torch.max(pred,1)

print("Predict Label is:",[i for i in pred.data])
print("Real Label is:",[i for i in y_test])
img = torchvision.utils.make_grid(X_test)
img = img.numpy().transpose(1,2,0)

std = [0.5,0.5,0.5]
mean = [0.5,0.5,0.5]
img = img*std+mean
plt.imshow(img)

功能模块的解析

加载训练数据、下载训练数据

(1)从本地加载图片、数据;
(2)从服务器下载并加载图片、数据;

data_train = datasets.MNIST(root="./data/",
                           transform=transform,
                           train = True,
                           download = True)
data_test = datasets.MNIST(root="./data/",
                          transform = transform,
                          train = False) 

创建待训练模型、加载已训练模型:torchvision.models

(1)创建一个权重随机初始化的网络模型用于下一步的训练,有以下成熟模型可供选择:
AlexNet、VGG、ResNet、SqueezeNet、DenseNet。这几个网络模型各有优缺点,可根据应用场景进行选择。

import torchvision.models as models
resnet18 = models.resnet18()
alexnet = models.alexnet()
squeezenet = models.squeezenet1_0()
densenet = models.densenet_161() 

(2) 加载一个别人预训练好的模型:

import torchvision.models as models
resnet18 = models.resnet18(pretrained=True)
alexnet = models.alexnet(pretrained=True)

数据变换类torch.transforms (缩放、裁剪、翻转、类型转换)

torchvision.transforms.Resize
torchvision.transforms.Scale
torchvision.transforms.CenterCrop
torchvision.transforms.RandomCrop
torchvision.transforms.RandomHorizontalFlip
torchvision.transforms.RandomVerticalFlip
torchvision.transforms.ToTensor
torchvision.transforms.ToPILImage

数据装载(将训练数据文件加载到变量)torch.utils.data.DataLoader

dataset参数:指定我们载入的数据集的名称;
batch_size参数:设置每个包中图片的数量;
shuffle:是否在装载的过程会将数据随机打乱顺序并进行打包。

data_loader_train=torch.utils.data.DataLoader(dataset=data_train,
                                       batch_size=64,#每个batch载入的图片数量,默认为1,这里设置为64
                                        shuffle=True,
                                        #num_workers=2#载入训练数据所需的子任务数
                                       ) 

将一个批次的图片构造成网格模式的图片 torchvision.utils.make_grid

#预览
#在尝试过多次之后,发现错误并不是这一句引发的,而是因为图片格式是灰度图只有一个channel,需要变成RGB图才可以,所以将其中一行做了修改:
images,labels = next(iter(data_loader_train))
# dataiter = iter(data_loader_train) #随机从训练数据中取一些数据
# images, labels = dataiter.next() 
img = torchvision.utils.make_grid(images) 
img = img.numpy().transpose(1,2,0)
std = [0.5,0.5,0.5]
mean = [0.5,0.5,0.5]
img = img*std+mean
print([labels[i] for i in range(64)])
plt.imshow(img) 

nn.Conv2d(输入通道数,输出通道数,kernel_size=3,stride=1,padding=1),
通道:一个通道即一个2维矩阵,如rgb图像有3个通道,分别是人r、g、b通道,矩阵的值是0~255彩色值。

卷积和池化 torch.nn.Conv2d,

self.conv1 = nn.Sequential(
        nn.Conv2d(3,64,kernel_size=3,stride=1,padding=1),
        nn.ReLU(),
        nn.Conv2d(64,128,kernel_size=3,stride=1,padding=1),
        nn.ReLU(),
        nn.MaxPool2d(stride=2,kernel_size=2)
        )

官方文档:CONV2D
卷积的输入输出结构:
在这里插入图片描述
官方帮助文档的参数说明:
在这里插入图片描述

全连接层 torch.nn.Linear

在这里插入图片描述

重新调整Tensor的形状

view()相当于reshape、resize,重新调整Tensor的形状。
view中一个参数定为-1,代表自动调整这个维度上的元素个数,以保证元素的总数不变。
例子:
a=tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
b=view(2,8)
b=view(4,4)
b=view(-1,2) # 其实就是view(8,2)

加载数据后如何使用数据进行for循环训练?

print(type(data_loader_train))

结果为: <class ‘torch.utils.data.dataloader.DataLoader’>
将本地的图像数据加载到变量data_loader_train后,发现数据的类型是一个类,所有信息都在类中,而不是加载成一个矩阵的形式,那么如何进行训练和使用呢??
根据以下代码我们可以发现这个数据是一个迭代器,因此可以利用迭代器把数据取出并保存成矩阵的形式,这样就可以用常规的方法进行训练了…

images, labels = next(iter(data_loader_train))

运行结果:
在这里插入图片描述

理论储备

为什么要使用批次batch

使用pytorch进行数据网络训练时,数据集可能有上万条数据,训练的话比较浪费时间,设置batch,一次训练一个batch_size的大小,既节省时间,又可以快速收敛。

python3 知识点

迭代器,迭代器对象,迭代器的元素

基本函数iter( ), next( ) :

list=[1,2,3,4]  # 列表本身是一个迭代器
it = iter(list)    # 创建迭代器对象
print (next(it))   # 输出迭代器的下一个元素

在for循环中的应用:

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

交叉熵

交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的差异性,要理解交叉熵,需要先了解下面几个概念。
通常用作衡量分类器误差,在分类问题中,如总共分3类,若网络的预测输出为[0.7,0.2,0.1],样本的真实输出为[1,0,0],可以用交叉熵计算[0.7,0.2,0.1]与[1,0,0]的误差,用以求得梯度。
详细介绍可以参考:https://blog.csdn.net/b1055077005/article/details/100152102

2维卷积

意义:特征提取
具体运算方式:
卷积核从输入的最左上方开始,从左往右、从上往下进行滑动
当滑到某一位置时,窗口中的元素与输入的对应元素相乘,然后将所有乘积的结果相加,得到当前位置的输出
在这里插入图片描述

池化pooling

意义:本质是采样达到降维压缩的麦目的,以加快运算速度。
池化过程在一般卷积过程后。池化(pooling) 的本质,其实就是采样。Pooling 对于输入的 Feature Map,选择某种方式对其进行降维压缩,以加快运算速度。Pooling 层说到底还是一个特征选择,信息过滤的过程。也就是说我们损失了一部分信息,这是一个和计算性能的一个妥协,随着运算速度的不断提高,我认为这个妥协会越来越小。现在有些网络都开始少用或者不用pooling层了。

  • 最大池化(Max Pooling)
    在这里插入图片描述
  • 平均池化(Average Pooling)
    在这里插入图片描述

填充pading

原图像没有pading的话每卷积一次,图像就会变小,卷积几次图像就会变得非常小,这并不是我们所希望的;第二点是,图像角落和边缘的像素卷积过程中被使用到的次数非常少,而其他地方的像素被多次重叠使用,丢失了边界上许多信息。所以为了解决上面两个问题,在卷积之前使用pad(填充)周边方式。
在这里插入图片描述
有了pading后可以让卷积hou的图像与原图像素大小一致
在这里插入图片描述
想要卷积后大小不变,pading的设置与卷积的步长相关:

参考文献

【1】https://blog.csdn.net/weixin_41480034/article/details/124814867
【2】https://blog.csdn.net/CltCj/article/details/120060543
【3】https://blog.csdn.net/weixin_44048809/article/details/105746351

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

深度学习入门篇1 的相关文章

  • ROS系统中编写多个C++文件时,主文件调用其它文件函数或类时出现:对“xxxxxx“未定义的引用问题记录

    问题描述 主文件对其它文件内容调用时 xff0c 明明已经正确引用相关头文件 xff0c 并确保类和函数已被定义 xff0c 仍然出现下面问题 CMakeFiles span class token operator span robot
  • 使用sklearn学习决策树(Decision Tree)

    决策树模型 决策树 xff08 decision tree xff09 是一种基本的分类与回归方法 分类决策树模型是一种描述对实例进行分类的树形结构 决策树由结点 xff08 node xff09 和有向边 xff08 directed e
  • CTeX安装及使用

    1 关于 LaTeX和CTeX quad LaTeX是一种基于 的排版系统 xff0c 由美国计算机学家莱斯利 兰伯特 xff08 Leslie Lamport xff09 在20世纪80年代初期开发 xff0c 利用这种格式 xff0c
  • 深度强化学习(7)深度确定性策略梯度(DDPG)

    深度确定性策略梯度 xff08 DDPG xff09 1 从随机策略到确定性策略 首先 xff0c 我们先了解一下随机策略和确定性策略 随机策略的公式为 xff1a a
  • 强化学习(1)马尔科夫决策过程(MDP)

    强化学习 开始强化学习之前先来了解强化学习 深度学习 深度强化学习 监督学习 无监督学习 机器学习和人工智能之间的关系 如下图 xff1a 强化学习是机器学习的一个重要分支 xff0c 它试图解决决策优化的问题 所谓决策优化 xff0c 是
  • 深度强化学习(3)Prioritized Replay DQN

    Prioritized Replay DQN 在深度强化学习 xff08 2 xff09 Double DQN 中 xff0c 我们讲到了DDQN使用两个Q网络 xff0c 用当前Q网络计算最大Q值对应的动作 xff0c 用目标Q网络计算这
  • 封装使用axios进行接口请求

    一 安装axios npm install axios在main js引入 import axios from 34 axios 34 Vue use axios vue3使用createApp App config globalPrope
  • VMware+Ubuntu20.04安装指南

    1 首先下载VMware Workstation Player 16 xff0c 下载链接为 https customerconnect vmware com en downloads all products 2 下载完成后 xff0c
  • Java8流式操作——中间操作

    文章目录 什么是中间操作 xff1f 方法实践说明一 前提条件Person类Data类 二 操作filter 过滤distinct 去重 xff08 去除集合中重复的元素 xff09 sorted 排序 sorted 无参构造 sorted
  • 数据挖掘(Data Mining)扫盲笔记

    知识框架来源 xff1a 人工智能之数据挖掘 其他补充来源 xff1a 拿下Offer 数据分析师求职面试指南 数据分析实战45讲 Data Mining 概述篇基础认知挖掘对象常见任务 xff1a 模型分类问题与挑战十大经典算法 C4 5
  • 信息论笔记(需要编辑格式)

    主要来源 xff1a 吴军 信息论40讲 信息论介绍 世界上任何一个探索者都需要清楚三件事 我们现在的位置 我们的目标 以及通向目标的道路 哲学是一门生活的艺术 它帮助我们认清自己 它回答了第一个问题 至于每一个人的目标 我相信大家比我更清
  • 阿里云短信服务使用

    说明 这是用go语言实现的 xff0c 但说实话 xff0c 其实没啥影响 xff0c 不管什么语言都是这个套路 xff0c 所以无论你是学什么语言或者是用什么语言的都好 xff0c 看看总不亏 22年7 14下午14 xff1a 38 x
  • 数据分析思维扫盲

    知识来源 xff1a 接地气学堂1 前言 行文之初衷 xff0c 建立知识树 xff0c 因而不易速读 xff0c 请君悉知 宜为工具书 xff0c 按索引取之 独学而无友 xff0c 必孤陋寡闻 xff0c 请君赐教 xff0c 不吝感激
  • 高阶用户运营体系搭建

    这里写目录标题 第1章 理解用户运营本质1 什么是 用户运营 xff1f 2 一个 用户运营 重点关注什么 xff1f 3 怎么做好用户运营 xff1f 4 高阶用户运营体系搭建5 大规模用户运营体系的3大子系统6 用户留存的归因 活跃差模
  • 商品管理-运营指挥室 看板

    商品管理可视化项目 项目目标 梳理商品管理的整体业务流程 xff0c 调研数据的使用情况 xff0c 建立影响业务的 xff1a 销量 留存 sku数 断码等维度指标 xff0c 建立智能数据监控体系 工作范围 销量看板留存看板在售SKC看
  • Excel 的进阶学习

    文章目录 Excel 的进阶学习1 常用的 Excel 函数及用途1 关联匹配类2 清洗处理类3 逻辑运算类4 计算统计类5 时间序列类 2 基础1 快捷键2 数据组错误信息基本认识计算操作符 3 数据图展示 3 实战分析注意 Excel
  • SQL

    数据库 基本概念 1 xff0e 数据 定义 xff1a 描述事物的符号序列 xff0c 数据 xff08 Data xff09 是数据库中存储的基本对象 数据的种类 xff1a 数字 文字 图形 图像声音及其他特殊符号 数据举例 xff1

随机推荐

  • MatLab-simulink组件(模块)中文名大全

    MATLAB 矩阵实验室 7 0 1 Simulink 仿真 6 1 Aerospace Blockset 太空模块 1 6 1 Bioinformatics Toolbox 生物信息工具箱 1 1 1 CDMA Reference Blo
  • 控制理论总结

    经典控制理论 xff1b 现代控制理论线性控制理论 xff1b 非线性控制理论最优控制 xff1b 预测控制 xff1b 鲁棒控制数字控制系统 xff1b 连续控制系统随动系统 xff1b 自动控制系统的分类 一 按给定信号的形式不同 xf
  • H无穷控制

    H无穷优化控制问题可归纳为 xff1a 求出一个使系统内部稳定的控制器K s xff0c 使闭环传函Tzw的无穷范数极小 LQG的弱点 xff1a 对控制的一个主要挑战使多变量控制系统设计 xff0c 因为MIMO系统的传函是一个矩阵 LQ
  • 增益调度控制

    增益调度方法在良性 Well Behaved 非线性系统中应用的比较普遍 xff0c 所谓良性非线性系统是指系统的行为特性能由一系列选定的局部线性化模型充分描述 增益调度控制方法的一个显著优点就是它能够充分利用现有的成熟的线性控制理论为非线
  • UORB讲解

    Pixhawk 飞控系统是基于ARM的四轴以上飞行器的飞行控制器 xff0c 它的前身是PX4 IMU xff0c Pixhawk 把之前的IMU进行了完整的重构 xff0c 最新版本是2 4 3 而对应的Pixhawk 1 x版本与2 x
  • gorm的Raw与scan

    gorm的Raw与scan Raw 中文 xff1a 原生的 作用 xff1a 在写gorm语句时候用来写Raw sql语句 xff08 原生sql语句 xff09 gorm官方介绍Scan https gorm io zh CN docs
  • MavLink

    2 1 MAVLink xff08 Micro Air Vehicle Link xff09 是一种用于小型无人载具的通信协议 xff0c 于2009年首次发布 该协议广泛应用于地面站 xff08 Ground Control Statio
  • 飞控接收到的每一条MAVLink消息包都会上传到uORB消息池中吗?

    1 飞控接收到的每一条MAVLink消息包都会上传到uORB消息池中吗 xff1f 2 如何自定义 xff08 选择 配置 xff09 发送给QGC的MAVLink消息 xff1f
  • 滤波、传感器融合、IMU合GPS可以测量哪些物理量

    目录 结论IMU加速度计陀螺仪GPS 原理加速度计陀螺仪GPS 传感器融合滤波算法线性互补滤波卡尔曼滤波KF扩展卡尔曼滤波EKF 小结 结论 IMU paxhawk pixhack自带的IMU xff08 惯性测量模块 xff09 包含以下
  • 学习过程中提出的疑问

    目录 如何在simulink中编译两个应用并烧录到飞控中 xff1f 如何自定义地面站QGC接收到的MAVLink消息 xff1f xff08 MAVLink inspector xff09 航点 航路生成器 xff1f 如何在simuli
  • PX4学习笔记

    目录 网址PX4 io网页指导Pixhawk PX4 APM ArduPilot关系硬件照片 示意图逻辑图 集多旋翼控制框架软件框架 辅助工具 软件 使用方法source insight新建工程 导入PX4源码source insight
  • H无穷控制理论与应用案例分析

    0 知识背景 概念 定义 内稳定 xff1a BIBO稳定 xff1a 镇定 xff1a 对于一个控制系统来说 xff0c 如果通过某种反馈可以使系统实现渐近稳定 xff0c 即闭环系统极点具有负实部 xff0c 则称该系统是能镇定的 信号
  • ADRC从入门到放弃0

    ADRC xff1a 自抗扰控制器 其中 xff0c 在对自抗扰理论的 研究中 xff0c 引入了带宽概念这一个崭新的思路 xff0c 极大的简化了自抗扰技术使用时参数整定 的问题 xff0c 同时时域分析的方法可以发现利用带宽的概念还有利
  • 直升机建模

    目录 引子tips模型的组成 引子 duck不必陷入细节 xff0c 比如坐标转换 xff0c 忽而略微小项目 tips x 表示两个向量的叉乘 模型的组成 刚体运动学 xff1a 描述平移运动与转动运动 xff0c 即位移 xff08 线
  • 模糊PID(自适应模糊PID、fuzzy PID)的基本原理及应用举例 by 研三笔记

    目录 1 控制框图2 概述3 基本原理3 1 一些基本的概念 定义3 2 模糊化3 3 模糊推理3 4 清晰化 xff08 解模糊 反模糊化 xff09 3 5 模糊PID3 6 使用 fis文件 4 利用matlab模糊控制工具箱设计模糊
  • 3d目标检测

    目录 知网论文阅读笔记关键词 key words现状 摘要 碎片知识点3D检测算法分类根据其使用的数据类型为三类 xff1a 按照点云不同的特征表达方式分类 1 xff1a 其他分类方法 1 xff1a 根据传感器分类 2 xff1a 根据
  • kex_exchange_identification: Connection closed by remote hostConnection closed by ::1 port 22

    kex exchange identification Connection closed by remote hostConnection closed by 1 port 22 缘起 拉代码仓库出错 xff0c 还挺常见 https 错
  • 基于线性矩阵不等式LMI的鲁棒H无穷控制算法设计,多性能指标的H无穷控制算法推导,多面体模型

    catalogue 关键字一些符号和特殊表示预备知识正文 xff08 一 xff09 不确定系统的数学表示 xff08 二 xff09 线性时不变定常系统的LMI稳定性定理 xff08 判据 xff09 2 1 系统模型2 2 当u 61
  • python与其他语言的不同之处--语法拾遗

    八戒你说呢 基本语法空行的使用行与缩进import 与 from import命令行参数变量的使用列表Tuple xff08 元组 xff09 Set xff08 集合 xff09 Dictionary xff08 字典 xff09 Pyt
  • 深度学习入门篇1

    1 目前流行的深度学习框架简介 深度学习框架 xff08 点击跳转 xff09 2 神经网络工具箱torch autograd与torch nn torch autograd库虽然实现了自动求导与梯度反向传播 xff0c 但如果我们要完成一