pytorch-模型训练常用的torchvision包。关于数据、模型、数据增强、优化器、损失函数。用官方的实现,自定义模型训练

news2025/1/8 4:40:53

pytoch关于图像数据的部分

  • 一般情况下处理图像、文本、音频和视频数据时,可以使用标准的Python包来加载数据到一个numpy数组中。 然后把这个数组转换成 torch.*Tensor

    • 图像可以使用 Pillow, OpenCV

    • 音频可以使用 scipy, librosa

    • 文本可以使用原始Python和Cython来加载,或者使用 NLTK或 SpaCy 处理

  • 特别的,对于图像任务,创建了一个包 torchvision,它包含了处理一些基本图像数据集的方法。这些数据集包括 Imagenet, CIFAR10, MNIST 等。除了数据加载以外,torchvision 还包含了图像转换器, torchvision.datasetstorch.utils.data.DataLoader

  • 本文使用CIFAR10数据集,它有如下10个类别 :‘airplane’, ‘automobile’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’。CIFAR-10的图像都是 3x32x32大小的,即,3颜色通道,32x32像素。

训练一个图像分类器

    1. 使用torchvision加载和归一化CIFAR10训练集和测试集
    2. 定义一个卷积神经网络
    3. 定义损失函数
    4. 在训练集上训练网络
    5. 在测试集上测试网络
  • 读取和归一化 CIFAR10,使用torchvision可以非常容易地加载CIFAR10。

    • import torch
      import torchvision
      import torchvision.transforms as transforms
      transform = transforms.Compose(
          [transforms.ToTensor(),
           transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
      trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                              download=True, transform=transform)
      trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                                shuffle=True, num_workers=2)
      testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                             download=True, transform=transform)
      testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                               shuffle=False, num_workers=2)
      classes = ('plane', 'car', 'bird', 'cat',
                 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
      print(trainset,len(trainset),testset,len(testset))
      
    • Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data\cifar-10-python.tar.gz
      100.0%
      Extracting ./data\cifar-10-python.tar.gz to ./data
      Files already downloaded and verified
      Dataset CIFAR10
          Number of datapoints: 50000
          Root location: ./data
          Split: Train
          StandardTransform
      Transform: Compose(
                     ToTensor()
                     Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
                 ) 50000 Dataset CIFAR10
          Number of datapoints: 10000
          Root location: ./data
          Split: Test
          StandardTransform
      Transform: Compose(
                     ToTensor()
                     Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
                 ) 10000
      
  • 展示一些训练图像。

    • import matplotlib.pyplot as plt
      import numpy as np
      # 展示图像的函数
      def imshow(img):
          img = img / 2 + 0.5     # unnormalize
          npimg = img.numpy()
          plt.imshow(np.transpose(npimg, (1, 2, 0)))
      # 获取随机数据
      dataiter = iter(trainloader)
      images, labels = next(dataiter)
      # 展示图像
      imshow(torchvision.utils.make_grid(images))
      # 显示图像标签
      print(' '.join('%5s' % classes[labels[j]] for j in range(4)))
      
    • 在这里插入图片描述

定义一个卷积神经网络

  • 将上文的LeNet5模型修改一下输出接收的图像为3通道的RGB图像

  • import torch.nn as nn
    import torch.nn.functional as F
    class Net(nn.Module):
        def __init__(self):
            super(Net, self).__init__()
            self.conv1 = nn.Conv2d(3, 6, 5)
            self.pool = nn.MaxPool2d(2, 2)
            self.conv2 = nn.Conv2d(6, 16, 5)
            self.fc1 = nn.Linear(16 * 5 * 5, 120)
            self.fc2 = nn.Linear(120, 84)
            self.fc3 = nn.Linear(84, 10)
        def forward(self, x):
            x = self.pool(F.relu(self.conv1(x)))
            x = self.pool(F.relu(self.conv2(x)))
            x = x.view(-1, 16 * 5 * 5)
            x = F.relu(self.fc1(x))
            x = F.relu(self.fc2(x))
            x = self.fc3(x)
            return x
    net = Net()
    print(net)
    
  • Net(
      (conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
      (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
      (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
      (fc1): Linear(in_features=400, out_features=120, bias=True)
      (fc2): Linear(in_features=120, out_features=84, bias=True)
      (fc3): Linear(in_features=84, out_features=10, bias=True)
    )
    

定义损失函数和优化器

  • 使用交叉熵作为损失函数,使用带动量的随机梯度下降。

  • import torch.optim as optim
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
    print(criterion)
    print(optimizer)
    
  • CrossEntropyLoss()
    SGD (
    Parameter Group 0
        dampening: 0
        differentiable: False
        foreach: None
        lr: 0.001
        maximize: False
        momentum: 0.9
        nesterov: False
        weight_decay: 0
    )
    

训练深度学习模型

  • 只需在数据迭代器上循环,将数据输入给网络,并优化。

  • for epoch in range(10):  # 多批次循环
        running_loss = 0.0
        for i, data in enumerate(trainloader, 0):
            # 获取输入
            inputs, labels = data
            # 梯度置0
            optimizer.zero_grad()
            # 正向传播,反向传播,优化
            outputs = net(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            # 打印状态信息
            running_loss += loss.item()
            if i % 2000 == 1999:    # 每2000批次打印一次
                print('[%d, %5d] loss: %.3f' %
                      (epoch + 1, i + 1, running_loss / 2000))
                running_loss = 0.0
    print('Finished Training')
    
  • [1,  2000] loss: 2.199
    [1,  4000] loss: 1.879
    [1,  6000] loss: 1.682
    [1,  8000] loss: 1.567
    [1, 10000] loss: 1.533
    [1, 12000] loss: 1.460
    [2,  2000] loss: 1.366
    [2,  4000] loss: 1.390
    [2,  6000] loss: 1.335
    [2,  8000] loss: 1.300
    [2, 10000] loss: 1.273
    [2, 12000] loss: 1.248
    [3,  2000] loss: 1.199
    [3,  4000] loss: 1.177
    [3,  6000] loss: 1.157
    [3,  8000] loss: 1.161
    [3, 10000] loss: 1.158
    [3, 12000] loss: 1.124
    [4,  2000] loss: 1.075
    [4,  4000] loss: 1.056
    [4,  6000] loss: 1.064
    [4,  8000] loss: 1.073
    [4, 10000] loss: 1.077
    [4, 12000] loss: 1.072
    [5,  2000] loss: 0.982
    [5,  4000] loss: 0.979
    [5,  6000] loss: 1.005
    [5,  8000] loss: 1.013
    [5, 10000] loss: 1.022
    [5, 12000] loss: 0.996
    [6,  2000] loss: 0.924
    [6,  4000] loss: 0.947
    [6,  6000] loss: 0.957
    [6,  8000] loss: 0.934
    [6, 10000] loss: 0.965
    [6, 12000] loss: 0.960
    [7,  2000] loss: 0.864
    [7,  4000] loss: 0.896
    [7,  6000] loss: 0.907
    [7,  8000] loss: 0.904
    [7, 10000] loss: 0.916
    [7, 12000] loss: 0.936
    [8,  2000] loss: 0.835
    [8,  4000] loss: 0.847
    [8,  6000] loss: 0.881
    [8,  8000] loss: 0.885
    [8, 10000] loss: 0.875
    [8, 12000] loss: 0.871
    [9,  2000] loss: 0.747
    [9,  4000] loss: 0.830
    [9,  6000] loss: 0.817
    [9,  8000] loss: 0.874
    [9, 10000] loss: 0.857
    [9, 12000] loss: 0.851
    [10,  2000] loss: 0.747
    [10,  4000] loss: 0.788
    [10,  6000] loss: 0.821
    [10,  8000] loss: 0.801
    [10, 10000] loss: 0.827
    [10, 12000] loss: 0.850
    Finished Training
    

在测试集上测试网络

  • 在整个训练集上进行了10次训练,但是我们需要检查网络是否从数据集中学习到有用的东西。 通过预测神经网络输出的类别标签与实际情况标签进行对比来进行检测。 如果预测正确,我们把该样本添加到正确预测列表。 第一步,显示测试集中的图片并熟悉图片内容。

  • dataiter = iter(testloader)
    images, labels =next(dataiter) 
    # 显示图片
    imshow(torchvision.utils.make_grid(images))
    print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))
    
  • 在这里插入图片描述

  • outputs = net(images)
    _, predicted = torch.max(outputs, 1)
    imshow(torchvision.utils.make_grid(images))
    print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]for j in range(4)))
    
  • Predicted:   frog   car  ship plane
    
  • 接下来让看看网络在整个测试集上的结果如何。

  • correct = 0
    total = 0
    with torch.no_grad():
        for data in testloader:
            images, labels = data
            outputs = net(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))
    
  • Accuracy of the network on the 10000 test images: 63 %
    
  • 结果看起来不错,至少比随机选择要好,随机选择的正确率为10%。 似乎网络学习到了一些东西。在识别哪一个类的时候好,哪一个不好呢?

  • class_correct = list(0. for i in range(10))
    class_total = list(0. for i in range(10))
    with torch.no_grad():
        for data in testloader:
            images, labels = data
            outputs = net(images)
            _, predicted = torch.max(outputs, 1)
            c = (predicted == labels).squeeze()
            for i in range(4):
                label = labels[i]
                class_correct[label] += c[i].item()
                class_total[label] += 1
    for i in range(10):
        print('Accuracy of %5s : %2d %%' % (
            classes[i], 100 * class_correct[i] / class_total[i]))
    
  • Accuracy of plane : 69 %
    Accuracy of   car : 74 %
    Accuracy of  bird : 44 %
    Accuracy of   cat : 37 %
    Accuracy of  deer : 62 %
    Accuracy of   dog : 55 %
    Accuracy of  frog : 70 %
    Accuracy of horse : 69 %
    Accuracy of  ship : 76 %
    Accuracy of truck : 78 %
    

在GPU上训练

  • 把一个神经网络移动到GPU上训练就像把一个Tensor转换GPU上一样简单。并且这个操作会递归遍历有所模块,并将其参数和缓冲区转换为CUDA张量。

  • device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    # 确认我们的电脑支持CUDA,然后显示CUDA信息:
    print(device)
    
  • cpu
    
  • 所以本机cuda不可用,后面的实验就不做了。Multi-GPU Examples — PyTorch Tutorials 1.13.1+cu117 documentation

PyTorch 基础 :数据的加载和预处理

  • PyTorch通过torch.utils.data对一般常用的数据加载进行了封装,可以很容易地实现多线程数据预读和批量加载。 并且torchvision已经预先实现了常用图像数据集,包括前面使用过的CIFAR-10,ImageNet、COCO、MNIST、LSUN等数据集,可通过torchvision.datasets方便的调用

  • Dataset

    • Dataset是一个抽象类,为了能够方便的读取,需要将要使用的数据包装为Dataset类。 自定义的Dataset需要继承它并且实现两个成员方法:

        1. __getitem__() 该方法定义用索引(0len(self))获取一条数据或一个样本
        1. __len__() 该方法返回数据集的总长度
    • 下面我们使用kaggle上的一个竞赛bluebook for bulldozers自定义一个数据集,为了方便介绍,我们使用里面的数据字典来做说明(因为条数少)

    • from torch.utils.data import Dataset
      import pandas as pd
      #定义一个数据集
      class BulldozerDataset(Dataset):
          """ 数据集演示 """
          def __init__(self, csv_file):
              """实现初始化方法,在初始化的时候将数据读载入"""
              self.df=pd.read_csv(csv_file)
          def __len__(self):
              ''' 返回df的长度'''
              return len(self.df)
          def __getitem__(self, idx):
              '''根据 idx 返回一行数据'''
              return self.df.iloc[idx].SalePrice
      ds_demo= BulldozerDataset('./bluebook-for-bulldozers/median_benchmark.csv')
      print(ds_demo,len(ds_demo))
      #用索引可以直接访问对应的数据,对应 __getitem__ 方法
      print(ds_demo[0])o,len(ds_demo))
      
    • <__main__.BulldozerDataset object at 0x00000271406178E0> 11573
      24000.0
      
    • 自定义的数据集已经创建好了,下面我们使用官方提供的数据载入器,读取数据

Dataloader

  • DataLoader为我们提供了对Dataset的读取操作,常用参数有:batch_size(每个batch的大小)、 shuffle(是否进行shuffle操作)、 num_workers(加载数据的时候使用几个子进程)。下面做一个简单的操作

  • import torch
    dl = torch.utils.data.DataLoader(ds_demo, batch_size=10, shuffle=True, num_workers=0)
    idata=iter(dl)
    print(next(idata))
    
  • tensor([24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000.,
            24000.], dtype=torch.float64)
    
  • 常见的用法是使用for循环对其进行遍历

  • for i, data in enumerate(dl):
        print(i,data)
        if i > 5:
            break
    
  • 0 tensor([24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000.,
            24000.], dtype=torch.float64)
    1 tensor([24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000.,
            24000.], dtype=torch.float64)
    2 tensor([24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000.,
            24000.], dtype=torch.float64)
    3 tensor([24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000.,
            24000.], dtype=torch.float64)
    4 tensor([24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000.,
            24000.], dtype=torch.float64)
    5 tensor([24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000.,
            24000.], dtype=torch.float64)
    6 tensor([24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000.,
            24000.], dtype=torch.float64)
    
  • 已经可以通过dataset定义数据集,并使用Datalorder载入和遍历数据集,除了这些以外,PyTorch还提供能torcvision的计算机视觉扩展包,里面封装了

torchvision 包

  • torchvision 是PyTorch中专门用来处理图像的库,PyTorch官网的安装教程中最后的pip install torchvision 就是安装这个包。

  • torchvision.datasets 可以理解为PyTorch团队自定义的dataset,这些dataset帮我们提前处理好了很多的图片数据集,我们拿来就可以直接使用: - MNIST - COCO - Captions - Detection - LSUN - ImageFolder - Imagenet-12 - CIFAR - STL10 - SVHN - PhotoTour 我们可以直接使用,示例如下:

  • import torchvision.datasets as datasets
    trainset = datasets.MNIST(root='./data', # 表示 MNIST 数据的加载的目录
                                          train=True,  # 表示是否加载数据库的训练集,false的时候加载测试集
                                          download=True, # 表示是否自动下载 MNIST 数据集
                                          transform=None) # 表示是否需要对数据进行预处理,none为不进行预处理
    
  • torchvision不仅提供了常用图片数据集,还提供了训练好的模型,可以加载之后,直接使用,或者在进行迁移学习 torchvision.models模块的 子模块中包含以下模型结构。 - AlexNet - VGG - ResNet - SqueezeNet - DenseNet

  • #我们直接可以使用训练好的模型,当然这个与datasets相同,都是需要从服务器下载的
    import torchvision.models as models
    resnet18 = models.resnet18(pretrained=True)
    
  • transforms 模块提供了一般的图像转换操作类,用作数据处理和数据增强

  • from torchvision import transforms as transforms
    transform = transforms.Compose([
        transforms.RandomCrop(32, padding=4),  #先四周填充0,在把图像随机裁剪成32*32
        transforms.RandomHorizontalFlip(),  #图像一半的概率翻转,一半的概率不翻转
        transforms.RandomRotation((-45,45)), #随机旋转
        transforms.ToTensor(),
        transforms.Normalize((0.4914, 0.4822, 0.4465), (0.229, 0.224, 0.225)), #R,G,B每层的归一化用到的均值和方差
    ])
    
  • (0.485, 0.456, 0.406), (0.2023, 0.1994, 0.2010) 这几个数字是官方的这个帖子有详细的说明: https://discuss.pytorch.org/t/normalization-in-the-mnist-example/457/21 这些都是根据ImageNet训练的归一化参数,可以直接使用,我们认为这个是固定值就可以.

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

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

相关文章

3D立体视觉成像原理介绍【一 】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言什么是基线&#xff1f;基线是如何影响3D图像质量激光三角测量飞行时间结构光相机时间编码结构光前言 本文将介绍3D立体视觉的成像原理&#xff0c;包括【激光三…

【JUC2022】第五章 ThreadLocal

【JUC2022】第五章 ThreadLocal 文章目录【JUC2022】第五章 ThreadLocal一、是什么二、案例三、使用规范四、源码分析五、内存泄漏问题六、实际应用 Demo一、是什么 ThreadLocal 提供线程局部变量&#xff0c;这些变量与正常的变量不同&#xff0c;因为每一个线程在访问 Threa…

Qt Widget之QMainWindow

目录 一 QMainWindow整体概况 二 菜单栏 三 工具栏 四 状态栏 五 铆接部件 六 核心部件 七 总体效果 一 QMainWindow整体概况 QMainWindow是主窗口程序&#xff0c;由以下几个部分构成&#xff1a;菜单栏&#xff0c;状态栏&#xff0c;工具栏&#xff0c;铆接部件和核…

Nginx优化服务和防盗链

Nginx优化服务和防盗链一、长连接1、修改主配置文件2、测试3、在主配置文件添加4、验证二、Nginx第三方模块1、开源的echo模块2、查看是否成功3、加echo模块步骤4、网页测试验证三、搭建虚拟主机1、编译安装好nginx后&#xff0c;对主配置文件进行修改2、创建文件3、验证四、防…

Android 源码中的 JNI,到底是如何使用的?

Linux下 JNI的使用学习 Android 其中涉及对 JNI 的使用&#xff1b;JNI的使用对于 Android 来说又是十分的重要和关键。那么到底 Java 到底是如何调用 C/C 的&#xff0c;下面是非常简单的计算器源码&#xff0c;只是用来熟悉JNI的基本语法&#xff0c;其中我自己碰到过的一个问…

Unity 使用L2Localization实现App切换多国语言

Unity 使用 L2 Localization实现App切换多国语言一、L2 Localization介绍二、使用步骤1.导入插件&#xff0c;新建Language和Term2.开始使用&#xff0c;切换语言总结提示&#xff1a;以下是本篇文章正文内容&#xff0c;会提供自己的插件下载地址 一、L2 Localization介绍 这…

day24_多线程进阶

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、线程安全的集合 三、死锁 四、线程通信 五、生产者消费者 六、线程池 零、 复习昨日 创建线程的几种方式 1) 继承 2) 实现Runnable 3) calla…

【jeecg】vue-cli-service不是内部或外部命令,也不是可运行的程序

npm run serve时&#xff0c;报错 vue-cli-service不是内部或外部命令,也不是可运行的程序 参考该链接 &#xff0c;找到生成的log文件&#xff0c; 在log文件里看到了C盘的地址 找到这个地址&#xff0c;发现里面有 我之前下载的yarn &#xff08;原来下在了这里&#xff09;没…

微服务一 实用篇 - 4.1 RabbitMQ部署

《微服务一 实用篇 - 4.1 RabbitMQ部署》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《微服务一 实用篇 - 4.1 RabbitMQ部署》《微服务一 实用篇 - 4.1 RabbitMQ部署》RabbitMQ部署指南1.单机部署1.1.下载镜像1.2.安装MQ2.集群部署2.1.集群分类2.2.设…

B - Build Roads (最小生成树 + 打表)

https://vjudge.net/problem/Gym-103118B/origin 在猫的国度里&#xff0c;有n个城市。猫国国王想要修n -1条路来连接所有的城市。第i市有一家ai经验价值的建筑公司。要在第i市和第j市之间修建公路&#xff0c;两个城市的建筑公司需要相互合作。但是&#xff0c;在修路的过程中…

Windows安装VMware+创建Linux虚拟机

目录1&#xff1a;简介2&#xff1a;功能特点3&#xff1a;VM下载地址4&#xff1a;安装VMware5&#xff1a;下载iso虚拟机镜像6&#xff1a;创建Linux虚拟机7&#xff1a;配置静态ip1&#xff1a;简介 VMware Workstation Pro&#xff08;曾用名VMware Workstation&#xff09…

供应商绩效管理指南:挑战、考核指标与管理工具

管理和优化供应商绩效既关键又具有挑战性。要知道价格并不是一切&#xff0c;如果你的供应商在商定的价格范围内向你开具发票&#xff0c;但服务达不到标准或货物不合格&#xff0c;你也无法达到节约成本的目标。 供应商绩效管理可以深入了解供应商可能带来的风险&#xff0c…

SpringCloud之认识微服务

文章目录一、传统项目转型二、走进 SpringCloud三、微服务项目搭建3.1 创建一个 SpringBoot 项目3.2 创建三个 Maven 子工程3.3 为子工程创建 application.yml3.4 引入依赖3.5 数据库 建库建表3.6 编写业务提示&#xff1a;以下是本篇文章正文内容&#xff0c;SpringCloud系列学…

Vim笔记

文章目录VIM四种模式命令模式编辑模式末行模式可视化模式扩展内容VIM四种模式 1、命令模式 2、编辑模式 3、末行模式 4、可视化模式 5、VIM四种模式的关系 命令模式 1、命令模式下我们能做什么&#xff1a;① 移动光标 ② 复制 粘贴 ③ 剪切 粘贴 删除 ④ 撤销与恢复 2、进…

【分布式】分布式唯一 ID 的 8 种生成方案

文章目录前言正文什么是分布式ID&#xff1f;分布式ID的特性&#xff1f;分布式ID的生成方案1. UUID2. 数据库自增ID3. 批量生成ID4. Redis生成ID5. Twitter的snowflake算法6. 百度UidGenerator7. 美团Leaf8.滴滴&#xff08;Tinyid&#xff09;小结前言 在互联网的业务系统中…

Leaflet基础入门教程(一)

leaflet是一个前端的轻量的gis框架,为什么说它轻量呢。因为相比于传统的“庞大的”GIS框架比如openlayers和mapbox,leaflet不仅代码体积小,而且API构成也极为简单。是GIS行业小白入门级别学习的最好的框架,没有之一。 那么话不多说我们首先来学习一下如何使用leaflet搭建一…

Vue3中hook的使用及使用中遇到的坑

目录前言一&#xff0c;什么是hook二&#xff0c; hook函数的使用2.1 铺垫2.2 hook函数的写法2.3 使用写好的hook函数后记前言 在学习Es6的时候&#xff0c;我们开始使用类与对象&#xff0c;开始模块化管理&#xff1b;在Vue中我们可以使用mixin进行模块化管理&#xff1b;Vu…

2023-03-03干活小计

今天见识了 归一化的重要性&#xff1a;归一化 不容易爆炸 深度了解了学习率&#xff1a;其实很多操作 最后的结果都是改变了lr 以房价预测为例&#xff1a;一个点一个点更新 比较 矩阵的更新&#xff1a; 为什么小批量梯度下降 优于随机梯度下降 优于批量梯度下降&#xff…

Kubernetes 中 Deployment 使用

Deployment的使用 之前我们了解了Replication Controller和Replica Set两种资源对象&#xff0c;RC和RS的功能基本上是差不多的&#xff0c;唯一的区别就是RS支持集合的selector。也了解到了用RC/RS来控制Pod副本的数量&#xff0c;也实现了滚动升级Pod的功能。现在看上去似乎…

【面试题】前端路由分类

0. 前言 在Web开发中&#xff0c;路由是指根据用户请求的URL地址&#xff0c;确定用户访问的页面资源、参数等&#xff0c;是前端开发中不可缺少的重要部分。Vue router中提供了两种路由模式&#xff0c;一种是hash模式&#xff0c;另一种是history模式。 1. Hash模式路由 H…