第二次作业:“深度学习基础”

第二次作业:“深度学习基础”

完成一篇博客,题目为 “ 第二次作业:深度学习基础 ”

一、视频学习心得及问题总结

马翔远同学:

学习心得:通过对视频的学习,使我对于机器学习的发展历史过程有了一个清晰的把握,明白了专家系统、监督学习等的区别。也对于神经网络、单层感知器,多层感知器、逐层预训练,自编码器和受限玻尔兹曼机等等有一个概念上的认识。但是对于具体原理和数学推导没有过多提及。
问题:
1、激活函数如何选择,在数据量达到多大规模的时候,ReLU函数会明显优于Sigmoid函数
2、ReLU函数的负值导数为0,如何处理负数情况
3、自编码器是如何通过自己重构

潘子哲同学:

学习心得:
印象最深的是在讲解激活函数的时候的实例,以及讲到多层感知器的时候,可以形象的告诉我一些基本的实现原理,让我把深度学习和学过的课程(数字逻辑,自然语言处理)联系了起来
单层感知器
非线性激活函数
多层感知器
三层感知器实现同或门
深度学习可视化网址:http://Playground.tensorflow.org/
万有逼近定理
如果一个隐层包含足够多的神经元,三层前馈神经网络能以任意精度逼近任意预定的连续函数。
在这里插入图片描述
在这里插入图片描述
问题:
算法不稳定(修改一个张图片的一个像素点)
模型复杂度高,难以纠错
端到端训练方式对数据依赖性强,模型增量性差
人类知识无法有效引入进行监督,机器偏见难以避免

谭斌钰同学:

心得总结:
近几年来,人工智能、机器学习等领域发展较为迅速,我国也于2017年发布了新一代的人工智能发展规划、促进新一代产业发展的人工智能行动规划,可见各大企业对人工智能领域引起了高度重视。与此同时,人工智能凭借其能与其他领域的工作相互融合也受到广泛推崇,例如人工智能与金融产业相互结合衍生出大数据征信、个性化保险、交易决策等,这样相比于传统产业更加高效率,也更加安全。而机器学习的定义则是计算机能够利用经验提高自己的性能,其本质上是一个基于经验数据的函数估计问题,能做到从数据中学习、自动提取知识。机器学习的实现需要经过问题建模、确定目标函数、求解模型参数等学习过程,机器学习的模型分类根据数据标记可以分为监督学习模型和无监督学学习模型根据数据分布可以分为参数模型和非参数模型,根据建模对象又可以分为判别模型和生成模型,虽然深度学习是机器学习的一种,但深度学习是利用深度的神经网络,将模型处理得更为复杂,从而使模型对数据的理解更加深入。深度学习是机器学习中一种基于对数据进行表征学习的方法。
问题:
1.对于不同的问题模型,我们应该怎样确定其机器学习的模型和特征提取的分类呢?
2.不同的卷积神经网络应用在机器学习当中时有什么注意事项吗?
3.作为大学生,如何对问题基于机器学习进行算法建模呢?

卢奕宏同学:

心得总结:
自2017年来,人工智能和机器学习在人类社会的占比逐步增大,人工智能的三个层面:计算智能,感知智能以及认知智能使得“人工智能+”产业的出现且被重视发展,
而机器学习的实现是基于经验数据使计算机自动提升自己的性能,毫无疑问的,机器学习是人工智能朝更高的方向发展的必需手段,而作为机器学习的更深一层,深度学习,
利用单层或多层深度的神经网络,使得计算机可以处理的数据模型更复杂,个人认为,这是人工智能得以重视的关键,设计到深度学习的方面单单是视频中所介绍的浅层神经网络。
这一个内容涵盖的知识已是复杂,运用到的函数,算法是从未接触过的,但其都可理解为逐层加深,“一层”的算法可以理解,“多层且具有隐层”的算法就复杂的不止一点,
个人认为,深度学习的关键还是理解浅层神经网络,以此为出发点,由神经网络进入深度学习,这一步是最难的。
问题:
万有逼近定理有点难理解
三层前馈神经网络的BP算法
解决梯度消失方法

马汉卿同学:

学习心得:
通过视频的学习,我首先了解了人工智能的三个层面:计算智能、感知智能和认知智能。其次,我也了解了机器学习的步骤:问题建模、确定目标函数、求解模型参数三步,总结来说就是模型、策略、算法三方面。通过继续学习,我也知道了深度学习相比于传统机器学习的一大明显优势:学习时间短,效率高。但是深度学习也存在一些缺点,例如模型复杂度高,难以纠错和调试、模型层级复合程度高,参数不透明等,但这些缺点相对于它的优势,是完全可以忽略的。之后又学习了深度学习神经网络基础的相关知识,此部分学习了浅层神经网络的部分知识,如误差反向传播,梯度下降和消失等等,其中有许多复杂的公式与推导,所以说深度学习的学习,数学基础要牢固!之后还介绍了逐层预训练,自编码器和受限玻尔兹曼机等的相关内容,难度也挺大的,不太容易理解。通过此次学习,我感受到了深度学习的强大,当然也感受到了它的难度,要想学习深度学习的相关知识,必须要付出努力。
问题总结:
1.对于三层前馈神经网络的BP算法过程不太理解。
2.对于受限玻尔兹曼机的条件概率建模不太理解。
3.对于玻尔兹曼分布的sigmoid激活函数的求解过程不太懂。

祁耀东同学:

总结:主要讲述了深度学习相比传统机器学习效果好,效率高,但深度学习存在6个“不能”,需要根据不同的缺点进行对症下药,让机器越学与聪明,避免对牛弹琴。深度学习作为神经网络的一种,且是当神经网络有深层的一种,但神经网络还有浅层,每一层有不同的作用,多层神经网络可看成一个复合的非线性多元函数,误差通过梯度传播,在增加深度时需要考虑误差的传播,导致了神经网络第二次的衰落。逐层预训练的方法,重新让神经网络东山再起,能改善梯度消失的问题,避免差的局部极小值。
问题:
1.逐层预训练后,误差通过梯度传播是否会更加难,导致提升准确率难度大?

二、代码练习

1.pytorch 基础练习

(1)定义数据

import torch

# 可以是一个数
x = torch.tensor(666)
print(x)

在这里插入图片描述

# 可以是一维数组(向量)
x = torch.tensor([1,2,3,4,5,6])
print(x)

在这里插入图片描述

# 可以是二维数组(矩阵)
x = torch.ones(2,3)
print(x)

在这里插入图片描述

# 可以是任意维度的数组(张量)
x = torch.ones(2,3,4)
print(x)

在这里插入图片描述

# 创建一个空张量
x = torch.empty(5,3)
print(x)

在这里插入图片描述

# 创建一个随机初始化的张量
x = torch.rand(5,3)
print(x)

在这里插入图片描述

# 创建一个全0的张量,里面的数据类型为 long
x = torch.zeros(5,3,dtype=torch.long)
print(x)

在这里插入图片描述

# 基于现有的tensor,创建一个新tensor,
# 从而可以利用原有的tensor的dtype,device,size之类的属性信息
y = x.new_ones(5,3)   #tensor new_* 方法,利用原来tensor的dtype,device
print(y)

在这里插入图片描述

z = torch.randn_like(x, dtype=torch.float)    # 利用原来的tensor的大小,但是重新定义了dtype
print(z)

在这里插入图片描述

(2)定义操作

凡是用Tensor进行各种运算的,都是Function

最终,还是需要用Tensor来进行计算的,计算无非是

基本运算,加减乘除,求幂求余
布尔运算,大于小于,最大最小
线性运算,矩阵乘法,求模,求行列式
基本运算包括: abs/sqrt/div/exp/fmod/pow ,及一些三角函数 cos/ sin/ asin/ atan2/ cosh,及 ceil/round/floor/trunc 等具体在使用的时候可以百度一下

布尔运算包括: gt/lt/ge/le/eq/ne,topk, sort, max/min

线性计算包括: trace, diag, mm/bmm,t,dot/cross,inverse,svd 等

不再多说,需要使用的时候百度一下即可。下面用具体的代码案例来学习。

# 创建一个 2x4 的tensor
m = torch.Tensor([[2, 5, 3, 7],
                  [4, 2, 1, 9]])

print(m.size(0), m.size(1), m.size(), sep=' -- ')

在这里插入图片描述

# 返回 m 中元素的数量
print(m.numel())

在这里插入图片描述

# 返回 第0行,第2列的数
print(m[0][2])

在这里插入图片描述

# 返回 第1列的全部元素
print(m[:, 1])

在这里插入图片描述

# 返回 第0行的全部元素
print(m[0, :])

在这里插入图片描述


# Create tensor of numbers from 1 to 5
# 注意这里结果是14,没有5
v = torch.arange(1, 5)
print(v)

在这里插入图片描述

# Scalar product
m @ v

在这里插入图片描述

# Calculated by 1*2 + 2*5 + 3*3 + 4*7
m[[0], :] @ v

在这里插入图片描述

# Add a random tensor of size 2x4 to m
m + torch.rand(2, 4)

在这里插入图片描述

# 转置,由 2x4 变为 4x2
print(m.t())

# 使用 transpose 也可以达到相同的效果,具体使用方法可以百度
print(m.transpose(0, 1))

在这里插入图片描述

# returns a 1D tensor of steps equally spaced points between start=3, end=8 and steps=20
torch.linspace(3, 8, 20)

在这里插入图片描述

from matplotlib import pyplot as plt

# matlabplotlib 只能显示numpy类型的数据,下面展示了转换数据类型,然后显示
# 注意 randn 是生成均值为 0, 方差为 1 的随机数
# 下面是生成 1000 个随机数,并按照 100 个 bin 统计直方图
plt.hist(torch.randn(1000).numpy(), 100);

在这里插入图片描述


# 当数据非常非常多的时候,正态分布会体现的非常明显
plt.hist(torch.randn(10**6).numpy(), 100);

在这里插入图片描述

# 创建两个 1x4 的tensor
a = torch.Tensor([[1, 2, 3, 4]])
b = torch.Tensor([[5, 6, 7, 8]])

# 在 0 方向拼接 (即在 Y 方各上拼接), 会得到 2x4 的矩阵
print( torch.cat((a,b), 0))

在这里插入图片描述

# 在 1 方向拼接 (即在 X 方各上拼接), 会得到 1x8 的矩阵
print( torch.cat((a,b), 1))

在这里插入图片描述

2.螺旋数据分类

在这里插入图片描述

这里的参数需要随机初始化,否则会因为隐层的各个神经元的结果都是一样的,从而正向传播的结果是一样的,反向传播得到的梯度也是一样的,使得多次迭代,更新的值都相同,达不到学习不同特征的目的。

在这里插入图片描述
在这里插入图片描述
这步是产生样本X和标签Y,将X和Y都放到GPU上运行。

(1)、构建线性模型分类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先调用库函数,创建线性模型,含有两个全连接层,(2,100)、(100,3)最后的到的结果的size是(3000,3)。将数据训练1000次,计算损失,并且记录值最大的位置,即预测属于三类中的哪一类,记录正确的次数算正确率。之后就梯度清零,反向传播更新参数。可以看到结果并不好,原因是没有激活函数如sigmoid、ReLU等函数进行非线性转换,只能线性分割,所以效果不好。

(2)、构建两层神经网络分类

在这里插入图片描述
在这里插入图片描述
这里和上面只有模型构建不同,在两层之间加入了激活函数ReLU,可以实现非线性转换,所以可以很好地实现螺旋数据分类,准确率由0.500上升到了0.926。

通过这次练习,学习到了调用pytorch库进行模型构建、训练、反向传播、更新参数,实现螺旋数据分类,通过两次的结果比较发现,只有加入了非线性激活函数之后就可以处理非线性的分割(ReLU函数也是非线性的,看起来两端分别线性,但是合起来是非线性)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值