2019-11-02 13:07:18 qq_41590635 阅读数 171
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40480 人正在学习 去看看 唐宇迪

1 前言

最近有朋友留言要求分享一下李沐老师的《动手学深度学习》,小汤本着一直坚持的“好资源大家一起分享,共同学习,共同进步”的初衷,于是便去找了资料,而且还是中文版的,分享给有需要的小伙伴,也希望有更多的朋友能在StrongerTang相遇。

《动手学深度学习》是今年6月刚出版的新书,是一本面向中文读者的能运行、可讨论的深度学习教科书。同时覆盖深度学习的方法和实践,不仅从数学的角度阐述深度学习的技术与应用,还包含可运行的代码,为读者展示如何在实际中解决问题。

主要面向希望了解深度学习,特别是对实际使用深度学习感兴趣的大学生、工程师和研究人员。阅读本书不要求读者有任何深度学习或者机器学习的背景知识,读者只需具备基本的数学和编程知识,如基础的线性代数、微分、概率及Python编程知识。附录中提供了书中涉及的主要数学知识,供读者参考。
在这里插入图片描述

2 简介

· · · · · ·作者简介 · · · · · ·

阿斯顿·张(Aston Zhang)

亚马逊应用科学家,美国伊利诺伊大学香槟分校计算机科学博士,统计学和计算机科学双硕士,专注于机器学习的研究。

李沐(Mu Li)

亚马逊首席科学家(Principal Scientist),加州大学伯克利分校客座助理教授,美国卡内基梅隆大学计算机系博士,专注于分布式系统和机器学习算法的研究,是深度学习框架MXNet的作者之一。

扎卡里·C. 立顿(Zachary C. Lipton)

亚马逊应用科学家,美国卡内基梅隆大学助理教授,美国加州大学圣迭戈分校博士,专注于机器学习算法及其社会影响的研究,特别是在时序数据与序列决策上的深度学习。

亚历山大·J. 斯莫拉(Alexander J. Smola)

亚马逊副总裁/ 杰出科学家,德国柏林工业大学计算机科学博士,曾在澳大利亚国立大学、美国加州大学伯克利分校和卡内基梅隆大学任教,研究兴趣包括深度学习、贝叶斯非参数、核方法、统计建模和可扩展算法。

· · · · · ·内容简介 · · · · · ·

《动手学深度学习》旨在向读者交付有关深度学习的交互式学习体验。书中不仅阐述深度学习的算法原理,还演示它们的实现和运行。与传统图书不同,本书的每一节都是一个可以下载并运行的Jupyter记事本,它将文字、公式、图像、代码和运行结果结合在了一起。此外,读者还可以访问并参与书中内容的讨论。

全书的内容分为3个部分:第一部分介绍深度学习的背景,提供预备知识,并包括深度学习最基础的概念和技术;第二部分描述深度学习计算的重要组成部分,还解释近年来令深度学习在多个领域大获成功的卷积神经网络和循环神经网络;第三部分评价优化算法,检验影响深度学习计算性能的重要因素,并分别列举深度学习在计算机视觉和自然语言处理中的重要应用。

之前,李沐老师等人曾以电子版的形式在 GitHub 上开源了这本书,目前该项目在 GitHub 上已获得超过 1.1 万星,并且中文版电子书还发布了纸质版书籍。

中文版开源地址:https://github.com/d2l-ai/d2l-zh

不过虽然本书非常优秀,但由于是使用 MXNet 框架写成的,而很多入坑机器学习的萌新们使用的却是 PyTorch或者 Tensorflow ,使得很多小伙伴“手拿美食,却又不知如何下手”。

幸运的是,最近一位北大大佬翻译了一份 Pytorch 版,原书中的 MXNet 代码全部改为PyTorch实现。

首先放上这份资源的 GitHub 地址:

https://github.com/ShusenTang/Dive-into-DL-PyTorch

然而,源项目由于是用Markdown写的,公式和代码显示的易读性较差,体验感不佳。最近,一位中国海洋大学大佬又将上面 PyTorch 版本的《动手深度学习》编译成完整的 PDF 文件。方便大家阅读及解决 GitHub 上公式显示不全的问题。

· · · · · ·目录 · · · · · ·

深度学习简介

2.1 环境配置

2.2 数据操作

2.3 ⾃动求梯度

3.1 线性回归

3.2 线性回归的从零开始实现

3.3 线性回归的简洁实现

3.4 softmax回归

3.5 图像分类数据集(Fashion-MNIST)

3.6 softmax回归的从零开始实现

3.7 softmax回归的简洁实现

3.8 多层感知机

3.9 多层感知机的从零开始实现

3.10 多层感知机的简洁实现

3.11 模型选择、⽋拟合和过拟合

3.12 权重衰减

3.13 丢弃法

3.14 正向传播、反向传播和计算图

3.15 数值稳定性和模型初始化

3.16 实战Kaggle⽐赛:房价预测

4.1 模型构造

4.2 模型参数的访问、初始化和共享

4.3 模型参数的延后初始化

4.4 ⾃定义层

4.5 读取和存储

4.6 GPU计算

5.1 ⼆维卷积层

5.2 填充和步幅

5.3 多输⼊通道和多输出通道

5.4 池化层

5.5 卷积神经⽹络(LeNet)

5.6 深度卷积神经⽹络(AlexNet)

5.7 使⽤重复元素的⽹络(VGG)

5.8 ⽹络中的⽹络(NiN)

5.9 含并⾏连结的⽹络(GoogLeNet)

5.10 批量归⼀化

5.11 残差⽹络(ResNet)

5.12 稠密连接⽹络(DenseNet)

6.1 语⾔模型

6.2 循环神经⽹络

6.3 语⾔模型数据集(周杰伦专辑歌词)

6.4 循环神经⽹络的从零开始实现6.4.1 one-hot向量

6.5 循环神经⽹络的简洁实现

6.6 通过时间反向传播

6.7 ⻔控循环单元(GRU)

6.8 ⻓短期记忆(LSTM)

6.9 深度循环神经⽹络

6.10 双向循环神经⽹络

7.1 优化与深度学习

7.2 梯度下降和随机梯度下降

7.3 ⼩批量随机梯度下降

7.4 动量法

7.5 AdaGrad算法

7.6 RMSProp算法

7.7 AdaDelta算法

7.8 Adam算法

8.1 命令式和符号式混合编程

8.2 异步计算

8.3 ⾃动并⾏计算

8.4 多GPU计算

9.1 图像增⼴

9.2 微调

9.3 ⽬标检测和边界框

9.4 锚框

10.1 词嵌⼊(word2vec)

10.2 近似训练

10.3 word2vec的实现

10.4 ⼦词嵌⼊(fastText)

10.5 全局向量的词嵌⼊(GloVe)

10.6 求近义词和类⽐词

10.7 ⽂本情感分类:使⽤循环神经⽹络

10.8 ⽂本情感分类:使⽤卷积神经⽹络(textCNN)

10.9 编码器—解码器(seq2seq)

10.10 束搜索

10.11 注意⼒机制

10.12 机器翻译

小汤本着交流学习的角度,在文末分享了该书的电子版,需要的小伙伴可以免费下载获取。但请勿用于任何商业用途,仅供自身学习参考使用。

当然,StrongerTang强烈支持该书版权所属,对于喜欢纸质实体书阅读的朋友,建议购买正版书籍阅读。

附加资源:

在线预览地址:

https://zh.d2l.ai/

课程视频地址:

https://space.bilibili.com/209599371/channel/detail?cid=23541

4 资料免费获取

最后,364页PyTorch版《动手学深度学习》电子版pdf已经打包完毕,需要的可以按照以下方式获取:

1.长按下方二维码关注 “StrongerTang” 公众号

2.公众号后台回复关键词:动手学深度学习

在这里插入图片描述
声明:此资料免费分享,仅作知识分享,勿用于任何商业用途。赠人玫瑰,手有余香!

2017-11-29 00:00:00 dQCFKyQDXYm3F8rB0 阅读数 2853
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40480 人正在学习 去看看 唐宇迪


今年 9 月,曾经的百度少帅、如今的亚马逊 AI 主任科学家、 MXNet 的作者李沐博士推出了自己的这种文深度学习课程了——《动手学深度学习》。


该课程将使用 Apache MXNet (incubating) 的最新 gluon 接口来演示如何从 0 开始实现深度学习的各个算法,利用 Jupyter notebook 将文档、代码、公式和图形统一在一起的优势,为开发者提供了一个交互式的学习体验。


营长之前曾介绍,李沐每周六的上午 10 点在斗鱼进行课程直播,第一次直播时间为 9 月 9 日上午 10 点。在两个多的时间里,李沐一共进行了 10 次直播:


  • 第一课:从上手到多类分类  

  • 第二课:过拟合、多层感知机、GPU和卷积神经网络

  • 第三课:深度卷积网络,如何使用Gluon,以及核武器购买指南      

  • 第四课:BatchNorm,更深的卷积神经网络,图片增强和新的Kaggle练习  

  • 第五课:Gluon高级和优化算法基础     

  • 第六课:优化算法高级和计算机视觉 

  • 第七课:物体检测        

  • 第八课:物体检测·续             

  • 第九课:物体检测·再续        

  • 第十课:语义分割


目前,所有视频均已上传到b站。



视频地址:

https://space.bilibili.com/209599371#!/channel/detail?cid=23541

课程讨论:

https://discuss.gluon.ai/c/lecture


除了视频直播之外,李沐还为学者准备了教程文档,目录如下图所示。


目前,“动手学深度学习”的每个教程主要是按照以下方式来组织(除了少数几个背景知识介绍教程外):


  • 引入一个(或者少数几个)新概念

  • 提供一个使用真实数据的完整样例


这个教程的最大特色在于,每个教程都是一个可以编辑和运行的 Jupyter notebook,方便学生动手操作。


教程地址:http://zh.gluon.ai/index.html




资源推荐



资源 | Yann LeCun最新演讲:大脑是如何高效学习的?(附PPT+视频)

@那些想要转行AI的人:送你一份人工智能入门指南

资源 | 史上最全机器学习笔记

重磅 | 128篇论文,21大领域,深度学习最值得看的资源全在这了

爆款 | Medium上6900个赞的AI学习路线图,让你快速上手机器学习

Quora十大机器学习作者与Facebook十大机器学习、数据科学群组

Chatbot大牛推荐:AI、机器学习、深度学习必看9大入门视频

葵花宝典之机器学习:全网最重要的AI资源都在这里了(大牛,研究机构,视频,博客,书籍,Quora......)


☟☟☟ 更多学习资源,请戳原文

2020-02-13 17:32:17 yuwenhenhao 阅读数 52
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40480 人正在学习 去看看 唐宇迪

一、线性回归

其实正在看《动手学深度学习》,不过一来自己一个人有的时候想偷懒,看的慢,二来这次组队能认识到人,一起做题,更有动力。便趁着这次伯禹教育在这次疫情中免费开的这堂课,一起组队学习。
这是第一次课程的笔记。


主要内容:
1. 线性回归的基本要素。
2. 线性回归模型的从零开始实现
3. 线性回归模型使用pytorch的简介实现

线性回归的基本要素

这一节主要使基本介绍,对其进行简单带过。
为了简单起见,这里我们假设价格只取决于房屋状况的两个因素,即面积(平方米)和房龄(年)。接下来我们希望探索价格与这两个因素的具体关系。线性回归假设输出与各个输入之间是线性关系:
在这里插入图片描述
损失函数
在模型训练中,我们需要衡量价格预测值与真实值之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。 它在评估索引为 i 的样本误差的表达式为
在这里插入图片描述


二、softmax和分类模型

内容包含:
1、softmax回归的基本概念
2、如何获取Fashion-MNIST数据集和读取数据
3、softmax回归模型的从零开始实现,实现一个对Fashion-MNIST训练集中的图像数据进行分类的模型
4、使用pytorch重新实现softmax回归模型

softmax函数主要用于分类问题中
由于直接使用输出层的输出有两个问题:
一方面,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。例如,刚才举的例子中的输出值10表示“很置信”图像类别为猫,因为该输出值是其他两类的输出值的100倍。但如果 o1=o3=103 ,那么输出值10却又表示图像类别为猫的概率很低。
另一方面,由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。
softmax运算符(softmax operator)解决了以上两个问题。它通过下式将输出值变换成值为正且和为1的概率分布:
在这里插入图片描述
在这里插入图片描述
交叉熵(cross entropy)作为它的损失函数
在这里插入图片描述在这里插入图片描述


三、多层感知机

内容包括:
1、多层感知机的基本知识
2、使用多层感知机图像分类的从零开始的实现
3、使用pytorch的简洁实现

1、多层感知机(multilayer perceptron,MLP)

多层感知机就是含有至少一个隐藏层的由全连接层组成的神经网络,且每个隐藏层的输出通过激活函数进行变换。多层感知机的层数和各隐藏层中隐藏单元个数都是超参数。以单隐藏层为例并沿用本节之前定义的符号,多层感知机按以下方式计算输出:
在这里插入图片描述

2、激活函数

对隐藏变量使用按元素运算的非线性函数进行变换,然后再作为下一个全连接层的输入。这个非线性函数被称为激活函数(activation function)。
在这里插入图片描述

关于激活函数的选择
ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。
用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。
在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。
在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。

四、文本预处理

文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤:

  1. 读入文本
  2. 分词
  3. 建立字典,将每个词映射到一个唯一的索引(index)
  4. 将文本从词的序列转换为索引的序列,方便输入模型

用现有工具进行分词

我们前面介绍的分词方式非常简单,它至少有以下几个缺点:

  1. 标点符号通常可以提供语义信息,但是我们的方法直接将其丢弃了
  2. 类似“shouldn’t", "doesn’t"这样的词会被错误地处理
  3. 类似"Mr.", "Dr."这样的词会被错误地处理

我们可以通过引入更复杂的规则来解决这些问题,但是事实上,有一些现有的工具可以很好地进行分词,我们在这里简单介绍其中的两个:spaCyNLTK

五、语言模型

本节我们介绍基于统计的语言模型,主要是n元语法(n-gram)。在后续内容中,我们将会介绍基于神经网络的语言模型。

1、语言模型

假设序列w1,w2,w3…wt中的每个词是依次生成的,我们有
在这里插入图片描述

2、n元语法

序列长度增加,计算和存储多个词共同出现的概率的复杂度会呈指数级增加。n元语法通过马尔可夫假设简化模型,马尔科夫假设是指一个词的出现只与前面个词相关,即n阶马尔可夫链(Markov chain of order ),如果n=1,那么有p(w3|w1,w2)=p(w3|w2)。基于n-1阶马尔可夫链,我们可以将语言模型改写为
在这里插入图片描述

六、循环神经网络

本节介绍循环神经网络,下图展示了如何基于循环神经网络实现语言模型。我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。在这里插入图片描述

1、循环神经网络的构造

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

2、one-hot向量

我们需要将字符表示成向量,这里采用one-hot向量。假设词典大小是N,每次字符对应一个从0到N-1的唯一的索引,则该字符的向量是一个长度为N的向量,若字符的索引是i,则该向量的第i个位置为1,其他位置为0。

3、裁剪梯度

循环神经网络中较容易出现梯度衰减或梯度爆炸,这会导致网络几乎无法训练。裁剪梯度(clip gradient)是一种应对梯度爆炸的方法。假设我们把所有模型参数的梯度拼接成一个向量g ,并设裁剪的阈值是theta。裁剪后的梯度在这里插入图片描述

4、困惑度

我们通常使用困惑度(perplexity)来评价语言模型的好坏。回忆一下“softmax回归”一节中交叉熵损失函数的定义。困惑度是对交叉熵损失函数做指数运算后得到的值。特别地,

最佳情况下,模型总是把标签类别的概率预测为1,此时困惑度为1;
最坏情况下,模型总是把标签类别的概率预测为0,此时困惑度为正无穷;
基线情况下,模型总是预测所有类别的概率都相同,此时困惑度为类别个数。
显然,任何一个有效模型的困惑度必须小于类别个数。在本例中,困惑度必须小于词典大小vocab_size。

定义模型训练函数
跟之前章节的模型训练函数相比,这里的模型训练函数有以下几点不同:

使用困惑度评价模型。
在迭代模型参数前裁剪梯度。
对时序数据采用不同采样方法将导致隐藏状态初始化的不同。

2020-02-25 18:21:44 qq_23305951 阅读数 18
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40480 人正在学习 去看看 唐宇迪

《动手学深度学习》pytorch版笔记三
CV方向
Task06
批量归一化和残差网络
BatchNorm概念还是蛮简单的,但还是有些细节要注意下

另外是ResNet跟DenseNet Block结构之间的区别

凸优化、梯度下降
这两节比较简单,等之后凸优化进阶学完之后一起补写吧

Task09,Task10
目标检测基础
生成锚框的过程还是蛮复杂的,不过现在很多anchor free的算法被提出,还没仔细研究过。另外非极大值抑制也是重要的一步

图像风格迁移,GAN,DCGAN
祥和部分内容只懂了个皮毛,还需要进一步理解,之后理解了再补吧

图像分类案例1、2
这部分内容也比较简单,一般的课程会放在比较靠前的位置,不太清楚为何会在后面安排该课程

2020-02-13 17:16:09 StarCoder_WangYue 阅读数 87
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    40480 人正在学习 去看看 唐宇迪

首先感谢伯禹教育、Datawhale、和鲸科技和各位志愿者给我们的这个机会来组织大家一起学习,本次学习的内容是《动手学深度学习PyTorch版》。

Task01:线性回归;Softmax与分类模型、多层感知机

1.线性回归基本要素:

  • 模型:对于线性回归,我们需要确定其模型,我们初设为输出与各个输入之间是线性关系,确定了模型之后再来确定模型的参数。

  • 数据集:我们通常收集一系列的真实数据,例如多栋房屋的真实售出价格和它们对应的面积和房龄。我们希望在这个数据上面寻找模型参数来使模型的预测价格与真实价格的误差最小。在机器学习术语里,该数据集被称为训练数据集(training data set)或训练集(training set),一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。特征用来表征样本的特点。

  • 损失函数:在模型训练中,我们需要衡量价格预测值与真实值之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。
    1/2是为了求导方便便于梯度下降算法

  • 优化函数 - 随机梯度下降:当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。
    在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch),然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。
    在这里插入图片描述
    学习率: 代表在每次优化中,能够学习的步长的大小
    批量大小: 是小批量计算中的批量大小batch size

     通过实验可以得出,矢量加法比将两个向量使用for循环按元素逐一做标量加法快很多,因此,我们应该尽可能采用矢量计算,以提升计算效率。
    

下面给出线性回归模型使用pytorch的简洁实现:

import torch
from torch import nn
import numpy as np
torch.manual_seed(1)
from torch.nn import init
import torch.optim as optim

torch.set_default_tensor_type('torch.FloatTensor')
num_inputs = 2
num_examples = 1000

true_w = [2, -3.4]
true_b = 4.2

features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()), dtype=torch.float)
import torch.utils.data as Data

batch_size = 10

# combine featues and labels of dataset
dataset = Data.TensorDataset(features, labels)

# put dataset into DataLoader
data_iter = Data.DataLoader(
    dataset=dataset,            # torch TensorDataset format
    batch_size=batch_size,      # mini batch size
    shuffle=True,               # whether shuffle the data or not
    num_workers=2,              # read data in multithreading
)
for X, y in data_iter:
    print(X, '\n', y)
    break
    # ways to init a multilayer network
# method one
net = nn.Sequential(
    nn.Linear(num_inputs, 1)
    # other layers can be added here
    )

# method two
net = nn.Sequential()
net.add_module('linear', nn.Linear(num_inputs, 1))
# net.add_module ......

# method three
from collections import OrderedDict
net = nn.Sequential(OrderedDict([
          ('linear', nn.Linear(num_inputs, 1))
          # ......
        ]))

print(net)
print(net[0])

init.normal_(net[0].weight, mean=0.0, std=0.01)
init.constant_(net[0].bias, val=0.0)  # or you can use `net[0].bias.data.fill_(0)` to modify it direct

for param in net.parameters():
    print(param)
loss = nn.MSELoss()    # nn built-in squared loss function
                       # function prototype: `torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')`

optimizer = optim.SGD(net.parameters(), lr=0.03)   # built-in random gradient descent function
print(optimizer)  # function prototype: `torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)

num_epochs = 3
for epoch in range(1, num_epochs + 1):
    for X, y in data_iter:
        output = net(X)
        l = loss(output, y.view(-1, 1))
        optimizer.zero_grad() # reset gradient, equal to net.zero_grad()
        l.backward()
        optimizer.step()
    print('epoch %d, loss: %f' % (epoch, l.item()))
    # result comparision
    
dense = net[0]
print(true_w, dense.weight.data)
print(true_b, dense.bias.data)

2.softmax和分类模型

softmax回归同线性回归一样,也是一个单层神经网络。由于每个输出 𝑜1,𝑜2,𝑜3 的计算都要依赖于所有的输入 𝑥1,𝑥2,𝑥3,𝑥4 ,softmax回归的输出层也是一个全连接层。
在这里插入图片描述
softmax回归解决了两个问题:
(1)由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。
(2)由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。

softmax运算符(softmax operator)解决了以上两个问题。它通过下式将输出值变换成值为正且和为1的概率分布:
在这里插入图片描述

  • 交叉熵损失函数:
    想要预测分类结果正确,我们其实并不需要预测概率完全等于标签概率。对于某些分类问题,如果判定为某类的概率大于百分之五十,就不用精确地计算出其他值为多少,而平方损失则过于严格,就有了更适合衡量两个概率分布差异的测量函数,即交叉熵损失函数。

    在这里插入图片描述
    其中带下标的 𝑦(𝑖)𝑗 是向量 𝑦(𝑖) 中非0即1的元素,需要注意将它与样本 𝑖 类别的离散数值,即不带下标的 𝑦(𝑖) 区分。交叉熵只关心对正确类别的预测概率,因为只要其值足够大,就可以确保分类结果正确。

softmax实现:

def softmax(X):
    X_exp = X.exp()
    partition = X_exp.sum(dim=1, keepdim=True)
    # print("X size is ", X_exp.size())
    # print("partition size is ", partition, partition.size())
    return X_exp / partition  # 这里应用了广播机制

一个例子,我们可以看出SoftMax将类型概率映射至0-1,他们的总和为1。
在这里插入图片描述

3.多层感知机(MLP)

从前面的神经网络来看,如果我们只是单纯的添加线性隐藏层,那么就依然等价于一个单层神经网络:只是另外一个线性变换而已,为了解决这种问题,我们需要引入激活函数。

上述问题的根源在于全连接层只是对数据做仿射变换(affine transformation),而多个仿射变换的叠加仍然是一个仿射变换。解决问题的一个方法是引入非线性变换,例如对隐藏变量使用按元素运算的非线性函数进行变换,然后再作为下一个全连接层的输入。这个非线性函数被称为激活函数(activation function)。
几个常用的激活函数:

  • ReLU函数:
    ReLU(rectified linear unit)函数提供了一个很简单的非线性变换。给定元素 𝑥 ,该函数定义为

    函数图像:
    在这里插入图片描述
  • Sigmoid函数
    sigmoid函数可以将元素的值变换到0和1之间:
    在这里插入图片描述
    在这里插入图片描述
    特别的,依据链式法则,sigmoid函数的导数在这里插入图片描述
  • tanh函数:
    tanh(双曲正切)函数可以将元素的值变换到-1和1之间:

在这里插入图片描述

在这里插入图片描述

关于激活函数的选择:

ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。

用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。

在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。

在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。

回到多层感知机上

多层感知机就是含有至少一个隐藏层的由全连接层组成的神经网络,且每个隐藏层的输出通过激活函数进行变换。多层感知机的层数和各隐藏层中隐藏单元个数都是超参数。以单隐藏层为例并沿用本节之前定义的符号,多层感知机按以下方式计算输出:
在这里插入图片描述

简洁实现:

import torch
from torch import nn
from torch.nn import init
import numpy as np
import sys
sys.path.append("/home/kesci/input")
import d2lzh1981 as d2l

num_inputs, num_outputs, num_hiddens = 784, 10, 256
    
net = nn.Sequential(
        d2l.FlattenLayer(),
        nn.Linear(num_inputs, num_hiddens),
        nn.ReLU(),
        nn.Linear(num_hiddens, num_outputs), 
        )
    
for params in net.parameters():
    init.normal_(params, mean=0, std=0.01)

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size,root='/home/kesci/input/FashionMNIST2065')
loss = torch.nn.CrossEntropyLoss()

optimizer = torch.optim.SGD(net.parameters(), lr=0.5)

num_epochs = 5
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)

参考文档:
https://www.kesci.com/org/boyuai/workspace/project
https://www.boyuai.com/elites/course/cZu18YmweLv10OeV/jupyter/sgHW6P_Qf9EfSEMnIfBJx https://www.boyuai.com/elites/course/cZu18YmweLv10OeV/jupyter/UWdzWhU6C29MaLj0udI5

没有更多推荐了,返回首页