OUC_SE_Group04_Blog2

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

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

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

感想

第一个视频首先介绍了什么是人工智能、人工智能的发展、人工智能的三个层面和人工智能领域。接着,又介绍了逻辑演绎和归纳总结的区别、知识工程和机器学习区别、监督和无监督学习的区别、参数和无参数模型的区别。
第二个视频是深度学习概述。主要包括浅层神经网络和从神经网络到深度学习两部分。浅层神经网络主要介绍了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 = 0
    t = 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] = c
        index += 1

print("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 gradient
    loss.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激活函数后,可以看到分类的 准确率比线性模型提升了很多。这说明一个模型的建立,是一个不断摸索与优化的过程,机器智能化就是这样 一点一点的向人类的智能接近。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OUC数据库复习CSDN是指在中国软件开发者社区CSDN上,通过学习和复习中国海洋大学(OUC)数据库相关的知识。 中国海洋大学数据库课程是计算机相关专业的重要课程之一,强调学生对数据库的理论知识和实践技能的掌握。学生在学习数据库课程期间,可以通过CSDN平台上的相关资源进行复习。 CSDN是中国最大的技术社区之一,拥有大量的技术博客、论坛和教程资源。在CSDN上,有很多关于数据库的博文和教程,涵盖了数据库的基本概念、SQL语言、存储过程、触发器等方面的知识。这些博文和教程不仅可以帮助学生复习数据库的各个方面,还能够深入了解数据库的应用和开发技巧。 另外,CSDN上还有一些数据库相关的实例教程和项目案例,可以帮助学生将理论知识转化为实际应用。这些教程和案例提供了数据库在不同领域的应用实例,如电子商务、社交网络、医疗健康等,能够帮助学生更好地理解数据库的实际应用场景。 通过在CSDN上复习OUC数据库课程,学生可以获得更广泛的数据库知识,并与其他开发者交流和分享经验。另外,CSDN还提供了一些数据库技术的最新动态和行业趋势,帮助学生了解数据库领域的最新发展。 综上所述,OUC数据库复习CSDN是一种便捷高效的学习方式,学生通过CSDN平台可以找到大量的数据库相关资源,帮助他们巩固和提升数据库知识和技能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值