如何入门Pytorch之二:如何搭建实用神经网络

在上一节中,我们介绍了Pytorch的基本知识,如数据格式,梯度,损失等。

本节中,我们将介绍如何使用Pytorch来搭建一个实用的神经网络。

搭建一个神经网络并训练,大致有这么四个部分:

准备数据,搭建模型,评估函数,优化网络权重

1.数据准备

数据准备在上一篇中已讲过,这里就不多赘述了。

2.搭建模型

层(神经网络的基本组建单元)

针对y=wx+b,搭建简单线性模型

from torch.nn import Linearinp = Variable(torch.randn(1,10))myLayer = Linear(in_features=10,out_features=5,bias=True)myLayer(inp)

myLayer.weight  #通过权重来访问
Output :
Parameter containing:

-0.2386 0.0828 0.2904 0.3133 0.2037 0.1858 -0.2642 0.2862 0.2874 0.1141
0.0512 -0.2286 -0.1717 0.0554 0.1766 -0.0517 0.3112 0.0980 -0.2364 -0.0442
0.0776 -0.2169 0.0183 -0.0384 0.0606 0.2890 -0.0068 0.2344 0.2711 -0.3039
0.1055 0.0224 0.2044 0.0782 0.0790 0.2744 -0.1785 -0.1681 -0.0681 0.3141
0.2715 0.2606 -0.0362 0.0113 0.1299 -0.1112 -0.1652 0.2276 0.3082 -0.2745
[torch.FloatTensor of size 5x10]

myLayer.bias  #通过偏置来访问
Output :
Parameter containing:
-0.2646
-0.2232
0.2444
0.2177
0.0897
[torch.FloatTensor of size 5

线性层在不同的框架里有着不同的名字,如:Dense或fully connected layers.

很多时候,为了解决现实世界问题,需要搭建多个层:

myLayer1 = Linear(10,5)
myLayer2 = Linear(5,2)
myLayer2(myLayer1(inp))

每层的参数都不一样:

Layers Weight1
Layer1 3.0
Layer2 2.0

不过,只是简单的堆叠线性层并不能有效帮助网络学习到更多新的东西。例如:

Y=2(3X1)-2LinearLayers

Y=6(X1)-1 LinearLayers

为了解决上面这个问题,就需要引入非线性函数。以下是一些常用的线性函数:

Sigmoid :f(x)=1 /(1+e^(-x))
Tanh:
ReLU:f(x)=max(0,x)
Leaky ReLU

sample_data = Variable(torch.Tensor([[1,2,-1,-1]]))
myRelu = ReLU()
myRelu(sample_data)
Output:
Variable containing:
1 2 0 0
[torch.FloatTensor of size 1x4]

搭建一个深度学习算法

基于nn.Module搭建的简易模型类

class MyFirstNetwork(nn.Module):
    def __init__(self,input_size,hidden_size,output_size):
        super(MyFirstNetwork,self).__init__()
        self.layer1 = nn.Linear(input_size,hidden_size)
        self.layer2 = nn.Linear(hidden_size,output_size)
    def __forward__(self,input):
        out = self.layer1(input)
        out = nn.ReLU(out)
        out = self.layer2(out)
        return out

机器学习主要解决的问题:分类,回归,多分类。

1、回归:使用线性网络的最近一层的其中一个输出值。

2、分类:使用sigmoid激活函数(近0或1)作为最终输出值。也即2分类问题。

3、多分类:使用softmax层作为最终输出。

原文地址:https://www.cnblogs.com/jimchen1218/p/12021682.html

时间: 2024-11-06 14:47:54

如何入门Pytorch之二:如何搭建实用神经网络的相关文章

【自己动手写神经网络】小白入门连载(二)--机器人时代必须得有人工神经(不是神经病)

[自己动手写神经网络]小白入门连载(一) 在上一章中,我们已经介绍了神经网络的基本概念.思想,并提及了有关人工神经元模型的部分内容.在本章中,将对人工神经元模型做更多的介绍. 图2.1 多输入生物神经元示意图 在上一章中提到了一个简单的神经元模型,并且该模型只有一个输入p.这意味着只能有一个额外的神经元与之相连接,这显然是不够的.因此,一个实用的神经元必须是可以接受多个输入的,如图2.1所示,神经元拥有3个输入p1.p2和p3.其中,w和b是根据网络情况不断进行调整的,而传入函数s和传输函数f是

【自己动手写神经网络】小白入门连载(二):机器人时代必须得有人工神经(不是神经病)

[自己动手写神经网络]小白入门连载(一) 在上一章中,我们已经介绍了神经网络的基本概念.思想,并提及了有关人工神经元模型的部分内容.在本章中,将对人工神经元模型做更多的介绍. 图2.1 多输入生物神经元示意图 在上一章中提到了一个简单的神经元模型,并且该模型只有一个输入p.这意味着只能有一个额外的神经元与之相连接,这显然是不够的.因此,一个实用的神经元必须是可以接受多个输入的,如图2.1所示,神经元拥有3个输入p1.p2和p3.其中,w和b是根据网络情况不断进行调整的,而传入函数s和传输函数f是

Python基本语法,python入门到精通[二]

在上一篇博客Windows搭建python开发环境,python入门到精通[一]我们已经在自己的windows电脑上搭建好了python的开发环境,这篇博客呢我就开始学习一下Python的基本语法.现在练习的开发环境是基于windows的,如果有朋友喜欢linux或者mac的话,只要有需求,我后续的可以给出对应的博文介绍,其实也是换汤不换药,没需求我就懒得说了. v写在前面 python你不去认识它,可能没什么,一旦你认识了它,你就会爱上它 v郑重承诺 我承认,现在园子里烂尾的系列博文比比皆是,

Storm使用入门之本地开发环境搭建

本篇博文详细告诉你如何安装Storm的本地开发环境,总体分为两步,具体如下: 1.从官网上下载Storm的发布包,下载完成后将其解压,并将解压后的bin目录添加到环境变量(PATH)中,以方便后续执行Storm的相关命令 2.修改Storm的配置文件(storm.yaml),主要是按照实际情况更新配置文件中的集群信息,然后将修改后的配置文件添加到目录(~/.storm/)中,目的是为了后续能够远程启动和停止集群上的计算任务(即topology) 接下来,咱们来详细地介绍每一个操作步骤. 首先,何

Docker入门教程(二)命令

Docker入门教程(二)命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第二篇,介绍了Docker的基本命令以及命令的用法和功能. 在Docker系列教程的第一篇文章中,我们了解了Docker的基础知识,知道了它是如何工作以及如何安装的.在这篇文章中,我们将学习15个Docker命令,并通过实践来学习它是如何工作的. 首先,让我们通过下面的命令来检查Docker的安装是否正确: docker info  如果没有找到这条命令,则表示Docke

iOS开发-UI 从入门到精通(二)

iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI开发我们需要手动管理内存,所以我们要把ARC关掉(Xcode关掉ARC的步骤): (1)打开Xcode选中当前工程: (2)选中Build Settings: (3)在输入框内输入count: (4)选择Objective-C Automatic Reference Counting  将其设置为 

【Git入门之十二】DIY Git

[Git入门之十二]DIY Git - JackyStudio - 博客频道 - CSDN.NET Git的配置是很有学问的,如果弄懂它,将对你帮助很大. 1.用户配置 这是全局的. ? [cpp]?view plaincopy ? #设置用户名?? $Snbsp;git?config?--global?user.name?"Jacky"?? ?? #设置邮箱?? $Snbsp;[email protected]?? ? 2.设置默认编辑器 在需要输入文本信息时调用,比如之前的reba

Java入门——多线程(二)

Java入门——多线程(二) 线程的状态 要想实现多线程,必须在主线程中创建新的线程对象.任何线程一般具有5种状态. 创建状态:用构造方法创建一个线程对象之后,新的线程就处于该状态.已经有了相应的内存空间和其他资源和其他资源. 就绪状态:线程进入线程队列排队,等待CPU服务. 运行状态:CPU处理,自动调用run()方法. 阻塞状态:就是在执行过程中暂时挂起.原因有:人为挂起,CPU的决定,sleep(),suspend(),wait()等方法.只有当引起阻塞的原因被消除后,线程才能转入就绪状态

Grunt入门教程之二 —— concat插件

Grunt入门教程之二 Concat插件 concat是grunt中用来做文件连接的常用插件,比如说你写了一个类库,有三大模块,如: a.js b.js c.js 当你的项目准备发布的时候,你可能需要将这三个模块合并成一个大的模块all.js,这样做可以减少HTTP请求,增快页面的响应速度. 如果我们每次发布的时候又要连接这三个模块,并测试all.js,确保大模块无BUG之后再发布,就显得很蛋疼了.一种好的方式是,每当你修改了其中一个小模块,他都会自动连接成all.js,并且你的项目在开发的时候