目录

  • 0.前言
  • 1.单层神经网络
    • 1.1 单层神经网络基础(线性回归算法)
    • 1.2 torch.nn.Linear实现单层回归神经网络的正向传播
  • 2.二分类神经网络:逻辑回归
    • 2.1 逻辑回归与门代码实现
    • 2.2 符号函数
      • 2.2.1 sign函数
      • 2.2.2 Relu函数
      • 2.2.3 tant函数
  • 3. 多分类神经网络:Softmax回归
    • 3.1 Softmax回归代码实现

0.前言

从本博客开始,以菜菜九天的深度学习课为基础,从零开始学习深度学习,好好地把握知识点,让自己学有所成.

1.单层神经网络

1.1 单层神经网络基础(线性回归算法)

神经网络是模仿人类大脑结构所构建的算法,在人脑里,我们有轴突连接神经元,在算法中,数据从神经网络的左侧输入,让神经元处理之后,从右侧输出结果.如下图所示:

    线性回归算法是机器学习中的回归类算法,多元线性回归指的就是一个样本对应多个特征的线性回归问题。假设我们的数据现在就是二维表,对于一个有特征的样本而言,它的预测结果可以写作一个方程:   w和b被统称为模型的权重,其中b被称为截距,也叫做偏差,w1到wn被称为回归系数,也叫作权重,xi1到xin是样本i上的不同特征。线性回归的任务,就是构造一个预测函数来映射输入的特征矩阵和标签值的线性关系上图的式子转换一下,就变成了单层神经网络:



     在上述过程中,左侧的是神经网络的输入层。输入层由众多承载数据用的神经元组成,数据从这里输入,并流入处理数据的神经元中。在所有神经网络中,输入层永远只有一层,且每个神经元上只能承载一个特征或一个常量(通常都是1).
  右侧的是输出层,输出层由大于等于一个神经元组成,我们可以从这一层来获取预测结果。输出层的每个神经元上都承载着单个或多个功能,可以处理被输入神经元的数据。在线性回归中,这个功能就是“加和”,当我们把加和替换成其他的功能,就能够形成各种不同的神经网络.

1.2 torch.nn.Linear实现单层回归神经网络的正向传播

特征和标签数据如下所示:

x0 x1 x2 Y
1 0 0 -0.2
1 1 0 -0.05
1 0 1 -0.05
1 1 1 0.1
import torchX = torch.tensor([[0,0],[1,0],[0,1],[1,1]], dtype = torch.float32)output = torch.nn.Linear(2,1)# output.weight #查看生成的w
# output.bias #查看生成的b
# output = torch.nn.Linear(2,1,bias=False) //如果我们希望不拟合常量b,在实例化时将参数bias设置为False即可# torch.random.manual_seed(420) #人为设置随机数种子zhat = output(X)

注意事项:

  1.nn.Linear需要输入两个参数,分别是(上一层的神经元个数,这一层的神经元个 数)。上一层是输入层,因此神经元个数由特征的个数决定(2个)。这一层是输出层,作为回归神经网络,输出层只有一个神经元。因此nn.Linear中输入的是(2,1)

  2.只定义了X,没有定义w和b。所有nn.Module的子类,形如nn.XXX的层,都会在实例化的同时随 机生成w和b的初始值.

  3.output.weight #查看生成的w output.bias #查看生成的b

  4.torch.random.manual_seed(100) #人为设置随机数种子

  5.人为设置随机数种子中间空间的值可以随便填写,设置随机数的目的在于随机生成的W和b会固定下来,不然在调用Linear函数时,每次运行都会产生不同的随机数

2.二分类神经网络:逻辑回归

线性回归是统计学经典算法,它能够拟合出一条直线来描述变量之间的线性关系。但在实际中,变量之间的关系通常都不是一条直线,而是呈现出某种曲线关系。为了更好的拟合曲线,其中提到了Sigmoid函数,图像如下图:


   从图像上就可以看出,当自变量 趋近正无穷时,因变量趋近于1,而当趋近负无穷时, 趋近于0,这使得sigmoid函数能够将任何实数映射到(0,1)区间,让sigmoid函数能够将连续性变量转化为离散型变量,也就是化能够将回归算法转化为分类算法.
   将线性回归方程的结果作为自变量带入sigmoid函数,得出的数据就一定是(0,1)之间的值。此时,只要我们设定一个阈值(比如0.5),规定大于0.5时,预测结果为1类,小于0.5时,预测结果为0类,则可以顺利将回归算法转化为分类算法.此时,我们的标签就是类别0和1了.这个阈值可以自己调整,在没有调整之前,一般默认0.5.

2.1 逻辑回归与门代码实现

给定特征和标签

import torch#特征张量X,定义数据类型
X = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32)#标签Y
andgate = torch.tensor([0,0,0,1], dtype = torch.float32)#定义w,预定义的一组值,更好的看出结果
w = torch.tensor([-0.2,0.15,0.15], dtype = torch.float32)def LogisticR(X,w):zhat = torch.mv(X,w)  #矩阵与向量相乘得到z#设置阈值为0.5, 使用列表推导式将值转化为0和1andhat = torch.tensor([int(x) for x in sigma >= 0.5], dtype = torch.float32) return sigma, andhat


2.2 符号函数

在上述的代码中,我们知道了Sigmoid实现了将连续型数值转换为分类型数值的作用,除了Sigmoid函数之外,还有许多其他的函数可以被用来将连续型数据分割为离散型数据,如下面的图片所示.

2.2.1 sign函数

2.2.2 Relu函数


2.2.3 tant函数

3. 多分类神经网络:Softmax回归

之前介绍分类神经网络时,我们只说明了二分类问题,即标签只有两种类别的问题(0和1,猫和狗,虽然在实际应用中许多分类问题都可以用二分类的思维解决,但依然存在很多多分类的情况.
    最典型的就是手写数字的识别问题。计算机在识别手写数字时,需要对每一位数字进行判断,而个位数字总共有10个,所以手写数字的分类是十分类问题,一般分别用0~9表示。
     真实使用的神经网络往往是一个庞大的算法,建立一个模型就会耗费很多时间,因此必须建立很多个模型来求解的方法对神经网络来说就不够高效,我们有更好的方法来解决这个问题,那就是softmax回归。

Softmax函数是深度学习的基础,它是神经网络进行多分类时,默认放在输出层中处理数据的函数。假设现在神经网络是用于三分类数据,且三个分类分别是苹果,香蕉和橘子,序号则分别是分类1、分类2和分类3。则使用softmax函数的神经网络的模型会如下所示:

     与二分类一样,我们从左侧输入特征,从右侧输出概率,通过softmax函数来进行计算。softmax的输出层有三个神经元,分别输出该样本的真实标签是苹果和香蕉和橘子的概率 。在多分类中,神经元的个数与标签类别的个数是一致的,如果是十分类,在输出层上就会存在十个神经元,分别输出十个不同的概率。此时,样本的预测标签就是所有输出的概率中最大的概率对应的标签类别。

     当我们有三个分类,分别是苹果,橘子和香蕉的时候,样本i被分类为橘子的概率为:

3.1 Softmax回归代码实现

//按照上图的输入输出图实现代码:
import torch from torch.nn import functional as FX = torch.tensor([[0,0],[1,0],[0,1],[1,1]], dtype = torch.float32)
torch.random.manual_seed(420)
dense = torch.nn.Linear(2,3)  # 输出层上的神经元个数是3个
zhat = dense(X)
sigma = F.softmax(zhat,dim=1)
sigma.shape # 4个样本,每个样本都有自己的3个类别对应的3个概率

从零开始的深度学习之旅(1)相关推荐

  1. java五子棋代码详解_代码详解:Java和Valohai的深度学习之旅

    全文共10735字,预计学习时长22分钟或更长 有一款生命周期管理工具(也称云服务)叫做Valohai,它有着友好的用户界面和简洁的布局设计. 许多有关Valohai的案例和文档都是基于Python和 ...

  2. 是选择Keras还是PyTorch开始你的深度学习之旅呢?

    点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 135 篇文章,本文大约 7000 字,阅读大约需要 20 分钟 原文 ...

  3. 从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构

    从零开始编写深度学习库(四)Eigen::Tensor学习使用及代码重构 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce   qq:1393852684 一. ...

  4. 从零开始编写深度学习库(三)ActivationLayer网络层CPU实现

    从零开始编写深度学习库(三)ActivationLayer网络层CPU实现 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce   qq:1393852684 一 ...

  5. 从零开始编写深度学习库(二)FullyconnecteLayer CPU编写

    从零开始编写深度学习库(二)FullyconnecteLayer CPU编写 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce   qq:1393852684 ...

  6. 从零开始编写深度学习库(一)SoftmaxWithLoss CPU编写

    从零开始编写深度学习库(一)SoftmaxWithLoss CPU编写 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce   qq:1393852684 一.C ...

  7. 【从零开始学深度学习编译器】十三,如何在MLIR里面写Pass?

    [GiantPandaCV导语]这篇文章是学习了比较久然后按照自己的理解步骤重新总结了下来,主要是MLIR Toy Tutorials第3,4篇文章的内容.这里主要讲解了如何在MLIR中自定义Pass ...

  8. 【从零开始学深度学习编译器】十二,MLIR Toy Tutorials学习笔记一

    本笔记由学习MLIR Tutorials总结而成,欢迎批评指正. Chapter1: Toy语言和AST MLIR提供了一种Toy语言来说明MLIR的定义和执行的流程.Toy语言是一种基于张量的语言, ...

  9. 从零开始的深度学习(一) 经典CNN网络 LeNet-5

    从零开始的深度学习(一) 经典CNN网络 LeNet-5 之前的四篇博客围绕着一个大作业项目来进行的入门,由于小白初涉,因此行文中有时侧重于某些并不重要的东西,同时也忽略了许多其实蛮重要的东西,再加上 ...

最新文章

  1. Windows下PCL1.9.1配置(编译源码)
  2. linux命令face,linux下配置face_recognition
  3. OPPO和微软合作,开放“召唤小冰”
  4. WinServer-FTP搭建
  5. [推荐]数据库索引碎片的自动重建或重组
  6. Ubuntu12.10-amd64系统上搭建Android4.2(JellyBean)源码开发环境
  7. mysql计算1天后的时间_mysql 计算某个时间,多少天后,多少个月后时间戳
  8. 新浪微博之XSS蠕虫脚本源码讲解
  9. matlab 计算 工程,matlab工程计算.doc
  10. 电脑长时间睡眠会自动关机吗_长期对着电脑皮肤会变黑吗?经常对电脑如何保护皮肤?...
  11. /etc/fstab文件出错,无法进入Linux系统
  12. oracle11 登陆慢,oracle11g安装后电脑启动很慢怎么解决
  13. about Microsoft Office SharePoint Portal Server 2003
  14. 解决树莓派的gpio口不能读取ds18b20的设备文件
  15. port 执行命令的封装和参数详解
  16. 20个命令行工具监控 Linux 系统性能
  17. 易经入门V2.0(体系最完整,推荐书目最完备,易经周易入门必收藏)
  18. t470键盘拆解_thinkpad t470怎么样?thinkpad t470拆机图解全面评测
  19. CAD工程制图基础命令(简洁版)
  20. 使用python获取nature系列期刊封面高清图片

热门文章

  1. UE4虚幻引擎,编辑器基础应用,使用技巧(四)
  2. 谁说菜鸟不会数据分析python篇下载_谁说菜鸟不会数据分析(工具篇) 张文霖 中文PDF影印版[36.4MB]...
  3. uniapp微信小程序 选择聊天记录文件上传
  4. 中国铁塔南京分公司副总经理程毅一行到访
  5. 百度地图API比例尺调整
  6. VSLAM系列原创04讲 | 四叉树实现ORB特征点均匀化分布:原理+代码
  7. EV代码签名证书是什么?和单位代码签名证书有何不同?
  8. Spring 面向切面编程 第3关:AOP实现原理-JDK动态代理
  9. H5移动端px转rem格式 1rem = 100px
  10. php如何打包发布,PHP打包/部署