本博客系OUC软件工程第二次作业:“第二次作业:深度学习和 pytorch 基础”

第二次作业:深度学习和 pytorch 基础

文章目录

  • 一、视频学习心得及问题总结
    • 感想
    • 问题
  • 二、代码练习
    • 1. 基本练习
      • 1.1 定义数据
      • 1.2 定义操作
    • 2. 螺旋数据分类
    • 心得体会

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

感想

第一个视频首先介绍了什么是人工智能、人工智能的发展、人工智能的三个层面和人工智能领域。接着,又介绍了逻辑演绎和归纳总结的区别、知识工程和机器学习区别、监督和无监督学习的区别、参数和无参数模型的区别。
第二个视频是深度学习概述。主要包括浅层神经网络和从神经网络到深度学习两部分。浅层神经网络主要介绍了M-P神经元、多层感知器、万有逼近定理、神经网络每一层的作用、梯度和梯度下降。神经网络到深度学习主要介绍了神经网络的问题、自编码器和受限玻耳兹曼机。
通过这两个视频的学习我初步了解了人工智能、机器学习和深度学习的相关知识,对里面的一些概念有了大致的认识和了解。但是,在学习视频的过程中,我对M-P神经元、自编码器和受限玻耳兹曼机的相关知识感觉还是不太理解。感觉通过短短四个小时的视频要掌握这么多知识还是不够的,需要课下多查阅相关资料。

问题

  • 从神经网络的发展过程来看,既然机器学习和人工智能的发展目标是模拟甚至超越人类智能,那么为什么采取的是加深网络层数、增加新的功能单元等方式,而不是从生物学和解剖学出发,致力于模拟人类的脑部结构?

  • 我知道有一些机器学习模型是具有生物学基础的,它们致力于模拟脑部结构,例如CNN、PCNN,但是除此之外大部分都是数学基础的,例如ResNet、RNN和GAN等,为何数学基础的模型似乎更受追捧?

  • 同时也联想到,在NLP领域,他们居然用HMM、RNN、LSTM和BERT这些与人脑毫无关系的模型来完成任务,这令我非常惊讶,明明语言的处理是在人脑内完成的,但是他们对此似乎毫不关心。数学方法真的能产生智能吗?还是说智能本质是数学?

  • 学习人工智能需要哪些数学知识上的储备,或者说经常用的数学知识

  • 世界人工智能大会上,马云与马斯克对话时说,人不会创造出比自己更聪明的生物出来,机器人也绝对不可能会对人类造成威胁,不要和机器人去比象棋围棋,那是愚蠢的,机器人很clever,但是人类更smart,人类是真正具有智慧的动物。马斯克对此不置可否。那么事实到底是如何呢?随着人工智能技术的飞速发展,我们终将得到答案。人工智能+X的发展模式是会先带来工业模式的新发展、还是人们生活的智能化?深度学习进行数据处理来获得信息的方式与人的思维方式有什么本质区别?

二、代码练习

1. 基本练习

1.1 定义数据

一般定义数据用 torch.Tensor tensor 是数字各种形式的总称

import torch
# 定义一个数
x = torch.tensor(123)
print(x)

# 定义一个一维数组
x = torch.tensor([1, 2, 3, 4, 5,6])
print(x)

# 定义一个二维数组
x = torch.ones(2, 3)
print(x)

# 定义3维乃至任意维度的数组
x = torch.ones(2, 3, 4)
print(x)

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

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

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

1.2 定义操作

# 创建一个 2*4 的tensor
m = torch.Tensor([[2, 5, 3, 7],[4, 2, 1, 9]])
print(m.size(), m.size(0), m.size(1), sep='--')
# m.size(0)在这里表示行数
# m.size(1)在这里表示列数

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

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

# 返回第 1 行的所有数据
print(m[1,:])
# 返回第 1 列的所有数据
print(m[:, 1])

# 向量点乘
v = torch.arange(1, 5)
print(m.dtype)
print(v.dtype)
m@v


向量点乘的时候出现了问题,根据报错,推断是点乘双方的数据类型不同,因而无法直接点乘。
将两者的数据类型 print 出来后,果然是这个问题。
因此在声明向量 v 的时候,显示的定义为 float 类型即可。

# 向量点乘
v = torch.arange(1, 5, dtype=torch.float)
print(m.dtype)
print(v.dtype)
m@v

# 获取一个等差数列,3,8表示首尾的值,20表示总共的项数
torch.linspace(3, 8, 20)

# 引入matplotlib,绘图
from matplotlib import pyplot as plt
# 生成1000个随机数,绘制直方图。
plt.hist(torch.randn(1000).numpy(), 100)

# 生成更多的随机数,这个时候可以看到正态分布非常明显
plt.hist(torch.randn(10**6).numpy(), 100)

# tensor 向量、矩阵的拼接
# concat 方法中传入0,表示在 Y 轴方向拼接
a = torch.Tensor([[1, 2, 3, 4]])
b = torch.Tensor([[5, 6, 7, 8]])
print(torch.concat((a, b), 0))

# concat 方法中传入 1 ,表示在X轴方向拼接
print(torch.concat((a, b), 1))

2. 螺旋数据分类

用神经网络实现简单数据分类

# 引入重要的库import random
import torch
from torch import nn, optim
import math
from IPython import display
from plot_lib import plot_data, plot_model, set_default
# 因为colab是支持GPU的,torch 将在 GPU 上运行
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print('device: ', device)

N = 1000  # 每类样本的数量
D = 2  # 每个样本的特征维度
C = 3  # 样本的类别
H = 100  # 神经网络里隐层单元的数量
X = torch.zeros(N * C, D).to(device)
Y = torch.zeros(N * C, dtype=torch.long).to(device)
for c in range(C):index = 0t = torch.linspace(0, 1, N) # 在[0,1]间均匀的取10000个数,赋给t# 下面的代码不用理解太多,总之是根据公式计算出三类样本(可以构成螺旋形)# torch.randn(N) 是得到 N 个均值为0,方差为 1 的一组随机数,注意要和 rand 区分开inner_var = torch.linspace( (2*math.pi/C)*c, (2*math.pi/C)*(2+c), N) + torch.randn(N) * 0.2# 每个样本的(x,y)坐标都保存在 X 里# Y 里存储的是样本的类别,分别为 [0, 1, 2]# 每次都对 1000 个样本赋值。for ix in range(N * c, N * (c + 1)):X[ix] = t[index] * torch.FloatTensor((math.sin(inner_var[index]), math.cos(inner_var[index])))Y[ix] = cindex += 1print("Shapes:")
print("X:", X.size())
print("Y:", Y.size())

X是样本的特征矩阵,每一个样本有 D 个特征值。一共有 C 类样本,每类有 N 个样本,因此一共有 N×C 个样本,即 N×C 行,每行有 D 列,对应 D 个特征值。
Y是样本的标签,和X中的样本一一对应,因此也是 N×C 行。

# 数据可视化# visualise the data
plot_data(X, Y)


# Plot trained model
print(model)
plot_model(X, Y, model)


这里可以看到,一层线性模型分类的准确率在50%左右,这是因为线性模型在处理曲线问题的时候效果很差。
为了解决这个问题,我们在两层之间加入了一个 ReLU 激活函数

learning_rate = 1e-3
lambda_l2 = 1e-5# 这里可以看到,和上面模型不同的是,在两层之间加入了一个 ReLU 激活函数
model = nn.Sequential(nn.Linear(D, H),nn.ReLU(),nn.Linear(H, C)
)
model.to(device)# 下面的代码和之前是完全一样的,这里不过多叙述
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate, weight_decay=lambda_l2) # built-in L2# 训练模型,和之前的代码是完全一样的
for t in range(1000):y_pred = model(X)loss = criterion(y_pred, Y)score, predicted = torch.max(y_pred, 1)acc = ((Y == predicted).sum().float() / len(Y))print("[EPOCH]: %i, [LOSS]: %.6f, [ACCURACY]: %.3f" % (t, loss.item(), acc))display.clear_output(wait=True)# zero the gradients before running the backward pass.optimizer.zero_grad()# Backward pass to compute the gradientloss.backward()


可以看到,准确率达到了 0.186。

# Plot trained model
print(model)
plot_model(X, Y, model)

心得体会

  • 感受到了pytorch的便利性,以及其中张量tensor比较类似pandas中的dataframe和numpy中的ndarray,这也能从tensor类所具有的转换成上述形式的方法中看出来,就连后面的画图部分也都是转换成了ndarray来画图。

  • 尤其地能感受到pytorch给入门机器学习带来的史诗级的便利,无论是方便的矩阵运算,还是将常用的神经网络都抽象封装到库中直接调用即可,都使我们感到便捷。

  • 激活函数的重要作用,RELU这个东西虽然简单但是效果不错,准确性得到了提升。

  • 只需要两层NN就能完成这个任务,并且得到一个不错的结果,这是我没有想到的

  • 代码看的不是很明白,在螺旋数据分类模型中,使用两层神经网络里加入RelU激活函数后,可以看到分类的 准确率比线性模型提升了很多。这说明一个模型的建立,是一个不断摸索与优化的过程,机器智能化就是这样 一点一点的向人类的智能接近。

OUC_SE_Group04_Blog2相关推荐

最新文章

  1. Oracle中dbms_job包的使用
  2. axis2+myeclipse6.5环境搭建
  3. SAP Spartacus Reference App Structure
  4. 2019.01.26【NOIP普及组】模拟赛C组总结
  5. NYOJ2括号配对问题
  6. 【Linux】awk处理变量
  7. php 三大魔术方法,PHP魔术方法
  8. 【转载】C# ListView控件的一些用法
  9. 基于javaweb房屋租赁系统设计与实现
  10. 注销Apple ID的正确打开方式
  11. 基于区块链的知识共享框架-Aletheia
  12. 20190904携程机试
  13. HDU 4379 - The More The Better
  14. android 截屏 简书,Android 内置应用截屏方法
  15. DNSPod十问纪中展:从摇滚文青到科学队长
  16. 【学习笔记】Linux 系统编程入门
  17. Mybatis-Plus引入后出错的原因
  18. 自己定义控件事实上非常easy1/6
  19. 20212323 CSDN Python技能树和Markdown编辑器测评
  20. text-size-adjust属性

热门文章

  1. oracle 查看指标 tps(Transactions Per Second)
  2. 熬夜加班问题总结反思
  3. Broadcast 和 BroadcastReceiver
  4. Making FIFA Coins with FUT 14 Winter Upgrades
  5. MySQL(四)Select总结及补充聚合函数及分组过滤MD5加密
  6. TDM音频各个时钟频率关系解析
  7. 计算机取证(Computer Forensic)
  8. mybatis小问题记录下.update 更新数据nullpoint问题.
  9. visio2019专业版下载和安装包图文步骤教程
  10. zbb20171223 vm12 Vmware虚拟机设置静态IP地址