AI Studio学习笔记:李宏毅机器学习 研讨课(三)

深度学习前置知识:

线性映射的复合 依然是 线性映射。

前馈神经网络:

                L:神经网络的层数

                z^{(l)}\epsilon R^{M^{l}}:第l层的神经元的净输入

                a^{(l)}\epsilon R^{M^{l}} : 第l层神经元的输出

关于神经元计算:

                z_{i}^{l+1}=\sum_{j}^{}W_{ij}^{(l)}a_{j}^{l}+b{_{i}}^{(j)}全连接:l+1的第i个神经元和 l 层的第 j个神经元 连接

                a_{i}^{l+1}=f(z_{i}^{l+1})

关于矩阵计算:

                z_{}^{l+1}=W_{}^{l}a_{}^{l}+b_{}^{l}

                a_{}^{l+1}=f(z{_{}}^{l+1})

关于数据处理:

原始数据输入->线性变化(Y=AX+b)->激活函数(Z=\sigma(Y))->神经元得到输入输出->所有神经元后计算loss

pytorch中backward():反向传播计算中自动求梯度

均方误差作为目标函数:E_{total}=\sum\frac{1}{2}(target-output)^{2}      E损失函数

                  损失函数E -> 激活函数结果out -> 线性函数结果 net


再计算完损失函数后,要根据损失函数的结果再把前面的所有参数更新一遍(为了找到模型的最优参数),包括权重参数 w , 偏置 b 。

1.先更新离输出结果 out_{o1} 的 w_{5},w_{6},w_{7},w_{8}

        更新w_{5}w_{6}w_{7}w_{8} 和 更新  w_{1}w_{2}w_{3}w_{4} 不同 。距离输入结果的深度不同,所求导数也不同。

2.再更新w_{1}w_{2}w_{3}w_{4} 

        因为 w_{1}w_{2}w_{3}w_{4} 和 损失函数  E 的复合关系(就像复合函数一样),因此我们想求 E 关于 w_{i}的梯度 ,就要把关系一层层拆开(借助中间函数求梯度)。

        (1).由上面的图简单分析,损失函数E由两个神经元的输出结果决定(out_{o1},out_{o2})。

求梯度,则是\frac{\partial E_{total}}{\partial out_{h1}}

                不理解为什么要拆开算???懂了懂了

 

 更新w_{1}w_{2}w_{3}w_{4} 。

 以学习率 更新权重参数:  \partial ^{*}(学习率)

                w_{1}^{+}=w_{1}-\sigma ^{*}\frac{\partial E_{total}}{\partial w_{1}}

                再更新 偏置梯度 b^{+}: 

                \frac{\partial E_{total}}{\partial b_{i}}=\frac{\partial E_{total}}{\partial out_{o1}}*\frac{\partial out_{o1}}{\partial net_{o1}}*\frac{\partial net_{o1}}{b_{i}}

sigmoid激活函数:S(x)=\frac{1}{1+e^{-x}}

                求导:S'(x)=\frac{e^{x}}{(1+e^{-x})^{2}}=S(x)(1-S(x))

更新完权重参数,即完成了一次向前传播和 反向传播 。

卷积神经网络:

        全连接神经网络的缺点:参数爆炸

                                                图像本身信息“局部相关行”强

        CNN超参:Kernel size , Stride , Padding

        卷积与池化 :平均池化,最大池化

        在池化时导致的失真问题:论文阅读  我们通常用最大池化。

框架学习建议:要学会利用官网

关于实例:

                Python 内置函数: enumerate() 函数

                enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

                Python 2.3. 以上版本可用,2.6 添加 start 参数。         

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

                CrossEntropyloss:  交叉熵损失函数

在pytorch中, CrossEntropyloss()把输出结果进行sigmoid(将数据设置到0-1之间),随后再放入到传统的交叉熵损失函数中,就会得到结果。来源

 paddle的 nll_loss 函数:相关了解

optimizer : 优化器   paddle.optimizer.Adam  关于Adam , 关于动量

                Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使参数比较稳定。 

CSV文件:逗号分隔文件 (Comma Separated Values) 的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件。

BN:Batch Normalization

Linear:线性分类器

epoch、iteration 和 batch_size :

                (1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;
                (2)iteration:1个iteration等于使用batchsize个样本训练一次;
                (3)epoch:1个epoch等于使用训练集中的全部样本训练一次;

        举个例子,训练集有1000个样本,batchsize=10,那么:
                训练完整个样本集需要:100次iteration,1次epoch。来源

关于项目逻辑:

                        数据准备:解压数据集food-11

                        环境配置与安装

                        导入相关包 与定义数据集

                        设置batch_size 并 加载 数据集与验证集

                        模型构建 :卷积神经网络时常使用 “Conv+BN+激活+池化” 作为一个基础block ,我们可以将多个block堆叠在一起,进行特征提取,最后连接一个Linear层, 实现图片分类。

print('start training...')
for epoch in range(epoch_num): #循环epoch次数
    epoch_start_time = time.time()
    train_acc = 0.0
    train_loss = 0.0
    val_acc = 0.0
    val_loss = 0.0

    # 模型训练
    model.train()
    for img, label in train_loader():
        optimizer.clear_grad()
        pred = model(img)
        step_loss = loss(pred, label)
        step_loss.backward()
        optimizer.step()

        train_acc += np.sum(np.argmax(pred.numpy(), axis=1) == label.numpy())
        train_loss += step_loss.numpy()[0]

    # 模型验证
    model.eval()
    for img, label in val_loader():
        pred = model(img)
        step_loss = loss(pred, label)
        
        val_acc += np.sum(np.argmax(pred.numpy(), axis=1) == label.numpy())
        val_loss += step_loss.numpy()[0]

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值