当前位置:   article > 正文

2022Q软件工程第二次作业:深度学习和pytorch基础+pytorch基础练习_深度学习pytorch期末大作业

深度学习pytorch期末大作业

第一部分 深度学习和pytorch基础

01绪论

01绪论-视频学习资料

人工智能和机器学习概述

1. 人工智能军备竞赛

2. …

3. 什么是人工智能

4. 人工智能的起源

5. 图灵与人工智能

图灵测试

验证码系统

模仿游戏

6. 人工智能发展性事件

7. 人工智能发展阶段

8. **人工智能的三个层面**

  1. 计算智能:能存能算

    ”深蓝“——深蓝算法

  2. 感知智能:能听会说、能看会认

    类似于人的视觉、听觉、触觉等感知能力

  3. 认知智能:能思考、会理解

    逻辑推理、知识理解、决策思,概念、意识、观念都属于认知智能。

9. 人工智能的应用 1. 人工智能+金融

  1. 人工智能+内容创作

人工智能+内容创作

  1. 人工智能+机器人

人工智能+机器人

10. 人工智能>机器学习>深度学习
1. 人工智能:一个目标、邻域

2. 机器学习:实现人工智能的一类方法

3. 深度学习:机器学习的一部分

4. 一些例子
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

  1. 知识工程与机器学习
    知识工程与机器学习
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

11. 机器学习
1. 机器学习的定义——>从数据中自动提取知识

       最常用定义:“计算机系统能够利用经验提高自身的性能从数据中自动提取知识”

       可操作定义:“机器学习本质是一个基于经验数据的函数估计问题”

       统计学定义:提取重要模式、趋势、并理解数据,即从数据中学习。

2. 机器学习怎么学——模型、策略、算法
	![在这里插入图片描述](https://img-blog.csdnimg.cn/f95ab9d4d4cc4334a9472150dc3c914d.png)

   1.模型分类·:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

模型分类
2. 数据标记
在这里插入图片描述
3.数据分布
在这里插入图片描述
4.建模对象
在这里插入图片描述

安利-机器学习书籍推荐

在这里插入图片描述

02深度学习概述

深度学习

人工智能-机器学习-深度学习

在这里插入图片描述

人工设计特征

人工设计特征

传统机器学习与深度学习

在这里插入图片描述

前深度学习

在这里插入图片描述

后深度学习

在这里插入图片描述

下棋-人工智能-博弈搜索树-暴力搜索

感知器

在这里插入图片描述

神经网络-深度学习的几个大人物

卷积神经网络

在这里插入图片描述
神经网络改名叫深度学习

在这里插入图片描述
在这里插入图片描述

深度学习:算法、算力、数据

神经网络结构的发展

在这里插入图片描述
ImageNet比赛
在这里插入图片描述
在这里插入图片描述
该比赛被淘汰—低于人类

深度学习的琴棋书画
Google无人驾驶自行车

用户放在首位:

自动调整脚踏板、’倒了自己起来、遇到危险自己停车、随时调控让自行车来指定位置接我。。。。。。
  • 1

在这里插入图片描述

第二部分 pytorch基础练习

Spiral classifciation螺旋分类

pip install  wget
  • 1
Requirement already satisfied: wget in c:\users\asus\anaconda3\lib\site-packages (3.2)
Note: you may need to restart the kernel to use updated packages.
  • 1
  • 2
import wget
#引入基本的库
url='https://raw.githubusercontent.com/Atcold/pytorch-Deep-Learning/master/res/plot_lib.py'
file_name=wget.download(url)
print(file_name)
  • 1
  • 2
  • 3
  • 4
  • 5
plot_lib (4).py
  • 1

!wget https://raw.githubusercontent.com/Atcold/pytorch-Deep-Learning/master/res/plot_lib.py
报错:‘wget’ 不是内部或外部命令,也不是可运行的程序
或批处理文件。

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)

# 初始化随机数种子。神经网络的参数都是随机初始化的,
# 不同的初始化参数往往会导致不同的结果,当得到比较好的结果时我们通常希望这个结果是可以复现的,
# 因此,在pytorch中,通过设置随机数种子也可以达到这个目的
seed = 12345
random.seed(seed)
torch.manual_seed(seed)

N = 1000  # 每类样本的数量
D = 2  # 每个样本的特征维度
C = 3  # 样本的类别
H = 100  # 神经网络里隐层单元的数量
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
device:  cpu
  • 1

初始化 X 和 Y。 X 可以理解为特征矩阵,Y可以理解为样本标签。 结合代码可以看到,X的为一个 NxC 行, D 列的矩阵。C 类样本,每类样本是 N个,所以是 N*C 行。每个样本的特征维度是2,所以是 2列。

在 python 中,调用 zeros 类似的函数,第一个参数是 y方向的,即矩阵的行;第二个参数是 x方向的,即矩阵的列,大家得注意下,不要搞反了。下面结合代码看看 3000个样本的特征是如何初始化的。

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]
    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())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
Shapes:
X: torch.Size([3000, 2])
Y: torch.Size([3000])
  • 1
  • 2
  • 3
# visualise the data
plot_data(X, Y)
  • 1
  • 2

在这里插入图片描述

1.构建线性模型分类

learning_rate = 1e-3
lambda_l2 = 1e-5

# nn 包用来创建线性模型
# 每一个线性模型都包含 weight 和 bias
model = nn.Sequential(
    nn.Linear(D, H),
    nn.Linear(H, C)
)
model.to(device) # 把模型放到GPU上

# nn 包含多种不同的损失函数,这里使用的是交叉熵(cross entropy loss)损失函数
criterion = torch.nn.CrossEntropyLoss()

# 这里使用 optim 包进行随机梯度下降(stochastic gradient descent)优化
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, weight_decay=lambda_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)

    # 反向传播前把梯度置 0 
    optimizer.zero_grad()
    # 反向传播优化 
    loss.backward()
    # 更新全部参数
    optimizer.step()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
[EPOCH]: 999, [LOSS]: 0.861541, [ACCURACY]: 0.504
  • 1

这里对上面的一些关键函数进行说明:

使用 print(y_pred.shape) 可以看到模型的预测结果,为[3000, 3]的矩阵。每个样本的预测结果为3个,保存在 y_pred 的一行里。值最大的一个,即为预测该样本属于的类别

score, predicted = torch.max(y_pred, 1) 是沿着第二个方向(即X方向)提取最大值。最大的那个值存在 score 中,所在的位置(即第几列的最大)保存在 predicted 中。下面代码把第10行的情况输出,供解释说明

此外,大家可以看到,每一次反向传播前,都要把梯度清零,这个在知乎上有一个回答,大家可以参考:https://www.zhihu.com/question/303070254

print(y_pred.shape)
print(y_pred[10, :])
print(score[10])
print(predicted[10])
  • 1
  • 2
  • 3
  • 4
torch.Size([3000, 3])
tensor([-0.2245, -0.2594, -0.2080], grad_fn=<SliceBackward>)
tensor(-0.2080, grad_fn=<SelectBackward>)
tensor(2)
  • 1
  • 2
  • 3
  • 4
# Plot trained model
print(model)
plot_model(X, Y, model)
  • 1
  • 2
  • 3
Sequential(
  (0): Linear(in_features=2, out_features=100, bias=True)
  (1): Linear(in_features=100, out_features=3, bias=True)
)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

上面使用 print(model) 把模型输出,可以看到有两层:

第一层输入为 2(因为特征维度为主2),输出为 100;
第二层输入为 100 (上一层的输出),输出为 3(类别数)
从上面图示可以看出,线性模型的准确率最高只能达到 50% 左右,对于这样复杂的一个数据分布,线性模型难以实现准确分类。

2. 构建两层神经网络分类

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()
    # Update params
    optimizer.step()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
[EPOCH]: 999, [LOSS]: 0.178388, [ACCURACY]: 0.949
  • 1
# Plot trained model
print(model)
plot_model(X, Y, model)
  • 1
  • 2
  • 3
Sequential(
  (0): Linear(in_features=2, out_features=100, bias=True)
  (1): ReLU()
  (2): Linear(in_features=100, out_features=3, bias=True)
)
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述


  • 1
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号