卷积神经网络——上篇【深度学习】【PyTorch】

news2024/9/24 22:40:01

文章目录

  • 5、卷积神经网络
    • 5.1、卷积
      • 5.1.1、理论部分
      • 5.1.2、代码实现
      • 5.1.3、边缘检测
    • 5.2、填充和步幅
      • 5.2.1、理论部分
      • 5.2.2、代码实现
    • 5.3、多输入多输出通道
      • 5.3.1、理论部分
      • 5.3.2、代码实现
    • 5.4、池化层 | 汇聚层
      • 5.4.1、理论部分
      • 5.4.2、代码实现

5、卷积神经网络

5.1、卷积

5.1.1、理论部分

全连接层后,卷积层出现的意义?

一个足够充分的照片数据集,输入,全连接层参数,GPU成本,训练时间是巨大的。

(convolutional neural networks,CNN)是机器学习利用自然图像中一些已知结构的创造性方法,需要更少的参数,在处理图像和其他类型的结构化数据上各类成本,效果,可行性普遍优于全连接层。

卷积层做了什么?

将输入和核矩阵进行互相关运算,加上偏移后得到输出。

图片中找模式的原则

  • 平移不变性
  • 局部性

对全连接层使用如上原则得到卷积层。

(详细待补充)

二维卷积层

在这里插入图片描述

Y = X ★ W + b Y = X ★ W + b Y=XW+b

  • 输入 X X X n h × n w n_h × n_w nh×nw

    图中,h:高、w:宽、输入大小 n = 3。

  • W W W k h × k w k_h × k_w kh×kw

    图中,卷积核大小 k = 2,超参数

  • 偏差 b∈ R

  • 输出 Y Y Y ( n h − k h + 1 ) × ( n w − k w + 1 ) ( n_h - k_h + 1)×(n_w - k_w + 1) nhkh+1×nwkw+1

    图中 (3-2 +1)*(3-2 +1) = 4 ,计算的是 Y 的形状。

  • ★:二维交叉操作子 | 外积

  • W 和 b是可学习的参数

卷积效果举例

在这里插入图片描述

5.1.2、代码实现

(1)实现互相关运算


卷积运算 ≠ 互相关运算

import torch
from torch import nn
from d2l import torch as d2l

def corr2d(X, K):  #@save
    """计算二维互相关运算"""
    h, w = K.shape
    Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            #点积求和
            Y[i, j] = (X[i:i + h, j:j + w] * K).sum()
    return Y

验证运算结果

X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
corr2d(X, K)

result:

tensor([[19., 25.],
     [37., 43.]])

实现二维卷积层

class Conv2D(nn.Module):
    def __init__(self,kernel_size):
        super().__init__()
        self.weight =nn.Parameter(torch.rand(kernel_size))
        self.bias = nn.Parameter(torch.zeros(1))
        
    def forward(sekf, x):
        return 	corr2d(x,self.weight) + self.bias

(2)学习由X生成Y卷积核


#一个输入通道、一个输出通道,不使用偏置
conv2d = nn.Conv2d(1,1,kernel_size=(1,2),bias =False)

X = X.reshape((1,1,6,8))
Y = Y.reshape((1,1,6,7))

for i in range(10):
    Y_hat = conv2d(X)
    l = (Y_hat - Y) **2
    conv2d.zero_grad()
    l.sum().backward()
    conv2d.weight.data[:] -=3e-2 * conv2d.weight.grad
    if(i + 1)% 2 == 0:
        print(f'batch{i + 1}, loss {l.sum():.3f}')

所学卷积核权重

conv2d.weight.data.reshape((1,2))
tensor([[ 1.0084, -0.9816]])

5.1.3、边缘检测

利用卷积层检测 图像中的不同边缘

输入

X = torch.ones((6,8))
X[:, 2:6]  =0
X
tensor([[1., 1., 0., 0., 0., 0., 1., 1.],
     [1., 1., 0., 0., 0., 0., 1., 1.],
     [1., 1., 0., 0., 0., 0., 1., 1.],
     [1., 1., 0., 0., 0., 0., 1., 1.],
     [1., 1., 0., 0., 0., 0., 1., 1.],
     [1., 1., 0., 0., 0., 0., 1., 1.]])

核矩阵

K = torch.tensor([[1,-1]])

输出

Y  = corr2d(X,K)
Y
tensor([[ 0.,  1.,  0.,  0.,  0., -1.,  0.],
     [ 0.,  1.,  0.,  0.,  0., -1.,  0.],
     [ 0.,  1.,  0.,  0.,  0., -1.,  0.],
     [ 0.,  1.,  0.,  0.,  0., -1.,  0.],
     [ 0.,  1.,  0.,  0.,  0., -1.,  0.],
     [ 0.,  1.,  0.,  0.,  0., -1.,  0.]])

只能检测垂直边缘

Y  = corr2d(X.t(),K)
Y
tensor([[0., 0., 0., 0., 0.],
     [0., 0., 0., 0., 0.],
     [0., 0., 0., 0., 0.],
     [0., 0., 0., 0., 0.],
     [0., 0., 0., 0., 0.],
     [0., 0., 0., 0., 0.],
     [0., 0., 0., 0., 0.],
     [0., 0., 0., 0., 0.]])

将核矩阵一起转置

Y  = corr2d(X.t(),K.t())
Y

水平边缘检测可行。

tensor([[ 0.,  0.,  0.,  0.,  0.,  0.],
     [ 1.,  1.,  1.,  1.,  1.,  1.],
     [ 0.,  0.,  0.,  0.,  0.,  0.],
     [ 0.,  0.,  0.,  0.,  0.,  0.],
     [ 0.,  0.,  0.,  0.,  0.,  0.],
     [-1., -1., -1., -1., -1., -1.],
     [ 0.,  0.,  0.,  0.,  0.,  0.]])

5.2、填充和步幅

5.2.1、理论部分

填充操作

更大的卷积核可以更快地减小输出大小。

如果不想结果太小,也可以通过填充实现输出更大尺寸的X,实现控制输出形状的减少量。

在这里插入图片描述

填充 p h p_h ph p w p_w pw列,输出形状:

( n h − k h + p h + 1 ) × ( n w − k w + p w + 1 ) (n_h -k_h +p_h +1)×(n_w - k_w + p_w +1) nhkh+ph+1×nwkw+pw+1

通常取 p h = k h − 1 ,     p w = k w − 1 p_h = k_h -1, \ \ \ p_w =k_w -1 ph=kh1,   pw=kw1

  • k h k_h kh奇数:上下两侧填充 p h / 2 p_h/2 ph/2
  • k h k_h kh偶数:上侧填充 ⌈ p h / 2 ⌉ ⌈p_h/2⌉ ph/2下侧填充 ⌊ p h / 2 ⌋ ⌊p_h/2⌋ ph/2

步幅

步幅指行/列滑动步长。

设置步幅的效果?

成倍减少输出形状。

下图为高3宽2步幅示意图:

在这里插入图片描述

(图片来自 《DIVE INTO DEEP LEARNING》)

给定步幅,高度 s h s_h sh宽度 s w s_w sw,输出形状:

⌊ ( n h − k h + p h + s h ) / s h ⌋ × ⌊ ( n w − k w + p w + s w ) / s w ⌋ ⌊(n_h - k_h + p_h + s_h)/s_h⌋ ×⌊(n_w - k_w + p_w + s_w)/s_w⌋ ⌊(nhkh+ph+sh)/sh×⌊(nwkw+pw+sw)/sw

如果输入高度宽度可被步幅整除,形状为:

( n h / s h ) × ( n w / s w ) (n_h / s_h)×(n_w / s_w) (nh/sh)×(nw/sw)

5.2.2、代码实现

填充、步幅是卷积层超参数

所有侧边填充一个像素

import torch
from torch import nn

def comp_conv2d(conv2d, X):
    X = X.reshape((1,1) + X.shape)
    Y =conv2d(X)
    return Y.reshape(Y.shape[2:])

conv2d = nn.Conv2d(1,1,kernel_size=3,padding=1)
X= torch.rand(size=(8,8))
comp_conv2d(conv2d,X).shape

填充相同高度宽度

import torch
from torch import nn

def comp_conv2d(conv2d, X):
    X = X.reshape((1,1) + X.shape)
    #执行一次卷积操作
    Y =conv2d(X)
    return Y.reshape(Y.shape[2:])
#padding=1 在输入数据的边界填充一行和一列的零值
conv2d = nn.Conv2d(1,1,kernel_size=3,padding=1)
X= torch.rand(size=(8,8))
comp_conv2d(conv2d,X).shape
torch.Size([8, 8])

不同高度宽度

conv2d = nn.Conv2d(1,1,kernel_size=(5,3),padding=(2,1))
comp_conv2d(conv2d,X).shape
torch.Size([8, 8])

增设步幅,其宽高为2

conv2d = nn.Conv2d(1,1,kernel_size=3,padding=1,stride =2)
comp_conv2d(conv2d,X).shape
torch.Size([4, 4])

成倍缩小。

5.3、多输入多输出通道

5.3.1、理论部分

彩色RGB图片,是三通道输入数据。

每个通道都有一个卷积核,结果为各通道卷积的和。

在这里插入图片描述

1×1卷积层

不识别空间,用途是融合通道。

二维卷积层(多通道)

Y = X ★ W + B Y = X ★ W + B Y=XW+B

  • 输入 X X X c i × n h × n w c_i × n_h × n_w ci×nh×nw

    c i c_i ci输入通道数、h高、w宽、输入大小 n。

  • W W W c o × c i × k h × k w c_o × c_i × k_h × k_w co×ci×kh×kw

    c o c_o co输出通道数、卷积核大小 k。其中, c o c_o co是卷积层的超参数。

  • 偏差 B B B c o × c i c_o × c_i co×ci

    一共有 c o × c i c_o × c_i co×ci个卷积核 每个卷积核都有一个偏差

  • 输出 Y Y Y c o × m h × m w c_o × m_h × m_w co×mh×mw

    m h   m w m_h \ m_w mh mw大小与 填充p、核大小k有关。

  • ★:二维交叉操作子 | 外积

怎么理解每个输出通道有独立的三维卷积核?

具有三个维度:高度、宽度和通道数。

5.3.2、代码实现

(1)实现多通道互相关运算


定义多通道输入

import torch
from d2l import torch as d2l
#先遍历“X”和“K”的第0个维度(通道维度),再把它们加在一起
def corr2d_multi_in(X,K):
    return sum(d2l.corr2d(x,k) for x,k in zip(X,K))

多通道第零维度的几何意义?
在这里插入图片描述

图中X第零维度有两组,几何上就是通道数。

X :

(tensor([[[0., 1., 2.],
          [3., 4., 5.],
          [6., 7., 8.]],

         [[1., 2., 3.],
          [4., 5., 6.],
          [7., 8., 9.]]]),

定义X,K

# X 6*3
X = torch.tensor([[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]],
               [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]])
#K 4*2
K = torch.tensor([[[0.0, 1.0], [2.0, 3.0]], [[1.0, 2.0], [3.0, 4.0]]])

X,K,corr2d_multi_in(X, K)
(tensor([[[0., 1., 2.],
       [3., 4., 5.],
       [6., 7., 8.]],

      [[1., 2., 3.],
       [4., 5., 6.],
       [7., 8., 9.]]]),
tensor([[[0., 1.],
       [2., 3.]],

      [[1., 2.],
       [3., 4.]]]),
tensor([[ 56.,  72.],
      [104., 120.]]))

定义多通道输出

def corr2d_multi_in_out(X,K):
    # 使用 PyTorch 的 torch.stack 函数,它将一组张量沿着指定的维度(这里是维度0)进行堆叠,生成一个新的张量。
    return torch.stack([corr2d_multi_in(X,k) for k in K],0)
# K+1 K的每个值加一,K规模扩成了原来3倍。
K = torch.stack((K,K+1,K+2),0)
K,K.shape
(tensor([[[[0., 1.],
        [2., 3.]],

       [[1., 2.],
        [3., 4.]]],


      [[[1., 2.],
        [3., 4.]],

       [[2., 3.],
        [4., 5.]]],


      [[[2., 3.],
        [4., 5.]],

       [[3., 4.],
        [5., 6.]]]]),
torch.Size([3, 2, 2, 2]))

返回值那一行为什么用小k对应X,多通道输入那里不是用的大K对应X,然后第零维度展开,抽出x,k对应计算吗?

K扩了三倍,所以用小k规模和原来的K相当,因此X 对应扩充前的K,扩充后的小k。

corr2d_multi_in_out(X,K)
tensor([[[ 56.,  72.],
      [104., 120.]],

     [[ 76., 100.],
      [148., 172.]],

     [[ 96., 128.],
      [192., 224.]]])

(2)实现1*1卷积核


def corr2d_multi_in_out_1x1(X, K):
    c_i, h, w = X.shape
    c_o = K.shape[0]
    X = X.reshape((c_i, h * w))
    K = K.reshape((c_o, c_i))
    # 全连接层中的矩阵乘法
    Y = torch.matmul(K, X)
    return Y.reshape((c_o, h, w))
X = torch.normal(0, 1, (3, 3, 3))
K = torch.normal(0, 1, (2, 3, 1, 1))

Y1 = corr2d_multi_in_out_1x1(X, K)
Y2 = corr2d_multi_in_out(X, K)
# 进行断言,验证使用 1x1 卷积操作得到的输出 Y1 与多通道卷积操作得到的输出 Y2 是否非常接近,以确保两种方法的结果一致
assert float(torch.abs(Y1 - Y2).sum()) < 1e-6

5.4、池化层 | 汇聚层

5.4.1、理论部分

最大池化,每个窗口最强的模式信号,它针对卷积对空间位置敏感(边缘检测案例),允许输入有一定的偏移。

也有平均池化层。

特点

  • 具有填充,步幅;
  • 没有可学习的参数;
  • 输出通道 = 输入通道,一一对应。

5.4.2、代码实现

池化层向前传播

import torch
from torch import nn
from d2l import torch as d2l

def pool2d(X, pool_size, mode='max'):
    p_h, p_w = pool_size
    Y = torch.zeros((X.shape[0] - p_h + 1, X.shape[1] - p_w + 1))
    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            if mode == 'max':
                Y[i, j] = X[i: i + p_h, j: j + p_w].max()
            elif mode == 'avg':
                Y[i, j] = X[i: i + p_h, j: j + p_w].mean()
    return Y

验证最大池化层

X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
pool2d(X, (2, 2))
tensor([[4., 5.],
  [7., 8.]])

验证平均池化层

pool2d(X, (2,2), 'avg')
tensor([[2., 3.],
  [5., 6.]])

使用内置的最大池化层

X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4))
X
tensor([[[[ 0.,  1.,  2.,  3.],
       [ 4.,  5.,  6.,  7.],
       [ 8.,  9., 10., 11.],
       [12., 13., 14., 15.]]]])
pool2d = nn.MaxPool2d(3, padding=1, stride=2)#等价于nn.MaxPool2d((3,3), padding=(1,1), stride=(2,2))
pool2d(X)
tensor([[[[ 5.,  7.],
       [13., 15.]]]])
pool2d = nn.MaxPool2d((2, 3), stride=(2, 3), padding=(0, 1))
pool2d(X)
tensor([[[[ 5.,  7.],
       [13., 15.]]]])

验证多通道

汇聚层在每个输入通道上单独运算,输出通道数与输入通道数相同。

# 将两个张量 X, X + 1 进行拼接
X = torch.cat((X, X + 1), 1)
X
tensor([[[[ 0.,  1.,  2.,  3.],
    [ 4.,  5.,  6.,  7.],
    [ 8.,  9., 10., 11.],
    [12., 13., 14., 15.]],

   [[ 1.,  2.,  3.,  4.],
    [ 5.,  6.,  7.,  8.],
    [ 9., 10., 11., 12.],
    [13., 14., 15., 16.]]]])
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
pool2d(X)
tensor([[[[ 5.,  7.],
       [13., 15.]],

      [[ 6.,  8.],
       [14., 16.]]]])

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

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

相关文章

PSP - 基于开源框架 OpenFold 训练的 Finetuning 模型与推理逻辑评估

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132410296 AlphaFold2 以其能够以极高的准确度预测蛋白质结构的能力&#xff0c;彻底改变了结构生物学。然而&#xff0c;AlphaFold2 的实现&…

Linux面试笔试题(5)

79、下列工具中可以直接连接mysql的工具有【c 】。 A.xsellB.plsqlC.navicatD.以上都不是 80、Linux系统最少的挂载点有两个【B 】 A.一个是根挂载点 home&#xff0c;另一个是swap B.一个是根挂载点/&#xff0c;另一个是swap C.一个是根挂载点 boot&#xff0c;另一个是sw…

多维时序 | MATLAB实现SCNGO-CNN-Attention多变量时间序列预测

多维时序 | MATLAB实现SCNGO-CNN-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现SCNGO-CNN-Attention多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.SCNGO-CNN-Attention超前24步多变量回归预测算法。 程序平台&#xff1a;无Attention适…

vue 弹出框 引入另一个vue页面

为什么要这么做,适用于在一个页面逻辑比较多的时候,可以搞多个页面,防止出错 index页面点击解约按钮,弹出框 进入jieyue.vue 核心代码 <el-buttonsize"mini"type"text"icon"el-icon-edit"v-if"scope.row.delFlag 0"click"j…

openpnp - 日常使用的零碎记录

文章目录 openpnp - 日常使用的零碎记录概述抓偏贴偏的问题END openpnp - 日常使用的零碎记录 概述 设备标定已经妥妥的了(随时有需求从头要设备标定, 都是一次通过:) ), 现在主要是使用openpnp正常干活. 使用过程中, 发现了一些问题, 尝试解决并记录. 抓偏贴偏的问题 软件…

探索人工智能 | 模型训练 使用算法和数据对机器学习模型进行参数调整和优化

前言 模型训练是指使用算法和数据对机器学习模型进行参数调整和优化的过程。模型训练一般包含以下步骤&#xff1a;数据收集、数据预处理、模型选择、模型训练、模型评估、超参数调优、模型部署、持续优化。 文章目录 前言数据收集数据预处理模型选择模型训练模型评估超参数调…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 3 Paramter标签页介绍

这页是参数设置的界面,那首先要知道什么是参数,参数就是算法中的系数这些可以更改的变量,接下来就是要学习如何创建参数,如下图: 打开模型资源管理器 选择model Workspace标签,点击上边工具栏里的创建参数的按钮(红色箭头指向的按钮),添加一个新的参数K,值设置为4,数…

摄影预约小程序制作的技术要点与难点解析

随着移动互联网的发展&#xff0c;小程序成为了很多企业和个人推广自己的产品和服务的有效工具。对于摄影师来说&#xff0c;一个功能完善、用户友好的摄影预约小程序可以方便客户预约拍摄时间&#xff0c;提升工作效率。那么&#xff0c;如何制作开发摄影预约小程序呢&#xf…

字幕翻译难吗,如何做好影视字幕翻译?

你是否曾经遇到过观看外国影视作品时&#xff0c;因为字幕翻译不准确而影响观影体验的情况&#xff1f; 专业的字幕翻译员不仅需要具备丰富的知识储备和语言组织能力&#xff0c;还要了解国内外文化风俗的差异。那么&#xff0c;如何才能做好影视字幕翻译呢&#xff1f;北京哪家…

CouchDB Erlang 分布式协议代码执行

漏洞描述 在CouchDB 3.2.1及以前版本中,使用了默认Cookie,值为“monster”,由于Erlang的特性,其支持分布式计算,分布式节点之间通过Erlang/OTP Distribution协议进行通信。攻击者如果知道通信时使用的Cookie,即可在握手包通过认证并执行任意命令。 免责声明 技术文章…

正中优配:降息利好什么股票?降息利好什么板块?

降息通常是指央行下降银行的存款、贷款利率&#xff0c;它是一种宽松的货币政策&#xff0c;会导致资金从银行流出&#xff0c;存款变为出资或消费&#xff0c;结果是资金流动性添加&#xff0c;给股市带来更多的资金&#xff0c;整体上会影响股市的上涨&#xff0c;那么&#…

2023-08-21 Unity Shader 开发入门1 —— 渲染管线

文章目录 一、概述二、应用阶段三、几何阶段四、光栅化阶段 一、概述 ​ Unity 中的渲染管线和图形学中的渲染管线基本上指的是相同的概念&#xff0c;但是具体实现和细节方面可能存在一些差异。 ​ Unity 的渲染管线建立在图形学的基础上&#xff0c;但具有自己的实现和拓展。…

windows安装使用RocketMQ常见问题,及springboot整合

win安装rocketmq 官网下载二进制包&#xff1a;https://rocketmq.apache.org/download 解压到不包含中文及空格的目录&#xff0c;配置环境变量 ROCKETMQ_HOME4. 修改runbroker.cmd和runserver.cmd文件 文件地址在rocketmq安装目录下的bin文件夹中。 如果不修改可能会遇见以…

CSS伪类:where和:is

CSS伪类:where和:is 1 :where1.1 概述1.2 组合与叠加1.3 优先级1.4 安全性1.5 兼容性 2 :is兼容性 1 :where 1.1 概述 :where()接受选择器列表作为它的参数&#xff0c;将会选择所有能被该选择器列表中任何一条规则选中的元素。 例如&#xff0c;在以下代码中&#xff0c;a标…

linux安装 jdk

1.下载 jdk 网盘资源&#xff1a; 链接: https://pan.baidu.com/s/1Z-fyHGDyj9b_km6ymR6mZg?pwdwd42 提取码: wd42 2.上传至服务器并解压 这里是上传至/opt 文件夹&#xff0c;并创建了/opt/soft 文件夹&#xff0c;解压在此 cd /opt tar -zxvf ./jdk-8u321-linux-x64.t…

8月18日上课内容 Haproxy搭建Web群集

本章结构 课程大纲 Haproxy调度算法 常见的web集群调度器 目前常见的Web集群调度器分为软件和硬件软件 通常使用开源的LVS、Haproxy、Nginx 硬件一般使用比较多的是F5&#xff0c;也有很多人使用国内的一些产品&#xff0c;如梭子鱼、绿盟等 Haproxy应用分析 LVS在企业应用中…

微信小程序使用云存储和Markdown开发页面

最近想在一个小程序里加入一个使用指南的页面&#xff0c;考虑到数据存储和减少页面的开发工作量&#xff0c;决定尝试在云存储里上传Markdown文件&#xff0c;微信小程序端负责解析和渲染。小程序端使用到一个库Towxml。 Towxml Towxml是一个可将HTML、Markdown转为微信小程…

mysql 、sql server 游标 cursor

游标 声明的位置 游标必须在声明处理程序之前被声明&#xff0c;并且变量和条件还必须在声明游标或处理程序之前被声明 游标的使用步骤 声明游标打开游标使用游标关闭游标 &#xff08;sql server 关闭游标和释放游标&#xff09; sql server 游标 declare my_cursor curs…

Redis企业级解决方案

缓存预热 “ 宕机 ” 服务器启动后迅速宕机 问题排查 1. 请求数量较高 2. 主从之间数据吞吐量较大&#xff0c;数据同步操作频度较高 , 因为刚刚启动时&#xff0c;缓存中没有任何数据 解决方案 准备工作&#xff1a; 1. 日常例行统计数据访问记录&#xff0c;统计访…

亚马逊云科技 云技能孵化营——机器学习心得

亚马逊云科技 云技能孵化营机器学习心得 前言什么是机器学习&#xff1f;机器学习如何解决业务问题&#xff1f;什么时候适合使用机器学习模型&#xff1f;总结 前言 很荣幸参加了本次亚马逊云科技云技能孵化营&#xff0c;再本期的《亚马逊云科技云技能孵化营》中&#xff0c…