PyTorch深度学习实践---笔记

2023-10-29

2.线性模型(Linear Model)

import numpy as np
import matplotlib.pyplot as plt

x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]

def forward(x):
    return x*w
    
def loss(x,y):
    y_pred=forward(x)
    return (y_pred-y)*(y_pred-y)
    
w_list=[]
mse_list=[]
for w in np.arange(0.0,4.1,0.1):
    print('w=',w)
    l_sum=0
    for x_val,y_val in zip(x_data,y_data):
        y_pred_val=forward(x_val)
        loss_val=loss(x_val,y_val)
        l_sum+=loss_val
        print('\t',x_val,y_val,y_pred_val,loss_val)
    print('MSE=',l_sum/3)
    w_list.append(w)
    mse_list.append(l_sum/3)
    
plt.plot(w_list,mse_list)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()

在这里插入图片描述

Exercise:
在这里插入图片描述

[Link](The mplot3d toolkit — Matplotlib 3.7.1 documentation)
[docs](numpy.meshgrid — NumPy v1.25 Manual)

2.exercise

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib notebook

x_data=[1.0,2.0,3.0]
y_data=[3.0,5.0,7.0]

def forward(x):
    return x*w+b

def loss(x,y):
    y_pred=forward(x)
    return (y_pred-y)*(y_pred-y)

w_list=[]
mse_list=[]
b_list=[]
for w in np.arange(0.0,3.1,0.1):
    for b in np.arange(-1,1.1,0.1):
        print('w=',w)
        print('b=',b)
        l_sum=0
        for x_val,y_val in zip(x_data,y_data):
            y_pred_val=forward(x_val)
            loss_val=loss(x_val,y_val)
            l_sum+=loss_val
            print('\t',x_val,y_val,y_pred_val,loss_val)
        print('MSE=',l_sum/3)
        w_list.append(w)
        b_list.append(b)
        mse_list.append(l_sum/3)
W=np.array(w_list)
W=np.unique(W)
B=np.array(b_list)
B=np.unique(B)
MSE=np.array(mse_list)

W,B=np.meshgrid(W,B)
MSE=MSE.reshape(21,31)
fig=plt.figure()
ax=Axes3D(fig)
ax.plot_surface(W, B, MSE, cmap='rainbow')

ax.set_xlabel('W', color='b')
ax.set_ylabel('B', color='g')
ax.set_zlabel('MSE', color='r')
plt.show()

在这里插入图片描述

3. 梯度下降算法(Gradient Descent)

3.1梯度下降(Gradient Descent)

import matplotlib.pyplot as plt  
  
x_data = [1.0, 2.0, 3.0]  
y_data = [2.0, 4.0, 6.0]  
  
w = 1.0  
  
  
def forward(x):  
    return x * w  
  
  
def cost(xs, ys):  
    cost = 0  
    for x, y in zip(xs, ys):  
        y_pred = forward(x)  
        cost += (y_pred - y) ** 2  
    return cost / len(xs)  
  
  
def gradient(xs, ys):  
    grad = 0  
    for x, y in zip(xs, ys):  
        grad += 2 * x * (x * w - y)  
    return grad / len(xs)  
  
  
print('Predict(before training)', 4, forward(4))  
cost_list = []  
epoch_list = []  
for epoch in range(100):  
    cost_val = cost(x_data, y_data)  
    grad_val = gradient(x_data, y_data)  
    w -= 0.01 * grad_val  
    cost_list.append(cost_val)  
    epoch_list.append(epoch)  
    print('Epoch:', epoch, 'w=', w, 'loss', cost_val)  
print('Predict(after training)', 4, forward(4))  
  
plt.plot(epoch_list, cost_list)  
plt.xlabel('Epoch')  
plt.ylabel('MSE')  
plt.show()

在这里插入图片描述

3.2 随机梯度下降(Stochastic Gradient Descent)

import matplotlib.pyplot as plt  
  
x_data = [1.0, 2.0, 3.0]  
y_data = [2.0, 4.0, 6.0]  
  
w = 1.0  
  
def forward(x):  
    return x * w  
  
def loss(x, y):  
    y_pred = forward(x)  
    return (y_pred - y) ** 2  
  
def gradient(x, y):  
    return 2 * x * (x * w - y)  
  
print('Predict(before training)', 4, forward(4))  
loss_list = []  
epoch_list = []  
for epoch in range(100):  
    for x, y in zip(x_data, y_data):  
        grad = gradient(x, y)  
        w -= 0.01 * grad  
        print("\tgrad:", x, y, grad)  
        l = loss(x, y)  
    print("progress:", epoch, "w=", w, "loss=", l)  
    epoch_list.append(epoch)  
    loss_list.append(l)  
print('Predict(after training)', 4, forward(4))  
  
plt.plot(epoch_list, loss_list)  
plt.xlabel('Epoch')  
plt.ylabel('Loss')  
plt.show()

在这里插入图片描述

4. 反向传播(Back Propagation)

在这里插入图片描述

Example 1:
在这里插入图片描述

在这里插入图片描述

Exercise 4-1Answer=-8
在这里插入图片描述

Exercise 4-2 Answer.1=2,Answer.2=2

import torch
from matplotlib import pyplot as plt
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]

w=torch.Tensor([1.0])
w.requires_grad=True

def forward(x):
    return x*w

def loss(x,y):
    y_pred=forward(x)
    return (y_pred-y)**2
    
print("predict (before training)",4,forward(4).item)

epoch_list=[]
MSE_list=[]
for epoch in range(100):
    epoch_list.append(epoch)
    for x,y in zip(x_data,y_data):
        l=loss(x,y)
        l.backward()
        print('\tgrad:',x,y,w.grad.item())
        w.data=w.data-0.01*w.grad.data
        
        w.grad.data.zero_()
    print("progress:",epoch,l.item())
    MSE_list.append(l.item())
print("prdict (after training)",4,forward(4).item())


plt.plot(epoch_list,MSE_list)
plt.xlabel('Epoch')  
plt.ylabel('Loss')
plt.set_tittle("PyTorch")
plt.show()

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

Answer.1:
∂ L o s s ∂ w 1 = 2 ∗ ( w 1 ∗ x 2 + w 2 ∗ x + b − y ) ∗ x 2 \frac{\partial Loss}{\partial w_1}=2*(w_1*x^2+w_2*x+b-y)*x^2 w1Loss=2(w1x2+w2x+by)x2

Answer.2:
∂ L o s s ∂ w 2 = 2 ∗ ( w 1 ∗ x 2 + w 2 ∗ x + b − y ) ∗ x \frac {\partial Loss}{\partial w_2}=2*(w_1*x^2+w_2*x+b-y)*x w2Loss=2(w1x2+w2x+by)x

Answer.3:
∂ L o s s ∂ b = 2 ∗ ( w 1 ∗ x 2 + w 2 ∗ x + b − y ) \frac {\partial Loss}{\partial b}=2*(w_1*x^2+w_2*x+b-y) bLoss=2(w1x2+w2x+by)

在这里插入图片描述

import torch
from matplotlib import pyplot as plt
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]

w_1=torch.Tensor([1.0])
w_1.requires_grad=True
w_2=torch.Tensor([2.0])
w_2.requires_grad=True
b=torch.Tensor([3.0])
b.requires_grad=True

def forward(x):
    return w_1*(x**2)+w_2*x+b

def loss(x,y):
    y_pred=forward(x)
    return (y_pred-y)**2
    
print("predict (before training)",4,forward(4).item)

epoch_list=[]
MSE_list=[]
for epoch in range(100):
    epoch_list.append(epoch)
    for x,y in zip(x_data,y_data):
        l=loss(x,y)
        l.backward()
        print('\tgrad:','X:',x,'Y:',y,w_1.grad.item(),w_2.grad.item(),b.grad.item())
        w_1.data=w_1.data-0.01*w_1.grad.data
        w_2.data=w_2.data-0.01*w_2.grad.data
        b.data=b.data-0.01*b.grad.data
        
        w_1.grad.data.zero_()
        w_2.grad.data.zero_()
        b.grad.data.zero_()
    print("progress:",epoch,l.item())
    MSE_list.append(l.item())
print("prdict (after training)",4,forward(4).item(),'w_1=',w_1.item(),'w_2=',w_2.item(),'b=',b.data.item())


plt.plot(epoch_list,MSE_list)
plt.xlabel('Epoch')  
plt.ylabel('Loss')
plt.title("PyTorch")
plt.show()

在这里插入图片描述

5. 用PyTorch实现线性回归

在这里插入图片描述

前馈->反馈->更新
前馈算损失,反馈算梯度,然后更新,反反复复
在这里插入图片描述

import torch
x_data=torch.Tensor([[1.0],[2.0],[3.0]])
y_data=torch.Tensor([[2.0],[4.0],[6.0]])

class LinearModel(torch.nn.Module):#LinearModel相当于是继承torch.nn.Module的子类
    def __init__(self):#Python中类的初始化都是__init__()
        super(LinearModel,self).__init__()#继承父类的__init__方法,在__init__初始化方法后还想继承父类的__init__(),就在子类中使用super()函数
        self.linear=torch.nn.Linear(1,1)#定义子类的linear属性
        
    def forward(self,x):
        y_pred=self.linear(x)#调用子类的linear属性
        return y_pred
model=LinearModel()#创建类LinearModel的实例

criterion=torch.nn.MSELoss(reduction='sum')#损失函数
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)#优化器

for epoch in range(1000):#训练迭代
    y_pred=model(x_data)
    loss=criterion(y_pred,y_data)
    print(epoch,loss.item())
    
    optimizer.zero_grad()#梯度清零
    loss.backward()#反向传播
    optimizer.step()#计算梯度,梯度更新
    
print('w =',model.linear.weight.item())
print('b =',model.linear.bias.item())

x_test=torch.Tensor([4.0])
y_test=model(x_test)
print('y_pred =',y_test.data)

这篇文章可以帮助理解LinearModel的写法

python类中super()_wanghua609的博客-CSDN博客

6. 逻辑回归(Logistics Regression)

逻辑回归主要用于分类问题,线性回归的输出值是连续空间
Classification Problem

类别之间没有大小关系

分类问题的输出是一个概率问题,为Ⅰ类的概率是多少,为Ⅱ类的概率是多少…
根据概率值的最大值判断所属类别。

在这里插入图片描述

实际上计算的就是 y_hat=1 的概率。
要将输出值映射到【0,1】,因为概率值是在【0,1】的。
Sigmoid函数也是一种饱和函数(输入值x大于某个值后,输出值y基本不变)。
sigmoid函数中最出名的函数就是Logistics函数,因此大多数书籍资料中将Logistics函数成为sigmoid函数。
σ()就是sigmoid函数。
在这里插入图片描述

计算分布之间的差异。
这个用于二分类的函数,叫做BCE函数。(CE:cross-entropy)
在这里插入图片描述

在这里插入图片描述

#torch.nn.Functional.sigmoid() use torch.sigmoid() instead.
import torch
import numpy as np
import matplotlib.pyplot as plt

x_data=torch.Tensor([[1.0],[2.0],[3.0]])
y_data=torch.Tensor([[0],[0],[1]])

class LogisticRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LogisticRegressionModel,self).__init__()
        self.linear=torch.nn.Linear(1,1)
        
    def forward(self,x):
        y_pred=torch.sigmoid(self.linear(x))
        return y_pred
    
model=LogisticRegressionModel()

criterion=torch.nn.BCELoss(reduction='sum')
#size_average=True
#size_average and reduce args will be deprecated, 
#please use reduction='mean' instead.
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)

for epoch in range(1000):
    y_pred=model(x_data)
    loss=criterion(y_pred,y_data)
    print(epoch,loss.item())
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

x=np.linspace(0,10,200)
x_t=torch.Tensor(x).view((200,1))
y_t=model(x_t)
y=y_t.data.numpy()
plt.plot(x,y)
plt.plot([0,10],[0.5,0.5],c='r')
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
plt.grid()
plt.show()

在这里插入图片描述

7. 处理多维特征的输入(Multiple Dimension Input)

输入值有多个特征
每一行成为Record, 每一列叫做Feature(特征/字段),结构化的数据。
在这里插入图片描述

每一个特征值都要与一个权重相乘,x看成一个向量,乘上w1到w8,标量转置相乘做内积。
σ就是sigmoid函数。
计算转化成向量化的运算,然后通过并行计算,通过GPU的能力,提高运算速度。
矩阵可以看作是空间变换的函数。
在这里插入图片描述
在这里插入图片描述

从8个特征(8维)学到6个特征(6维)再到4个特征,最后到1个特征。
当然也可以直接从8个特征学到1个特征

import numpy as np
import torch
import matplotlib.pyplot as plt
 
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, :-1]) 
y_data = torch.from_numpy(xy[:, [-1]]) 
 
class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(8, 6)
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid() 
 
    def forward(self, x):
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x)) 
        return x
 
 
model = Model()
 
criterion = torch.nn.BCELoss(reduction='mean')  
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
 
epoch_list = []
loss_list = []

for epoch in range(100000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())
    epoch_list.append(epoch)
    loss_list.append(loss.item())
 
    optimizer.zero_grad()
    loss.backward()
 
    optimizer.step()
 
 
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

在这里插入图片描述

8. 加载数据集

Dataset主要用于构建数据集,支持索引(利用下标)
Dataloader主要用于Mini-Batch
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

笔记来源:《PyTorch深度学习实践》完结合集

9. 多分类问题

输出时,每一个输出代表每种标签的概率。属于1的概率是多少,属于2的概率是多少,等等。各个输出值大于0,且值得的合等于1。

本笔记来自:【《PyTorch深度学习实践》完结合集】 https://www.bilibili.com/video/BV1Y7411d7Ys/?share_source=copy_web&vd_source=292129053a8880be150381f42c6b50c4

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyTorch深度学习实践---笔记 的相关文章

随机推荐

  • 天龙3d服务器维护,《新天龙八部》2017年3月6日全服更新维护公告

    亲爱的玩家 大家好 为保证游戏运行的稳定性 提升整体服务质量 新天龙八部 游戏全部服务器 部分服务器将提前至5 00维护 具体服务器列表请见公告下方 将于2017年3月6日7 00 9 00进行更新维护 维护后版本号升级为3 61 5303
  • -bash: /usr/bin/yum: No such file or directory解决方案

    删除了yum文件 导致yum命令出现 bash情况 root localhost yum bash usr bin yum No such file or directory 解决方案 http mirrors 163 com centos
  • el-select下拉框:数据回显后,无法重新选中或修改

    选中其他值以后 数据并没有发生改变 且无法选中 解决 给el select 点击事件 change getTeacherId 强制数据刷新 表单同理 input getTeacherId getTeacherId val this next
  • 数据可视化第四章

    比例数据 是根据类别 子类别和群体来进行划分的数据 对于比例 通常想要得到最大值 最小值和总体分布 前两者比较简单 将数据由小到大进行排列 位于两端的分别就是最小值和最大值 数据对比也是比例可视化的一个重要应用 在一个图表中集中反映多个维度
  • 小程序页面滚动穿透

    小程序页面滚动穿透 一 场景 框架 Taro2 Taro3不生效的 在项目当中 基础遇到这样的需求 有一个长列表 或者其他可滚动展示的页面 在这个页面会弹出一个Modal层 如下 贝壳找房的 的筛选栏 二 问题 如果这个弹框内容不可滚动 不
  • java 获取系统 默认编码_Java获取Linux服务器系统默认编码格式

    一 查找java进程 ps ef grep java 二 使用jinfo命令查看java系统参数 jinfo sysprops 进程id Usage jinfo option to connect to running process ji
  • 建立良好人际关系的原则

    1 尊重原则 尊重包括两个方面 自尊和尊重他人 自尊就是在各种场合都要尊重自己 维护自己的尊严 不要自暴自弃 尊重他人就是要尊重别人的生活习惯 兴趣爱好 人格和价值 只有尊重别人才能得到别人的尊重 2 真诚原则 只有诚以待人 胸无城府 才能
  • 【图论——第四讲】dijkstra算法求单源最短路及其堆优化

    o 大家好 欢迎大家光临我的博客 面向阿尼亚学习 算法学习笔记系列持续更新中 文章目录 一 前言 二 朴素dijkstra算法 三 堆优化版dijkstra 最后 一 前言 单源最短路 指的是求一个点 到其他所有点的最短距离 即起点是固定的
  • linux系统中函数库,Linux函数库(静态函数库和动态函数库)及安装过程

    Linux 系统中存在大量的函数库 简单来讲 函数库就是一些函数的集合 每个函数都具有独立的功能且能被外界调用 我们在编写代码时 有些功能根本不需要自己实现 直接调用函数库中的函数即可 需要注意的是 函数库中的函数并不是以源代码的形式存在的
  • 从0到1设计通用数据大屏搭建平台

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Python 多线程、多进程、协程对迭代数据的耗时操作测试

    Python 多线程 多进程 协程对迭代数据的耗时操作测试 2023 03 29 CPU计算密集型 2 17s p Python中的多线程受GIL制约 因此表面上的并行 实际上是并发 完全的计算密集型任务就和串行的耗时差不多了 Deal 耗
  • 阿里云数据库配置IP白名单操作方法(以MySQL为例)

    阿里云数据库RDS创建成功后 首次连接访问RDS需要配置IP白名单 在阿里云RDS控制台即可配置IP白名单 阿里云百科来详细说下阿里云服务器RDS配置白名单的方法 阿里云服务器配置IP白名单 阿里云百科以MySQL云数据库为例 RDS My
  • vc++常见错误之二:“fatal error C1083: ”无法打开包括文件

    这个问题产生的情况有多种 解决方法也有多种 我集合了网上的各种可能 可能不全 希望对你有用 其一 原文链接 http www cnblogs com txg blog archive 2011 03 07 1974857 html 步骤1
  • Nginx配置详解

    1 基本概念 1 1 Nginx简介 Nginx是一个高性能的HTTP和反向代理服务器 特点是占用内存少 并发能力强 事实上Nginx的并发能力确实在同类型的网页服务器中表现好 Nginx专为性能优化而开发 性能是其最重要的考量 实现上非常
  • SSM网约车管理系统毕业设计源码051630

    摘 要 时代的进步催生了一些事物 网约车便是近年社会发展的衍生物 并且在不长的时间内占领了大批市场 规模的日益扩大 一些负面的东西也开始浮出水面 犹如一颗石子投入水中 涟漪不断扩张 中国有句古话 无规则不成方圆 本文主要是针对网约车管理问题
  • 【python】迷宫游戏小游戏开发(代码+报告)【独一无二】

    博 主 米码收割机 技 能 C Python语言 公众号 测试开发自动化 荣 誉 阿里云博客专家博主 51CTO技术博主 专 注 专注主流机器人 人工智能等相关领域的开发 测试技术 迷宫游戏小游戏开发 代码 报告 目录 迷宫游戏小游戏开发
  • HTML中h标签和p标签,HTML 中 br 和 p 标签的区别是什么?

    HTML 中 br 和 p 标签的区别是什么 在 html 中 br 和 p 标签都可以实现文本的换行效果 那么它们之间有什么区别吗 下面本篇文章就来给大家介绍一下 br 和 p 标签的区别 希望对大家有所帮助 区别 在 HTML 中 br
  • ERP应收应付的操作与设计--开源软件诞生21

    赤龙ERP应收应付讲解 第21篇 用日志记录 开源软件 的诞生 点亮星标 祈盼着一个鼓励 博主开源地址 码云 https gitee com redragon redragon erp GitHub https github com red
  • 使用word文档插入代码方式

    熟悉编程工作的人员知道 经常会把代码往文档里面粘贴 如何优雅 快速的 美观的在word中进行插入代码了 可以使用样式工具 使用过程如下 1 新建代码端样式 找到该页面点击新建样式 2 设置字体 3 设置段落 4 设置边框 验证
  • PyTorch深度学习实践---笔记

    PyTorch深度学习实践 笔记 2 线性模型 Linear Model 2 exercise 3 梯度下降算法 Gradient Descent 3 1梯度下降 Gradient Descent 3 2 随机梯度下降 Stochastic