| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 零基础深度学习Pytorch教程,一个小时快速入门(三) -> 正文阅读 |
|
[人工智能]零基础深度学习Pytorch教程,一个小时快速入门(三) |
Pytorch官网有非常优秀的教程,其中有几篇小短文属于名为DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ这个小专栏的内容,考虑到大家阅读英文文献有点困难,笔者打算花些时间做一下翻译,同时结合自己的理解做一些内容调整,原文链接贴在这里点此跳转。承接之前的内容,点此跳转到第二部分。好的我们开始第三部分。 这一部分的内容是神经网络,这一次就开始对整个网络进行介绍,为下一部分的实战做一个铺垫。 神经网络可以使用torch.nn的包来构建。 如今你已经了解过一些autograd的内容,nn依赖于autograd来定义和区分模型。一个nn.Module包含很多层,包括前向从输出开始到返回输出。 举个栗子,看一下下面这一张通过网络分类图片的图: 它是一个简单的前馈神经网络,它通过获取输入,喂给一层又一层的网络,然后最后输出结果。 一个经典的网络训练过程如下图: (1)定义一个神经网络然后有一些可以学习的参数或者权重 (2)遍历输入数据集 (3)通过神经网络输入数据 (4)计算loss值(预测值和真实值的误差) (5)将梯度回传到网络参数中 (6)更新网络权重,通常使用一个简单的更新规则:weight = weight - learning_rate * gradient 下面就让我们一步步的实现:? ? 定义一个网络 让我们定义这个网络:
结果输出:
你必须定义前向传播,然后反向传播函数(用来计算梯度)?被使用autograd自动地定义。你可以使用任意一个tensor操作在前向传播函数中。 一个模型的学习率参数通过net.parameters()来学习。
输出结果为:
让我们试着随机化32 × 32的输入,这个网络(LeNet)的输入尺寸是32 × 32。为了在MNIST上使用?数据集,需要改变数据集图片的尺寸为32 × 32.
输出结果为:
用零初始化所有参数的梯度,然后用随机数初始化反向传播的参数。
torch.nn仅仅支持mini-batch(小批量的,就是把大的数据集分成一批一批的)?,整个torch.nn包紧急支持输出一个mini-batch的样本,而不支持以后单独的样本。 举个例子,nn.Conv2d将采用一个4个维度的tensor,nSample × nChannels × Height × Width 如果你有一个单独的样本,使用input.unsqueeze(0)去伪装成一批数据。 ?在继续学习其他知识之前,让我们重新回顾已经学习的知识。 回顾 (1)torch.Tensor一个支持自动求梯度操作的多维度的数组就像backward()。也会保存相关梯度的参数。 (2)nn.Module神经网络模型,方便参数封装,可以移动到GPU中,读取和保存。 (3)nn.Parameter一种tensor,能够自动化注册参数然后分配给对应的一个模块上。 (4)autograd.Function实现前向或者反向创博使用自动化执行的方式,创建一个tensor然后对它的历史过程进行编码。 loss(损失函数)函数 一个损失函数获取(输出结果,目标结果)输入对,然后计算一个数值,预估输出结果和目标结果相差多少。 有许多不同的损失函数都在nn这个包中。一个简单的loss是:nn.MSELoss这个可以计算两个数据直接的均方差。
输出结果为:
如今,二u给你向在反向传播的方向获取一个loss值,使用它的.grad_fn就可以看到图表化的计算结果:
所以,当我们调用loss.backward()的时候,整个图会区分神经网络的各个参数,所有的tensor带有requires_grad=True的结果都会有他们自己.grad tensor结果。 ?为了表述清楚,来进行一步反向传播:
输出结果:
? 反向传播? 为了反向传播误差值我们需要去使用loss.backward()。你需要去清除现在已经存在的梯度值的梯度,否则梯度会不断累积。 现在我们应该调用loss.backward(),然后找到conv1的偏置梯度然后反向传播。
输出结果为:
现在,我们需要制度如何让使用损失函数。 更新权重? ?最简单的更新规则就是私用随机梯度下降法(Stochastic Gradient Descent,简称SGD): weight = weight - learning_rate * gradient 我们能够实现这种简单的Python代码,PS(说实话似乎也没那么简单╮(╯▽╰)╭):
但是如果你需要使用一个神经网络,你想去适应各种各样的更新规则比如SGD,Nestrov-SGD,Adam,RMSProp等等,可以使用这个touch.optim这个包。
这第三部分也就结束了,接下来就等着最后一部分了,我尽快。? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 10:42:02- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |