• 第一次作业:深度学习基础


     

    视频学习

    之前已经看过了相关的视频,这次再看一遍,把一些重要的知识点再回顾一下。

    1. 机器学习是从数据中自动提取知识,有数据,有意义,没有解析解。机器学习三要素:

      • 模型:对要学习问题的映射。

        • 数据标记(监督学习、无监督学习、半监督学习、强化学习)

        • 数据分布(参数模型,非参数模型)

        • 建模对象(判别模型、生成模型)

      • 策略:从假设空间中学习、选择最优模型的准则(确定目标函数)

      • 算法:根据目标函数求解最优模型的具体计算方法(求解模型参数)

    2. 深度学习三个助推剂:数据、算法、计算力

    3. 深度学习的不能:

      • 算法输出不稳定,容易被攻击;

      • 模型复杂度高,难以纠错和调试;

      • 模型层级复合程度高,参数不透明;(卷积)

      • 端到端训练方式对数据依赖性强,模型增量性差;(拟合能力依赖于数据量)

      • 专注直观感知类问题,对开放性推理问题无能为力;

      • 人类知识无法有效引入进行监督,机器偏见难以避免。(数据不一定正确)

    4. 生物神经元到单层感知器,多层感知器

      • 生物神经元 多输入单输出的信息处理单元;具有阈值特性;分为兴奋性和抑制性;具有空间整合和时间整合特性。

      • M-P神经元 具有多个输入,每个输入对应一个权值,这个权值需要预先设定,所以M-P神经元没有学习能力。每个神经元还有一个阈值和一个激活函数。

      • 单层感知器 单层感知器的结构与M-P神经元一致,但是单层感知器中的权值是可以通过学习来改变的,所以单层感知器是首个可以学习的人工神经网络。

      • 多层感知器 由于单层感知器并不能解决非线性问题,多层感知器由此而生。多层感知器是在一层单层感知器的基础,叠加一层单层感知器,从而解决非线性问题(例如异或问题)。

    5. 误差的反向传播:对参数进行更新,实现对神经网络的学习过程。网络建立之后,数据从输入层进入,经过隐含层的调整,最后得到一个输出,与实际的输出相比较,就会产生一个误差。

      img

    6. 激活函数:用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。

    7. img

     

    代码练习

    图像处理基本练习

    有个小问题:

     

     

    这个问题我还在查。。

    Image读出来的是PIL的类型,而skimage.io读出来的数据是numpy格式的

    我在网上找到一个图像切割的实例 帮助理解。

     

    分类问题线性模型

     1 learning_rate = 1e-3
     2 lambda_l2 = 1e-5
     3 
     4 # nn 包用来创建线性模型
     5 # 每一个线性模型都包含 weight 和 bias
     6 model = nn.Sequential(
     7     nn.Linear(D, H),
     8     nn.Linear(H, C)
     9 )
    10 model.to(device) # 把模型放到GPU上
    11 
    12 # nn 包含多种不同的损失函数,这里使用的是交叉熵(cross entropy loss)损失函数
    13 criterion = torch.nn.CrossEntropyLoss()
    14 
    15 # 这里使用 optim 包进行随机梯度下降(stochastic gradient descent)优化
    16 optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay=lambda_l2)
    17 
    18 # 开始训练
    19 for t in range(1000):
    20     # 把数据输入模型,得到预测结果
    21     y_pred = model(X)
    22     # 计算损失和准确率
    23     loss = criterion(y_pred, Y)
    24     score, predicted = torch.max(y_pred, 1)
    25     acc = (Y == predicted).sum().float() / len(Y)
    26     print('[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f' % (t, loss.item(), acc))
    27     display.clear_output(wait=True)
    28 
    29     # 反向传播前把梯度置 0 
    30     optimizer.zero_grad()
    31     # 反向传播优化 
    32     loss.backward()
    33     # 更新全部参数
    34     optimizer.step()

    分类问题(添加了Relu函数)

     1 learning_rate = 1e-3
     2 lambda_l2 = 1e-5
     3 
     4 # 这里可以看到,和上面模型不同的是,在两层之间加入了一个 ReLU 激活函数
     5 model = nn.Sequential(
     6     nn.Linear(D, H),
     7     nn.ReLU(),
     8     nn.Linear(H, C)
     9 )
    10 model.to(device)
    11 
    12 # 下面的代码和之前是完全一样的,这里不过多叙述
    13 criterion = torch.nn.CrossEntropyLoss()
    14 optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=lambda_l2) # built-in L2
    15 
    16 # 训练模型,和之前的代码是完全一样的
    17 for t in range(1000):
    18     y_pred = model(X)
    19     loss = criterion(y_pred, Y)
    20     score, predicted = torch.max(y_pred, 1)
    21     acc = ((Y == predicted).sum().float() / len(Y))
    22     print("[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f" % (t, loss.item(), acc))
    23     display.clear_output(wait=True)
    24     
    25     # zero the gradients before running the backward pass.
    26     optimizer.zero_grad()
    27     # Backward pass to compute the gradient
    28     loss.backward()
    29     # Update params
    30     optimizer.step()

    回归问题结果

    猫狗大战的代码,我运行了一下,按照老师说的把优化器换成Adam以后,效果的确有提高。尝试按照比赛的要求写输出,因为对python语言不是很熟悉,还存在一些问题。

    本周除了完成以上深度学习的内容,还接着学习了吴恩达的机器学习课程,很多东西从基础讲起,很清晰。尤其是参数更新这一块,比以前了解得更深了。

  • 相关阅读:
    Flutter竟然发布了1.5版本!!!!
    微软最爽命令行工具发布!
    被忽略的CSS规则
    代码精进之路读后感(六-结束篇)
    深入解析QML引擎, 第4部分: 自定义解析器
    深入解析QML引擎, 第3部分: 绑定类型
    深入解析QML引擎, 第2部分: 绑定(Bindings)
    编译V8过程全纪录
    面试总结
    Qt网络编程
  • 原文地址:https://www.cnblogs.com/mujin-chuyang/p/13376415.html
Copyright © 2020-2023  润新知