首页 > 其他分享 >从零开始学神经网络1

从零开始学神经网络1

时间:2023-01-08 18:34:50浏览次数:46  
标签:裁剪 函数 nn torch 神经网络 从零开始 构造函数

2-2神经元-逻辑斯蒂回归模型

1、神经元

图1

一个神经元即为最小的神经网络,通过对多个输入进行线性运算,再通过激活函数f(x),得到一个输出。

W——权重

X——特征

B——偏置

F(x)——激活函数

2、sigmoid函数

输出在[0,1]之间

3、二分类问题

图2

概率也是落在[0,1]之间的,故做如下定义:

得到一个二分类模型。

2-3神经元多输出

多分类模型

思路:使用多神经元

图3

W从向量扩展为矩阵,W*x则变成向量,这样就会出现多输出神经元

回顾二分类:

实际上是从1+上分配概率,是一个取激活函数归一化的过程

图4

仿照二分类,提出多分类的模型:

图5

k是神经元的个数

神经网络

目标函数(损失函数)

衡量对数据的拟合程度:简单的目标函数可以是预测值减实际值的差值

常用目标函数:

平方差损失:

交叉熵损失(适合多分类):

神经网络训练

调整参数使模型在训练集上的损失函数最小

2-4梯度下降

梯度下降

下山算法:找方向;走一步;再找方向……

图6 图7

学习率的大小会影响学习的效果,要适中才能有一个好的效果

Tensorflow基础

谷歌开源的机器学习框架

图8

命令式编程和声明式编程

图9

求解之前要定义神经网络,这就是Tensorflow使用计算图的原因

图10

2-5pytorch实战

狂肝两万字带你用pytorch搞深度学习!!!

https://blog.csdn.net/CltCj/article/details/120060543

Tensor的创建:

torch.FloatTensor

用于生成数据类型为浮点型的Tensor,传递给torch.FloatTensor的参数可以是列表,也可以是一个维度值。

torch.IntTensor

用于生成数据类型为整型的Tensor,传递给传递给torch.IntTensor的参数可以是列表,也可以是一个维度值。

torch.randn

用于生成数据类型为浮点数且维度指定的随机Tensor,和在numpy中使用的numpy.randn生成的随机数的方法类似,随机生成的浮点数的取值满足均值为0,方差为1的正态分布。

torch.range

用于生成数据类型为浮点型且起始范围和结束范围的Tensor,所以传递给torch.range的参数有三个,分别为起始值,结束值,步长,其中步长用于指定从起始值到结束值得每步的数据间隔。

torch.zeros/ones/empty

torch.zeros用于生成数据类型为浮点型且维度指定的Tensor,不过这个浮点型的Tensor中的元素值全部为0。

torch.ones生成全1的数组。

torch.empty创建一个未被初始化数值的tensor,tensor的大小是由size确定,size: 定义tensor的shape ,这里可以是一个list 也可以是一个tuple

其余使用方法基本与np相同

Tensor的运算:

torch.abs

取绝对值函数

torch.add

加法函数

torch.clamp

类似np.clip函数,torch.clamp是对输入参数按照自定义的范围进行裁剪,最后将参数裁剪的结果作为输出,所以输入参数一共有三个,分别是需要进行裁剪的Tensor数据类型的变量、裁剪的上上边界和裁剪的下边界,具体的裁剪过程是:使用变量中的每个元素分别和裁剪的上边界及裁剪的下边界的值进行比较,如果元素的值小于裁剪的下边界的值,该元素被重写成裁剪的下边界的值;同理,如果元素的值大于裁剪的上边界的值,该元素就被重写成裁剪的上边界的值

b = torch.clamp(a,-0.1,0.1)

torch.div

除法函数

torch.pow

幂函数

torch.mm

矩阵乘法

c = torch.mm(a,b.T)

torch.mv

矩阵和向量的乘法

a = torch.randn(2,3)

#我们得到a为:

#tensor([[ 1.0909, -1.1679, 0.3161],

# [-0.8952, -2.1351, -0.9667]])

b = torch.randn(3)

#我们得到b为:

#tensor([-1.4689, 1.6197, 0.7209])

c = torch.mv(a,b)

#tensor([-3.2663, -2.8402])

3、神经网络工具箱torch.nn

torch.autograd库虽然实现了自动求导与梯度反向传播,但如果我们要完成一个模型的训练,仍需要手写参数的自动更新、训练过程的控制等,还是不够便利。为此,PyTorch进一步提供了集成度更高的模块化接口torch.nn,该接口构建于Autograd之上,提供了网络模组、优化器和初始化策略等一系列功能。

一、nn.Module类

nn.Module是PyTorch提供的神经网络类,并在类中实现了网络各层的定义及前向计算与反向传播机制。在实际使用时,如果想要实现某个神经网络,只需继承nn.Module,在初始化中定义模型结构与参数,在函数forward()中编写网络前向过程即可。

常用的名词:

conv卷积

relu激活

pooling池化

dense全连接

(1)一般把网络中具有可学习参数的层(如全连接层、卷积层等)放在构造函数__init__()中,当然我也可以吧不具有参数的层也放在里面;

(2)一般把不具有可学习参数的层(如ReLU、dropout、BatchNormanation层)可放在构造函数中,也可不放在构造函数中,如果不放在构造函数__init__里面,则在forward方法里面可以使用nn.functional来代替

(3)forward方法是必须要重写的,它是实现模型的功能,实现各个层之间的连接关系的核心。

例子1:

注意:上面的是将所有的层都放在了构造函数__init__里面,但是只是定义了一系列的层,各个层之间到底是什么连接关系并没有,而是在forward里面实现所有层的连接关系,当然这里依然是顺序连接的。

例子2:

注意:此时,将没有训练参数的层没有放在构造函数里面了,所以这些层就不会出现在model里面,但是运行关系是在forward里面通过functional的方法实现的。

总结:所有放在构造函数__init__里面的层的都是这个模型的“固有属性”.

pytorch教程之nn.Module类详解——使用Module类来自定义模型:

https://blog.csdn.net/qq_27825451/article/details/90550890

这里用到的一些函数:

torch.nn.Conv2d

torch.nn.Linear

torch.nn.ReLU
torch.nn.MaxPool2D

二、nn. functional库

F.relu(x)

F.max_pool2d(x)

三、nn.Sequential类

pytorch教程之nn.Sequential类详解——使用Sequential类来自定义顺序连接模型:

https://blog.csdn.net/qq_27825451/article/details/90551513

4、搭建简易神经网络

待续……

标签:裁剪,函数,nn,torch,神经网络,从零开始,构造函数
From: https://www.cnblogs.com/godxumyblog/p/17035061.html

相关文章