PyTorch(五)神经网络基础

news2024/10/5 19:11:55

文章目录

    • Log
  • 一、Containers 基本骨架
    • 1. Module
    • 2. Sequential
  • 二、 Convolution Layers 卷积层
    • 1. torch.nn.functional
      • ① Conv2d
    • 2. torch.nn
      • ① Conv2d
  • 三、Pooling layers 池化层
    • 1. nn.MaxPool2d 下采样(最大池化)
  • 四、Non-linear Activations 非线性激活
    • 1. ReLU
    • 2. Sigmod
  • 五、Linear Layers 线性层
    • 1. torch.nn.Linear
  • 六、Loss Functions 损失函数
    • 1. torch.nn.L1Loss
    • 2. torch.nn.MSELoss
    • 3. torch.nn.CrossEntropyLoss
  • 七、Optimizer 优化器
    • 1. 简介
    • 2. 代码示例
  • 总结


Log

2022.11.29接着开启新的一章
2022.11.30继续学习
2022.12.01继续学习
2022.12.02继续学习
2022.12.03继续学习
2022.12.04继续学习
2022.12.08继续学习
2022.12.09继续学习
2022.12.11继续学习,结束吧


  • 关于神经网络(NN,Neural Network)的工具都在 torch.nn 里面

一、Containers 基本骨架

1. Module

  • 对于所有神经网络的一个基本的类,提供一个基本骨架,所有自建的网络都需要继承该类
  • 官方文档中的示例模板代码如下:
import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):		# 类名可以改成自己的,但是必须要继承 nn.Module 类
    def __init__(self):		# 初始化函数
        super().__init__()	# 这句必须要有,调用父类的初始化函数
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):		# 前向传播函数,处理输入数据并返回处理数据部分,应该在每个子类里重写
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))
  • 自己重写的时候可以纯手写,也可以通过以下方式来进行快速的实现:

    • 选择 C o d e ⟶ G e n e r a t e \rm Code\longrightarrow Generate CodeGenerate
      在这里插入图片描述
    • 选择 O v e r r i d e    M e t h o d s \rm Override\ \ Methods Override  Methods
      在这里插入图片描述
    • 再选择要重写的函数即可:
      在这里插入图片描述
  • 改写后的示例:

import torch
from torch import nn


class MyModel(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, input):
        output = input + 1
        return output


mo = MyModel()  # 创建一个神经网络
x = torch.tensor(1.0)   # 创建数据
output = mo(x)  # 使用数据
print(output)

2. Sequential

  • 使用 Sequential 的好处是使代码变得简洁,如官方文档中的模板:
model = nn.Sequential(
          nn.Conv2d(1,20,5),
          nn.ReLU(),
          nn.Conv2d(20,64,5),
          nn.ReLU()
        )
  • 这样就使两次卷积和非线性激活的操作变得比较清晰简洁。

  • 将要实现的网络模型如下:
    在这里插入图片描述

  • 示例代码如下(其中的 paddingstride 等参数可以结合上面的图片并通过官方文档 torch.nn.Conv2d 中的 s h a p e \rm shape shape 部分的公式推算出):

import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.tensorboard import SummaryWriter


class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.model1 = Sequential(
            Conv2d(3, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, 5, padding=2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024, 64),
            Linear(64, 10)
        )

    def forward(self, x):
        x = self.model1(x)
        return x

mo = MyModel()
print(mo)
input = torch.ones((64, 3, 32, 32))
output = mo(input)
print(output.shape)

writer = SummaryWriter("logs_seq")
writer.add_graph(mo, input)
writer.close()
  • 可视化结果如下,可以通过双击其中的结点来展开查看内部的子结构:
    在这里插入图片描述

二、 Convolution Layers 卷积层

1. torch.nn.functional

  • torch.nn 是对 torch.nn.functional 的封装,因此 torch.nn.functional 中的内容会更加详细一些。

① Conv2d

  • torch.nn.functional.conv2d 常用的参数如下:
    • input:tensor 数据类型,要求形状的格式为 ( m i n i b a t c h , i n _ c h a n n e l s , i H , i W ) (minibatch,in\_channels,iH,iW) (minibatch,in_channels,iH,iW)
    • weight:权重,即卷积核
    • bias:偏置,缺省值为 None
    • stride:步径,缺省值为 1,该参数的输入可为单值,也可为元组 ( s H , s W ) (sH,sW) (sH,sW),横向和纵向
    • padding:缺省值为 0
  • 卷积操作的原理这里就不做更多介绍了,下面展示的是如何使用的代码:
import torch
import torch.nn.functional as F

input = torch.tensor([[1, 2, 0, 3, 1],
                      [0, 1, 2, 3, 1],
                      [1, 2, 1, 0, 0],
                      [5, 2, 3, 1, 1],
                      [2, 1, 0, 1, 1]])

kernel = torch.tensor([[1, 2, 1],
                       [0, 1, 0],
                       [2, 1, 0]])

input = torch.reshape(input, (1, 1, 5, 5))  # 1 batch_size, 1 通道, 5×5大小
kernel = torch.reshape(kernel, (1, 1, 3, 3))

print(input.shape)  # 原大小为[5, 5],reshape后大小为[1, 1, 5, 5]
print(kernel.shape)  # 原大小为[3, 3],reshape后大小为[1, 1, 3, 3]

output = F.conv2d(input, kernel, stride=1)      # 步长为 1
print(output)

output2 = F.conv2d(input, kernel, stride=2)      # 步长为 2
print(output2)

output3 = F.conv2d(input, kernel, stride=1, padding=1)      # padding是对图像边缘的填充
print(output3)

2. torch.nn

① Conv2d

  • torch.nn.conv2d 常用的参数如下:
    • in_channels:输入通道数,彩色图像一般为 3
    • out_channels:输出通道数
    • kernel_size:卷积核大小
    • stride:步径,缺省值为 1,该参数的输入可为单值,也可为元组 ( s H , s W ) (sH,sW) (sH,sW),纵向和横向
    • padding:缺省值为 0
    • dilation:卷积核每个对应位的距离,缺省值为 1
    • groups:缺省值为 1 ,一般情况不会用到,只在分组卷积时才会用到
    • bias:偏置,缺省值为 True,即在最后的结果上加减一个常数
    • padding_mode:缺省值为’zero’,padding 填充时会用到,选择 padding 的填充模式
  • 对于上面的概念比较模糊,可以看看这个可视化的图像来进一步理解:
    在这里插入图片描述
  • 仍然使用 C I F A R 10 \rm CIFAR10 CIFAR10 数据集,代码示例如下:
import torch
import torchvision
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10("../dataset/CIFAR10", train=False, transform=torchvision.transforms.ToTensor(),
                                       download=True)
dataloader = DataLoader(dataset, batch_size=64)

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)

    def forward(self, x):
        x = self.conv1(x)
        return x

mo = MyModel()

writer = SummaryWriter("logs")

step = 0
for data in dataloader:
    imgs, targets = data
    output = mo(imgs)
    print(imgs.shape)
    print(output.shape)
    # torch.Size([64, 3, 32, 32])
    writer.add_images("input", imgs, step)
    # torch.Size([64, 6, 30, 30])  -> [xxx, 3, 30, 30]

    output = torch.reshape(output, (-1, 3, 30, 30))
    writer.add_images("output", output, step)

    step = step + 1
  • t e n s o r b o a r d tensorboard tensorboard 中的结果如下:
    在这里插入图片描述

三、Pooling layers 池化层

1. nn.MaxPool2d 下采样(最大池化)

  • 与之相对应的还有 nn.MaxUnpool2d 上采样。
  • torch.nn.MaxPool2d 常用的参数如下:
    • kernel_size:卷积核大小

    • stride:步径,缺省值为卷积核大小

    • padding:缺省值为 0

    • dilation:卷积核每个对应位的距离,缺省值为 1,示意图如下:
      在这里插入图片描述

    • return_indices :缺省值为 False,用得较少

    • ceil_mode :缺省值为 False,使用 floor 模式,当值为 True 时使用 ciel 模式,和卷积核相乘时选中的图像的大小小于卷积核大小时进行保留。

  • 输入和输出的数据都是四维的,示例代码如下:
from torch import nn
from torch.nn import MaxPool2d

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True)

    def forward(self, input):
        output = self.maxpool1(input)
        return output

input = torch.tensor([[1, 2, 0, 3, 1],
                      [0, 1, 2, 3, 1],
                      [1, 2, 1, 0, 0],
                      [5, 2, 3, 1, 1],
                      [2, 1, 0, 1, 1]], dtype=torch.float32)

input = torch.reshape(input, (-1, 1, 5, 5))
print(input.shape)
mo = MyModel()
output = mo(input)
print(output)
  • 最大池化的作用就是降低数据的维度,减少数据量,提高网络的训练速度,就相当于看视频从 1080p 到 720p,传达的内容没有受到太大的影响,但是视频文件的大小却大大减少。
  • 处理图片的代码示例:
import torch
import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=False)

    def forward(self, input):
        output = self.maxpool1(input)
        return output

dataset = torchvision.datasets.CIFAR10("../dataset/CIFAR10", train=False, download=True,
                                       transform=torchvision.transforms.ToTensor())

dataloader = DataLoader(dataset, batch_size=64)
mo = MyModel()
writer = SummaryWriter("logs_maxpool")
step = 0

for data in dataloader:
    imgs, targets = data
    writer.add_images("inputMP", imgs, step)
    output = mo(imgs)
    writer.add_images("outputMP", output, step)
    step = step + 1

writer.close()
  • 运行结果如下:
    在这里插入图片描述

四、Non-linear Activations 非线性激活

  • 非线性激活是为了为我们的神经网络中引入一些非线性的特质,非线性越多的话就越容易训练出符合各种特征的模型,得到更好的泛化能力。

1. ReLU

在这里插入图片描述

  • 该类实现功能如下:
    R e L U ( x ) = ( x ) + = m a x ( 0 , x ) \rm ReLU(x)=(x)^+=max(0,x) ReLU(x)=(x)+=max(0,x)
  • 当输入小于 0 时会被截断
  • 在定义时有一个参数为 implace,缺省值为 False,作用是是否替换输入,即当该参数为 True 时,输入数据在处理换之后会被处理结果所替代。一般不填此参数,即保留原数据防止信息的丢失。
  • 示例代码如下:
import torch
from torch import nn
from torch.nn import ReLU

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.relu1 = ReLU()

    def forward(self, input):
        output = self.relu1(input)
        return output

input = torch.tensor([[1, -0.5],
                      [-1, 3]])

input = torch.reshape(input, (-1, 1, 2, 2))
print(input.shape)
mo = MyModel()
output = mo(input)
print(output)

2. Sigmod

  • 都懂,原理略
  • 示例代码如下:
import torch
import torchvision
from torch import nn
from torch.nn import ReLU, Sigmoid
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.relu1 = ReLU()
        self.sigmoid1 = Sigmoid()

    def forward(self, input):
        output = self.sigmoid1(input)
        return output

dataset = torchvision.datasets.CIFAR10("../dataset/CIFAR10", train=False, download=True,
                                       transform=torchvision.transforms.ToTensor())

dataloader = DataLoader(dataset, batch_size=64)

mo = MyModel()

writer = SummaryWriter("logs_sig")
step = 0
for data in dataloader:
    imgs, targets = data
    writer.add_images("inputSig", imgs, global_step=step)
    output = mo(imgs)
    writer.add_images("outputSig", output, step)
    step += 1

writer.close()
  • 运行结果如下:
    在这里插入图片描述

五、Linear Layers 线性层

1. torch.nn.Linear

  • 对输入应用如下的线性变换:
    y = x A T + b y=xA^T+b y=xAT+b
  • torch.nn.Linear 的参数如下:
    • in_features :输入特征数
    • out_features :输出特征数
    • bias :偏置,即上面公式中的 b,缺省值为 True
  • 示例代码如下:
import torch
import torchvision
from torch import nn
from torch.nn import Linear
from torch.utils.data import DataLoader

dataset = torchvision.datasets.CIFAR10("../dataset/CIFAR10", train=False, transform=torchvision.transforms.ToTensor(),
                                       download=True)

dataloader = DataLoader(dataset, batch_size=64)

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.linear1 = Linear(196608, 10)

    def forward(self, input):
        output = self.linear1(input)
        return output

mo = MyModel()

for data in dataloader:
    imgs, targets = data
    print(imgs.shape)
    # flatten 把图像展平的函数,输入的图像为 Tensor 类型
    output = torch.flatten(imgs)
    print(output.shape)
    output = mo(output)
    print(output.shape)
  • 其中 flatten 为将图像展平的函数。

六、Loss Functions 损失函数

  • 损失函数的作用:
    • 计算实际输出和目标之间的差距
    • 为我们更新输出提供一定的依据(反向传播)

1. torch.nn.L1Loss

  • torch.nn.L1Loss使用的示例代码如下:
import torch
from torch.nn import L1Loss

inputs = torch.tensor([1, 2, 3], dtype=torch.float32)
targets = torch.tensor([1, 2, 5], dtype=torch.float32)

inputs = torch.reshape(inputs, (1, 1, 1, 3))
targets = torch.reshape(targets, (1, 1, 1, 3))
# mean(Defalt): (0+0+2)/3 = 0.667
# sum: 0 + 0 + 2 = 2
loss = L1Loss(reduction='sum')
result = loss(inputs, targets)

print(result)
  • 其中参数 reduction 的默认值是 mean,即求平均,对于代码中的例子,对应位置作差后取平均值得到的结果为 0.667,设置参数值为 sum 后达到的结果为 2。

2. torch.nn.MSELoss

  • 平方差(MSE,mean squared error)损失 torch.nn.MSELoss 的示例代码如下:
import torch
from torch import nn

inputs = torch.tensor([1, 2, 3], dtype=torch.float32)
targets = torch.tensor([1, 2, 5], dtype=torch.float32)

inputs = torch.reshape(inputs, (1, 1, 1, 3))
targets = torch.reshape(targets, (1, 1, 1, 3))
# (0+0+0+2**2)/3 = 1.3333
loss_mse = nn.MSELoss()
result_mse = loss_mse(inputs, targets)

print(result_mse)

3. torch.nn.CrossEntropyLoss

  • 交叉熵损失 torch.nn.CrossEntropyLoss (可以到这个官方文档中查看具体的公式以及说明)的示例代码如下:
import torch
from torch import nn

x = torch.tensor([0.1, 0.2, 0.3])
y = torch.tensor([1])
x = torch.reshape(x, (1, 3))
loss_cross = nn.CrossEntropyLoss()
# -0.2+ln(exp(0.1)+exp(0.2)+exp(0.3))
result_cross = loss_cross(x, y)
print(result_cross)
  • 在网络中使用该类(复用之前 Sequential 中的网络代码):
import torchvision
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader

dataset = torchvision.datasets.CIFAR10("../dataset/CIFAR10", train=False, transform=torchvision.transforms.ToTensor(),
                                       download=True)

dataloader = DataLoader(dataset, batch_size=1)

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.model1 = Sequential(
            Conv2d(3, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, 5, padding=2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024, 64),
            Linear(64, 10)
        )

    def forward(self, x):
        x = self.model1(x)
        return x


loss = nn.CrossEntropyLoss()
mo = MyModel()
for data in dataloader:
    imgs, targets = data
    outputs = mo(imgs)
    # print(outputs)
    # print(targets)
    result_loss = loss(outputs, targets)
    print(result_loss)
    # 反向传播计算梯度
    result_loss.backward()

七、Optimizer 优化器

  • 利用上一个章节中的反向传播计算出的梯度,使用优化器(torch.optim)对参数进行调整,进而实现误差降低的目的。

1. 简介

  • 优化器的使用步骤:
    1. 构造优化器
      例如:optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
      选择一个优化器对应的算法,然后在优化器中放入优化的参数、学习速率(LR)以及不同算法需要的特定的参数。
    2. 调用 step() 方法
      利用之前得到的梯度对参数进行更新

2. 代码示例

  • 使用随机梯度下降算法和上一章节的网络进行的计算,要点都写在代码的注释里了:
import torch
import torchvision
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader

# 使用数据集并转成 tensor 数据类型
dataset = torchvision.datasets.CIFAR10("../dataset/CIFAR10", train=False, transform=torchvision.transforms.ToTensor(),
                                       download=True)
# 使用 DataLoader 加载数据集
dataloader = DataLoader(dataset, batch_size=1)

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.model1 = Sequential(
            Conv2d(3, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, 5, padding=2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024, 64),
            Linear(64, 10)
        )

    def forward(self, x):
        x = self.model1(x)
        return x


loss = nn.CrossEntropyLoss()
mo = MyModel()
# 使用随机梯度下降算法(SGD)
optim = torch.optim.SGD(mo.parameters(), lr=0.01)
# 进行 20 轮循环
for epoch in range(20):
    # 每一轮的整体 loss
    running_loss = 0.0
    for data in dataloader:
        imgs, targets = data
        outputs = mo(imgs)
        result_loss = loss(outputs, targets)
        # 梯度清零,防止对下一轮循环产生影响
        optim.zero_grad()
        # 反向传播得到梯度
        result_loss.backward()
        # 对参数调优
        optim.step()
        print(result_loss)
        running_loss = running_loss + result_loss
    print(running_loss)


总结

  • 本篇文章主要介绍了 P y t o r c h \rm Pytorch Pytorchtorch.nn 有关神经网络的相关内容,包括其中的相关模块的使用方法。
  • 容器(Containers) 中介绍了 torch.nn.Module,它是所有神经网络的一个基本的类,提供一个基本骨架,所有自建的网络都需要继承该类;同时还介绍了 torch.nn.Sequential,它的作用是整合不同的操作,使代码变得简洁。
  • 卷积层(Convolution Layers) 中介绍了 torch.nn.functionaltorch.nn 中的 Conv2d 类,torch.nn 是对 torch.nn.functional 的封装,因此 torch.nn.functional 中的内容会更加详细一些。
  • 池化层(Pooling layers) 中介绍了 nn.MaxPool2d 下采样(最大池化),它的作用就是降低数据的维度,减少数据量,提高网络的训练速度。
  • 非线性激活(Non-linear Activations) 中介绍了 ReLU 以及 Sigmod 的使用,非线性激活是为了为我们的神经网络中引入一些非线性的特质,非线性越多的话就越容易训练出符合各种特征的模型,得到更好的泛化能力。
  • 线性层(Linear Layers) 中介绍了 torch.nn.Linear,作用是进行线性变换。
  • 损失函数(Loss Functions) 中介绍了 L1LossMSELossCrossEntropyLoss三种损失函数的使用方法。
  • 最后还介绍了优化器(Optimizer),它的作用是利用反向传播计算出的梯度对参数进行调整,进而实现误差降低的目的。

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

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

相关文章

2022CCSP T1最少充电次数

记录第一次CCSP竞赛。一共3题,只做出第一题,用时3h30m(累),ac了开心地吃了个午饭。然而饭饱之后,大脑完全提不起神看着题面昏昏欲睡。第二题是虚拟内存,超级大模拟,刚好这个学期学os…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java流浪动物救助网站a1wsz

毕业设计也不需要做多高端的程序,毕业设计对于大多数同学来说,为什么感觉到难,最重要的一个原因,那就是理论课到实践课的转变,很多人一下不适应,本能开始拒绝,如果是一个考试,大家都…

ITU、MCC和MNC介绍以及China运营商对照表

相关概念 ITU 国际电信联盟是联合国负责信息通信技术(ICT)事务的专门机构。 国际电联成立于1865年,为了促进国际上通信网络的互联互通。他们进行全球无线电频谱和卫星轨道的划分,制定技术标准以确保实现网络和技术的无缝互连&…

【Docker】30条Docker常用命令图文举例总结

本期目录1. 帮助启动类命令2. 镜像命令2.1 列出镜像2.2 搜索远程库镜像2.3 拉取镜像2.4 查看所占空间2.5 删除镜像2.6 面试题3. 容器命令3.1 新建启动容器1)启动交互式容器3.2 列出当前所有正在运行的容器3.3 退出容器3.4 启动已停止的容器3.5 重启容器3.6 停止容器…

第六章 映射:Mappings

文章目录1、Mapping 简介1.1 mapping 是啥?1.2 如何查看索引映射2、自动映射:dynamic mapping2.1 自动类型推断规则2.2 mapping 的使用禁忌2.3 自动映射器的意义是什么?3、手动映射:Explicit mapping3.1 创建索引的 mapping3.2 修…

电子产品量产工具项目开发中遇到的问题(更新......)

1、找不到tslib.h库的头文件 这是因为找不到tslib库的头文件。 确定工具链中头文件、库文件目录,对于 IMX6ULL ,命令如下 echo main(){}| arm-linux-gnueabihf-gcc -E -v -找到了编译器arm-linux-gnueabihf的include和lib文件夹 /usr/local/arm/gcc-l…

AT155 高压绝缘电阻测试仪 都有哪些功能?

、 高压绝缘电阻测试仪是—款手持式仪表主要用来测量交流/直流电压、 电阻、 短路蜂鸣测试和 绝缘电阻测量。 式高压绝缘电阻测试仪具有4个量程用千绝缘电阻、 AC/DC电压、 电阻和短路蜂鸣测试。 设计达到以下安全标准 .绝缘测试量程O.lMn to 60Gn。…

机器学习 决策树基础 ID3、C4.5、CART

文章目录参考决策树指标基尼系数基础公式公式理解引入划分后的公式划分后公式的理解信息熵、信息增益如何理解信息熵两种指标的对比划分策略ID3定义举例计算各属性的信息增益选取最优属性作划分对子节点作递归划分生成结果ID3的缺点C4.5信息增益率优化缺点CARTCART相较于前两者…

Windows下使用C语言创建定时器并周期和网络调试助手通信

在Windows C下采用timeSetEvent函数来设置定时器 关于timeSetEvent的函数原型及注释如下所示: MMRESULT timeSetEvent(UINT uDelay, // 定时事件的触发周期,单位为毫秒UINT uResolution, // 定时事件的精度,单位…

161-183-mysql-高级篇-事务-锁-mvcc

116-mysql-事务篇-锁: 推荐网站 mysql学习网站:https://www.bilibili.com/video/BV1iq4y1u7vj?p109&vd_source39a1ba1654411bc9ab90f6f2926600b7 mysql:https://dev.mysql.com/doc/refman/8.0/en/ 算法:https://www.cs.us…

我看世界杯——来自一个“假”球迷视角

世界杯还有一个星期就要结束了,说实话,我之前是一场球都没有,对足球知道也甚少,妥妥一个假球迷了。这次世界杯感觉离自己特别近,身边的很多朋友都在看,也不乏赌球的小伙伴,自己的感悟也比较深&a…

电机定子模态的空间特征

对于电机定子模态而言,通常不是按传统的阶次顺序(按频率从小到大)来描述它们,而是按空间节点数的顺序来描述,这在很大程度上是因为受激励的电磁力波的振型的影响。 1、传统模态阶次表示方式 传统模态阶次的顺序都是按…

安卓期末大作业——个人简历APP源码和设计报告

Android课程需求文档 设计题目: 个人简历APP 学生姓名: 学号: 1.Smart.apk功能设计说明 Android真机运行进入该app。背景音乐服务播放正常,并设置可通过右上角按钮关闭musicservice; 1通过viewpager实…

Jenkins+SonarQube 代码质量检测详解

一、SonarQube 概述 1、SonarQube 简介 Sonar Qube是一个开源的代码分析平台,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。 Sonar Qube通过插件机制,Sonar可以集成不同的测试工具,代码分析工具…

【JavaWeb开发-Servlet】将项目打包部署在本地

Servlet与JSP进阶十:Web应用程序打包与发布(war包)_小枯林的博客-CSDN博客_servlet项目如何打成war包本篇博客主要内容是: ●如何使用Eclipse打war包; ●打好的war包如何发布;访问演示; ●解决u…

如何使用ChatGPT辅助AI绘画?

如何使用ChatGPT辅助AI绘画? AI自动化内容生成(AIGC)是一种利用人工智能技术生成新内容的方法。它可以快速、自动、准确地从大量原始数据中生成新内容,大大提高了内容创作效率。AIGC 使用机器学习算法,自动识别文本特…

【MySQL】触发器

目录 概述 操作-创建触发器 操作-NEW与OLD 其他操作 注意事项 概述 介绍 触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据 库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执…

微信小程序|前端技术主要框架分析

1.框架 微信提供了一套自己的用于开发小程序的前端框架,和目前主流的前端框架相比,其既有类似的地方,也有特殊的地方。 特殊的地方在于其只能在微信小程序开发工具内使用,并做了相对严格的使用和配置限制,开发者必须按照其规定的用法来使用。一些外部的框架和插件在小程…

apis-day7综合案例

apis-day7综合案例-小兔鲜案例注册 需求①: 发送验证码 用户点击之后,显示 05秒后重新获取 时间到了,自动改为 重新获取 需求②: 用户名验证(注意封装函数 verifyxxx) 正则 /1{6,10}$/ 如果不符合要求…

非零基础自学Golang 第1章 走进Go 1.1 Go编程语言概述 1.1.3 使用Go 语言的项目

非零基础自学Golang 文章目录非零基础自学Golang第1章 走进Go1.1 Go编程语言概述1.1.3 使用Go 语言的项目第1章 走进Go 1.1 Go编程语言概述 1.1.3 使用Go 语言的项目 Go语言在2009年首次公开发布后受到越来越多的开发者的关注,Go语言社区不断壮大,开源…