线性回归、softmax与分类、多层感知机

做一个简单的回归预测模型的步骤和基本要素:

  1. 我们要有数据集,观察数据集的变量和标签,明确要解决的问题,分割为训练集和测试集,用于预测的标签的因素成为特征
  2. 模型,主要看我们怎么去考虑,线性回归就直接乘上w参数,例如面积和房龄
  3. 损失函数,衡量预测值和真实值之间的误差,通常会选择一个非负数作为误差,数值越小越好,这里用平方误差.
  4. 优化函数:误差最小化问题的解可以直接用公式表达,叫做解析解。上面的线性回归+平方误差属于这个范畴。大多数deep model是没有解析解,就需要优化算法有限次迭代模型参数,尽量让损失函数的值降到最低,这叫数值解
    (常用:mini-batch 随机梯度下降,选定一组模型参数初始值,对参数进行多次迭代,降低损失函数的值,每次迭代中,先随机均匀采样一个固定的数量的训练样本组成小批量mini-batch,然后求这个mini-batch的损失函数的模型参数的导数,最后用这个结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。)

平方误差的损失函数公式:
l ( i ) ( w , b ) = 1 2 ( y ^ ( i ) − y ( i ) ) 2 , l^{(i)}(\mathbf{w}, b) = \frac{1}{2} \left(\hat{y}^{(i)} - y^{(i)}\right)^2, l(i)(w,b)=21(y^(i)y(i))2,

L ( w , b ) = 1 n ∑ i = 1 n l ( i ) ( w , b ) = 1 n ∑ i = 1 n 1 2 ( w ⊤ x ( i ) + b − y ( i ) ) 2 L(\mathbf{w}, b) =\frac{1}{n}\sum_{i=1}^n l^{(i)}(\mathbf{w}, b)=\frac{1}{n} \sum_{i=1}^n \frac{1}{2}\left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)^2 L(w,b)=n1i=1nl(i)(w,b)=n1i=1n21(wx(i)+by(i))2

mini-batch随机梯度下降优化函数:
( w , b ) ← ( w , b ) − η ∣ B ∣ ∑ i ∈ B ∂ ( w , b ) l ( i ) ( w , b ) (\mathbf{w},b) \leftarrow (\mathbf{w},b) - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{(\mathbf{w},b)} l^{(i)}(\mathbf{w},b) (w,b)(w,b)BηiB(w,b)l(i)(w,b)

1. 线性回归简单实现

# -*- coding: utf-8 -*-
"""
Created on Thu Feb 13 10:35:57 2020

线性回归模型从零开始的实现
以房价预测为例,参数有面积和楼龄,label为房价。1000个样本
"""
import torch
from matplotlib import pyplot as plt
import numpy as np
import random


#特征数
num_inputs = 2
#样本数
num_examples = 1000

# 真实的w和b值
true_w = [2, -3.4]
true_b = 4.2

#生成1000个样本的特征以及标签
features = torch.randn(num_examples, num_inputs,
                      dtype=torch.float32)
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
#为了让标签看上去更加的真实,加上一个从正态分布中的值
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()),
                       dtype=torch.float32)
#查看数据分布
plt.scatter(features[:, 1].numpy(), labels.numpy(), 1);


#1. 读取数据集
def data_iter(batch_size,features,labels):  #一个生成器
    num_examples = len(features) #样本数
    indices = list(range(num_examples))  #样本下标
    random.shuffle(indices)  #打乱顺序,看上去更加真实
    for i in range(0,num_examples,batch_size):   #根据batchSize大小读取数据
        j = torch.LongTensor(indices[i:min(i+batch_size,num_examples)])
        yield features.index_select(0,j) , labels.index_select(0,j) #index_select为pytoch方法,按照下标选择数据

def check_data_iter(features,labels): 
    #查看数据集读取情况
    batch_size = 10
    for X,y in data_iter(batch_size,features,labels):
        print(X,'\n',y)
        break

#2. 初始化模型参数
w = torch.tensor(np.random.normal(0,0.01,(num_inputs,1)),dtype=torch.float32)
b = torch.zeros(1,dtype=torch.float32)
w.requires_grad_(requires_grad=True)  #指定某个变量要求梯度
b.requires_grad_(requires_grad=True)        
    
#3.定义模型
def linreg(X,w,b):
    return torch.mm(X,w)+b #定义一个线性模型,mm代表X和w矩阵相乘,mul是对应位相乘

#4.定义损失函数
def squared_loss(y_hat,y):
    return (y_hat-y.view(y_hat.size())) ** 2 / 2

#5.定义优化函数,用mini-batch SGD
def sgd(params,lr,batch_size):
    for param in params:
        param.data -= lr * param.grad / batch_size #.data作用是让参数没有梯度的跟踪,这样不会被之前的梯度变化影响到
        
#6. 训练过程:
batch_size = 10
lr = 0.03
num_epochs=6
for epoch in range(num_epochs):  #重复训练num_epochs次
    for X,y in data_iter(batch_size,features,labels):
        #计算这个batch的损失
        loss_sum = squared_loss(linreg(X,w,b),y).sum()
        #计算这个batch的损失的梯度
        loss_sum.backward()
        #利用小批量随机梯度下降去迭代模型参数
        sgd([w,b],lr,batch_size)
        #梯度更时时,每一次运算后都需要将上一次的梯度记录清空
        w.grad.data.zero_()
        b.grad.data.zero_()
    #梯度更新完一次,计算所有样本的损失值
    train_l = squared_loss(linreg(features,w,b),labels)
    print('epoch %d, loss %f' % (epoch + 1, train_l.mean().item()))
print('\n w is',w,'\n true w is' ,true_w,'\n b is', b,'\n true_ is', true_b)

Pytorch简易实现

# -*- coding: utf-8 -*-
"""
Created on Thu Feb 13 12:01:49 2020

@author: zyuyiuwai
线性回归模型从零开始的实现pytoch版本
"""
import torch
from torch import nn
import numpy as np
torch.manual_seed(1)
torch.set_default_tensor_type('torch.FloatTensor')


#1. 生成数据
num_inputs = 2
num_examples = 1000

true_w = [2, -3.4]
true_b = 4.2

features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()), dtype=torch.float)

#2. 读取数据 (从这一步开始,可以用pytoch中的方法,快速建立神经网络)
import torch.utils.data as Data
batch_size = 10
#把特征和标签集合在一个dataset中
dataset = Data.TensorDataset(features,labels)
data_iter = Data.DataLoader(
        dataset = dataset,  #torch tensorDataset format
        batch_size=batch_size,  #mini batch size
        shuffle=True,   #是否打乱数据
#        num_workers=2,  #用多线程来读取数据
        )

#3. 定义模型
class LinearNet(nn.Module):
    def __init__(self,n_feature):
        super(LinearNet,self).__init__()  #初始化父类的init方法
        self.linear = nn.Linear(n_feature,1)
        ## 函数原型: `torch.nn.Linear(in_features, out_features, bias=True)`
        
        def forward(self,x):
            y = self.linear(x)
            return y
#3.2 初始化一个多层网络的3个方法
#3.2.1 
net = nn.Sequential(
        nn.Linear(num_inputs,1),
        #后续添加多个分层
#        nn.Linear(num_inputs,1),
#        nn.Linear(num_inputs,1),
        #....
        )
##3.2.2
#net = nn.Sequential()
#net.add_module('linear',nn.Linear(num_inputs,1))
#net.add_module('linear',nn.Linear(num_inputs,1))
#net.add_module('linear',nn.Linear(num_inputs,1))
#net.add_module('linear',nn.Linear(num_inputs,1))
##....
#
##3.2.3
#from collections import OrderedDict
#net = nn.Sequential(OrderedDict([
#           ('linear',nn.Linear(num_inputs,1)),
#           ('linear',nn.Linear(num_inputs,1)),
#           ('linear',nn.Linear(num_inputs,1)),
#           ('linear',nn.Linear(num_inputs,1)),
#           ('linear',nn.Linear(num_inputs,1))
#           #......
#        ]))
  
         

#4. 初始化模型参数
from torch.nn import init

init.normal_(net[0].weight,mean=0.0,std=0.01)
init.constant_(net[0].bias,val=0.0)

#for param in net.parameters():
#    print(param)
    
#5. 定义损失函数
loss = nn.MSELoss()
# function prototype: `torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')`

#6.定义优化函数
import torch.optim as optim
optimizer = optim.SGD(net.parameters(),lr = 0.03)
# function prototype: `torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)`

#7. 训练过程
num_epochs = 3
for epoch in range(1,num_epochs+1):
    for X,y in data_iter:
        output = net(X)
        l = loss(output,y.view(-1,1))
        optimizer.zero_grad() #重置梯度
        l.backward()
        optimizer.step()
    print('epoch %d, loss: %f' % (epoch, l.item()))

# result comparision
dense = net[0]
print(true_w, dense.weight.data)
print(true_b, dense.bias.data)
pytoch的一些小知识点
torch.cuda.is_available()
查看是否用了显卡
view的用法:
a=torch.randn(3,4,5,7)
b = a.view(1,-1)
如上例中,第一个参数1将第一个维度的大小设定成1,
后一个-1就是说第二个维度的大小=元素总数目/第一个维度的大小,
此例中为3*4*5*7/1=420.

(-1,1)同理,第一个维度等于元素总数目,第二个维度为1

Softmax和分类模型

softmax回归就是对离散值的预测,可以转化为分类问题,例如比较简单的图像分类任务。
我们假设输入图像的像素为4,色彩为灰度,那么这4个像素就可以作为输入 x 1 , x 2 , x 3 , x 4 x_1, x_2, x_3, x_4 x1,x2,x3,x4,输出假设为猪、狗、羊,并用离散数值表示类别 y 1 = 1 , y 2 = 2 , y 3 = 3 y_1=1, y_2=2, y_3=3 y1=1,y2=2,y3=3
在这里插入图片描述
softmax回归和线性回归相似,也是单层神经网络.
分类问题需要得到离散的预测输出,第一想法就是把输出值oi作为预测类别是i的置信度,把值最大的输出对应的类作为预测输出,即 arg ⁡ max ⁡ i o i \underset{i}{\arg\max} o_i iargmaxoi

不过上面的做法会导致两个问题:
1.输出层的输出值的范围不确定,难以确定这个值的意义
2.真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量

所以提出了softmax运算符:
y ^ 1 , y ^ 2 , y ^ 3 = softmax ( o 1 , o 2 , o 3 ) \hat{y}_1, \hat{y}_2, \hat{y}_3 = \text{softmax}(o_1, o_2, o_3) y^1,y^2,y^3=softmax(o1,o2,o3)
y ^ 1 = exp ⁡ ( o 1 ) ∑ i = 1 3 exp ⁡ ( o i ) , y ^ 2 = exp ⁡ ( o 2 ) ∑ i = 1 3 exp ⁡ ( o i ) , y ^ 3 = exp ⁡ ( o 3 ) ∑ i = 1 3 exp ⁡ ( o i ) . \hat{y}1 = \frac{ \exp(o_1)}{\sum_{i=1}^3 \exp(o_i)},\quad \hat{y}2 = \frac{ \exp(o_2)}{\sum_{i=1}^3 \exp(o_i)},\quad \hat{y}3 = \frac{ \exp(o_3)}{\sum_{i=1}^3 \exp(o_i)}. y^1=i=13exp(oi)exp(o1),y^2=i=13exp(oi)exp(o2),y^3=i=13exp(oi)exp(o3).

因为 y ^ 1 + y ^ 2 + y ^ 3 = 1 \hat{y}_1 + \hat{y}_2 + \hat{y}_3 = 1 y^1+y^2+y^3=1 0 ≤ y ^ 1 , y ^ 2 , y ^ 3 ≤ 1 0 \leq \hat{y}_1, \hat{y}_2, \hat{y}_3 \leq 1 0y^1,y^2,y^31,所以这个一个合法的概率分布

小批量矢量计算softmax

softmax也是可以小批量矢量计算的,提高计算效率。
批量大小为n,输入个数(特征数)为d,输出个数(类别数)为q
设批量特征为 X ∈ R n × d \boldsymbol{X} \in \mathbb{R}^{n \times d} XRn×d, W ∈ R d × q \boldsymbol{W} \in \mathbb{R}^{d \times q} WRd×q b ∈ R 1 × q \boldsymbol{b} \in \mathbb{R}^{1 \times q} bR1×q
O = X W + b , Y ^ = softmax ( O ) , \begin{aligned} \boldsymbol{O} &= \boldsymbol{X} \boldsymbol{W} + \boldsymbol{b},\\ \boldsymbol{\hat{Y}} &= \text{softmax}(\boldsymbol{O}), \end{aligned} OY^=XW+b,=softmax(O),

softmax的损失函数选择

按照正常套路,都会先用平方损失估计,目标是让预测概率分布yhat尽可能接近真实标签概率分布 y y y,但是我们做分类其实不需要那么准确,只需要正确的预测值,例如 y ^ 3 \hat{y}_3 y^3比其他两个预测值 y ^ 1 \hat{y}_1 y^1 y ^ 2 \hat{y}_2 y^2要大就行。不管其他两个预测值是多少,类别预测都正确了,而平方损失过于严格了

所以我们采用更加适合衡量两个概率分布差异的测量函数,交叉熵cross entropy:
H ( y ( i ) , y ^ ( i ) ) = − ∑ j = 1 q y j ( i ) log ⁡ y ^ j ( i ) , H\left(\boldsymbol y^{(i)}, \boldsymbol {\hat y}^{(i)}\right ) = -\sum_{j=1}^q y_j^{(i)} \log \hat y_j^{(i)}, H(y(i),y^(i))=j=1qyj(i)logy^j(i),

y ^ ( i ) {\hat y}^{(i)} y^(i)是个向量,代表真实标签,只有正确的元素标签才会是1,其余都为0,所以得到 H ( y ( i ) , y ^ ( i ) ) = − log ⁡ y ^ y ( i ) ( i ) H(\boldsymbol y^{(i)}, \boldsymbol {\hat y}^{(i)}) = -\log \hat y{y^{(i)}}^{(i)} H(y(i),y^(i))=logy^y(i)(i),交叉熵只关心对正确类别的预测概率,因为只要其值足够大,就可以确保分类结果正确。

多层感知机

多层感知机想要阐述的就是关于多层神经网络的概念,而多层感知机就是含有多个隐含层的神经网络,如下图:
在这里插入图片描述
有一个隐藏层,5个隐藏单元

公式

依然是使用小批量的方式计算,输入为 X ∈ R n × d \boldsymbol{X} \in \mathbb{R}^{n \times d} XRn×d,其批量大小为 n n n,输入个数为 d d d。用上面的例子只有一个隐藏层,其中隐藏单元个数为 h h h。隐藏层的输出为 H ∈ R n × h \boldsymbol{H} \in \mathbb{R}^{n \times h} HRn×h。因为隐藏层和输出层均是全连接层,可以设隐藏层的权重参数和偏差参数分别为 W h ∈ R d × h \boldsymbol{W}_h \in \mathbb{R}^{d \times h} WhRd×h b h ∈ R 1 × h \boldsymbol{b}_h \in \mathbb{R}^{1 \times h} bhR1×h,输出层的权重和偏差参数分别为 W o ∈ R h × q \boldsymbol{W}_o \in \mathbb{R}^{h \times q} WoRh×q b o ∈ R 1 × q \boldsymbol{b}_o \in \mathbb{R}^{1 \times q} boR1×q

计算输出 O ∈ R n × q \boldsymbol{O} \in \mathbb{R}^{n \times q} ORn×q如下:
H = X W h + b h , O = H W o + b o , \begin{aligned} \boldsymbol{H} &= \boldsymbol{X} \boldsymbol{W}_h + \boldsymbol{b}_h,\\ \boldsymbol{O} &= \boldsymbol{H} \boldsymbol{W}_o + \boldsymbol{b}_o, \end{aligned} HO=XWh+bh,=HWo+bo,

上面的式子是可以通过带入,分解成一个线性的式子:
O = ( X W h + b h ) W o + b o = X W h W o + b h W o + b o . \boldsymbol{O} = (\boldsymbol{X} \boldsymbol{W}_h + \boldsymbol{b}_h)\boldsymbol{W}_o + \boldsymbol{b}_o = \boldsymbol{X} \boldsymbol{W}_h\boldsymbol{W}_o + \boldsymbol{b}_h \boldsymbol{W}_o + \boldsymbol{b}_o. O=(XWh+bh)Wo+bo=XWhWo+bhWo+bo.
由此得知,即使加多少隐藏层,都可以等价于一个仅含有输出层的单层神经网络,问题处在于全连接层只是对数据做仿射变换(affine transformation),仿射变换的叠加还是仿射变换,没有太大意义,所以我们需要引入非线性变换,引申出了激活函数这个概念

激活函数

我们对每个单元计算完结果后,再进行非线性函数的变换,这个非线性函数就是激活函数。以下是常用激活函数介绍:

ReLU函数

ReLU ( x ) = max ⁡ ( x , 0 ) . \text{ReLU}(x) = \max(x, 0). ReLU(x)=max(x,0).
特点:只保留正数元素,负数元素则清零。

torch的实现:
x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = x.relu()

还有leaky_ReLU,就是不把负数元素直接清零,而是手工指定一个数字,通常使用0.01或0.001这样很小的数字

Sigmoid函数

sigmoid函数可以将元素的值变换到0和1之间:

sigmoid ( x ) = 1 1 + exp ⁡ ( − x ) . \text{sigmoid}(x) = \frac{1}{1 + \exp(-x)}. sigmoid(x)=1+exp(x)1.

y = x.sigmoid()

当输入为0时,sigmoid函数的导数达到最大值0.25;当输入越偏离0时,sigmoid函数的导数越接近0。

tanh函数

这个中文叫双曲正切函数,把元素的值变换为-1和1之间
tanh ( x ) = 1 − exp ⁡ ( − 2 x ) 1 + exp ⁡ ( − 2 x ) . \text{tanh}(x) = \frac{1 - \exp(-2x)}{1 + \exp(-2x)}. tanh(x)=1+exp(2x)1exp(2x).
当输入为0时,tanh函数的导数达到最大值1;当输入越偏离0时,tanh函数的导数越接近0。

如何选择?

大多数情况,隐藏层我们会使用ReLU,因为计算量少,而且我们尽量避免用sigmoid和tanh是因为梯度消失的问题,sigmoid函数多用于分类器

从零实现感知机,后续补上

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
                《人工智能:深度学习入门到精通实战》课程主要就人工智能领域相关的深度学习基础、深度学习计算、卷积神经网络+经典网络、循环神经网络+RNN进阶、优化算法、计算视觉和自然语言处理等,配套实战案例与项目全部基于真实数据集与实际任务展开,结合深度学习框架进行建模实战。                由浅入深,每一个理论搭配一个实验,引领学员浸泡式逐步掌握各项技能和实战项目,且侧重技能不同,学员的知识体系会更加全面课程大纲:第一章:深度学习基础-深度学习简介01.1-前置知识01.2-传统编程与数据编程01.3-深度学习起源01.4-深度学习崛起与发展01.5-深度学习成功案例01.6-深度学习特点 第二章:深度学习基础-Python基础02.1-PyTorch介绍与环境配置02.2-数据操作与创建Tensor02.3-算术操作、索引与改变形状02.4-线性代数、广播制与内存开销02.5-Tensor和NumPy相互转换与Tensor on GPU02.6-实验01-创建和使用Tensor-102.7-实验01-创建和使用Tensor-202.8-梯度下降02.9-实验02-梯度下降-102.10-实验02-梯度下降-202.11-自动求梯度概念02.12-自动求梯度实例02.13-实验03-自动求梯度-102.14-实验03-自动求梯度-2 第三章:深度学习基础-线性回归03.1-线性回归讲解03.2-线性回归实例03.3-实验04-从零实现线性回归-103.4-实验04-从零实现线性回归-203.5-实验05-线性回归的简洁实现-103.6-实验05-线性回归的简洁实现-2 第四章:深度学习基础-softmax回归04.1-softmax回归04.2-实验06-FashionMNIST04.3-实验07-从零实现Softmax回归-104.4-实验07-从零实现Softmax回归-204.5-实验08-softmax回归的简洁实现 第五章:深度学习基础-多层感知05.1-感知05.2-多层感知05.3-多层感知与神经网络05.4-激活函数05.5-正向传播05.6-反向传播05.7-正向传播和反向传播05.8-批大小05.9-实验09-从零实现MLP05.10-实验10-MLP的简洁实现 第六章:深度学习基础-模型选择、欠拟合和过拟合06.1-训练误差和泛化误差06.2-模型选择06.3-欠拟合和过拟合06.4-权重衰减06.5-丢弃法06.6-实验11-多项式函数拟合实验06.7-实验12-高维线性回归实验-106.8-实验12-高维线性回归实验-206.9-实验13-Dropout 第七章:深度学习基础-数值稳定性和模型初始化07.1-数值稳定性和模型初始化-107.2-数值稳定性和模型初始化-207.3-实验14-房价预测案例-107.4-实验14-房价预测案例-207.5-实验14-房价预测案例-3 第八章:深度学习计算-模型构造08.1-模型构造-108.2-模型构造-208.3-模型构造-308.4-实验15-模型构造-108.5-实验15-模型构造-2 第九章:深度学习计算-模型参数的访问、初始化和共享09.1-模型参数的访问09.2-模型参数初始化和共享09.3-实验16-模型参数-109.4-实验16-模型参数-2 第十章:深度学习计算-自定义层与读取和储存10.1-不含模型参数的自定义层10.2-含模型参数的自定义层10.3-实验17-自定义层10.4-读取和储存10.5-GPU计算10.6-实验18-读取和储存  第十一章:卷积神经网络11.01-卷积神经网络11.02-卷积神经网络的组成层11.03-图像分类的局限性11.04-二维卷积层与卷积层11.05-卷积在图像中的直观作用11.06-实验19-二维卷积层11.07-填充与步幅11.08-卷积过程11.09-卷积层参数-111.10-卷积层参数-211.11-实验20-Pad和Stride11.12-多输入和输出通道11.13-实验21-多通道11.14-池化层11.15-实验22-池化层 第十二章:经典网络12.01-卷积神经网络12.02-实验23-LeNet模型12.03-深度卷积神经网络12.04-实验24-AlexNet模型12.05-使用重复元素的网络12.06-实验25-VGG模型12.07-网络中的网络12.08-实验26-NiN模型12.09-含并行连接的网络12.10-实验27-GoogLeNet模型12.11-批量归一化-112.12-批量归一化-212.13-实验28-批量归一化12.14-残差网络12.15-实验29-残差网络12.16-稠密连接网络12.17-实验30-稠密连接网络 第十三章:循环神经网络13.01-语言模型和计算13.02-n元语法13.03-RNN和RNNs13.04-标准RNN向前输出流程和语言模型应用13.05-vector-to-sequence结构13.06-实验31-语言模型数据集-113.07-实验31-语言模型数据集-213.08-实验32-从零实现循环神经网络-113.09-实验32-从零实现循环神经网络-213.10-实验32-从零实现循环神经网络-313.11-实验32-从零实现循环神经网络-413.12-实验33-简洁实现循环神经网络-113.13-实验33-简洁实现循环神经网络-2 第十四章:RNN进阶14.01-通过时间反向传播-114.02-通过时间反向传播-214.03-长短期记忆-114.04-长短期记忆-214.05-实验34-长短期记忆网络-114.06-实验34-长短期记忆网络-214.07-门控循环单元14.08-RNN扩展模型14.09-实验35-门控循环单元 第十五章:优化算法15.01-优化与深度学习15.02-局部最小值和鞍点15.03-提高深度学习的泛化能力15.04-实验36-小批量梯度下降-115.05-实验36-小批量梯度下降-215.06-动量法-115.07-动量法-215.08-实验37-动量法15.09-AdaGrad算法与特点15.10-实验38-AdaGrad算法15.11-RMSrop算法15.12-实验39-RMSProp算法15.13-AdaDelta算法15.14-实验40-AdaDelta算法15.15-Adam算法15.16-实验41-Adam算法15.17-不用二阶优化讲解与超参数 第十六章:计算视觉16.01-图像增广与挑战16.02-翻转、裁剪、变化颜色与叠加16.03-实验42-图像增广-116.04-实验42-图像增广-216.05-微调16.06-迁移学习16.07-实验43-微调-116.08-实验43-微调-216.09-目标检测16.10-边界框16.11-实验44-边界框16.12-锚框与生成多个锚框16.13-交并比16.14-实验45-生成锚框-116.15-实验45-生成锚框-216.17-标注训练集的锚框-116.18-标注训练集的锚框-216.19-实验46-标注训练集的锚框-116.20-实验46-标注训练集的锚框-216.21-实验46-标注训练集的锚框-316.22-输出预测边界框16.23-实验47-输出预测边界框-116.24-实验47-输出预测边界框-216.25-多尺度目标检测16.26-实验48-多尺度目标检测16.27-目标检测算法分类16.28-SSD与模型设计16.29-预测层16.30-损失函数16.31-SSD预测16.32-实验49-目标检测数据集16.33-实验50-SSD目标检测-116.34-实验50-SSD目标检测-216.35-实验50-SSD目标检测-316.36-实验50-SSD目标检测-416.37-实验50-SSD目标检测-516.38-实验50-SSD目标检测-6 第十七章:自然语言处理17.01-词嵌入和词向量17.02-神经网络模型17.03-跳字模型17.04-训练跳字模型17.05-连续词袋模型17.06-负采样17.07-层序softmax17.08-子词嵌入17.09-Fasttext模型17.10-全局向量的词嵌入17.11-实验51-word2vec之数据预处理-117.12-实验51-word2vec之数据预处理-217.13-实验52-word2vec之负采样-117.14-实验52-word2vec之负采样-217.15-实验53-word2vec之模型构建-117.16-实验53-word2vec之模型构建-217.17-实验54-求近义词和类比词-117.18-实验54-求近义词和类比词-217.19-实验55-文本情感分类RNN-117.20-实验55-文本情感分类RNN-217.21-实验55-文本情感分类RNN-317.22-实验55-文本情感分类RNN-417.23-TextCNN17.24-TextCNN流程17.25-实验56-文本情感分类textCNN-117.26-实验56-文本情感分类textCNN-217.27-Seq2Seq的历史与网络架构17.28-Seq2Seq的应用与存在的问题17.29-Attention制与Bucket制17.30-实验57-器翻译之模型构建-117.31-实验57-器翻译之模型构建-217.32-实验57-器翻译之模型构建-317.33-实验58-器翻译之训练评估-117.34-实验58-器翻译之训练评估-217.35-实验58-器翻译之训练评估-3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值