从MLP到神经网络
来源:互联网 发布:js实现文件上传和下载 编辑:程序博客网 时间:2024/06/05 08:57
多层感知器(MLP)是一种非常简单的神经网络,其实现起来也是非常容易滴。那我们就来看一看吧
首先,先看一下来自维基百科的介绍:
多层感知器(Multilayer Perceptron,缩写MLP)是一种前向结构的人工神经网络,映射一组输入向量到一组输出向量。MLP可以被看作是一个有向图,由多个的节点层所组成,每一层都全连接到下一层。除了输入节点,每个节点都是一个带有非线性激活函数的神经元(或称处理单元)。一种被称为反向传播算法的监督学习方法(BP算法)常被用来训练MLP。MLP是感知器的推广,克服了感知器不能对线性不可分数据进行识别的弱点。
接下来我们看一个最简单的MLP结构:
最简单的MLP是三层结构(输入层-隐藏层-输出层),如下图所示:
多层感知机的层与层之间是全连接的,即每一层的任意一个神经元均与其前一层的所有神经元有连接,这种连接其实代表了一种权重加和。
例如:
从输入层到隐藏层:我们用X代表输入,H代表隐藏层,则H=f(W1X + B1),其中W1代表权重,B1代表偏置,函数f通常是非线性的,叫做激活函数。
常见的激活函数有:Sigmoid(S型激活函数,将输入映射到一个0到1之间的值,)
tanh(双曲正切函数,将输入映射到一个-1到1之间的值,)
ReLU(近似生物神经激活函数,它的函数形式是)
Softmax(在多分类中常用的激活函数,是基于逻辑回归的。P(i)=exp(θTix)∑Kk=1exp(θTkx) )
从隐藏层到输出层:我们用Y代表输出,则Y=G(W2H + B2),其中W2和B2均为训练参数。函数G是激活函数,常见的有Softmax(用于多分类)
这样,我们就得到了一个从输入到输出的关系,我们最终就是通过监督学习方法求得W1、B1、W2、B2。通常利用反向传播算法(BP)和最优化算法对权重更新,迭代更新参数,直至满足某个条件为止。
由于deep learning框架我经常使用的Keras,所以就以Keras为例,让我们具体来看一下在Keras里面如何实现MLP:
sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,DIM), dtype='int32')dense_1 = Dense(100,activation='tanh')(sequence_input)dense_2 = Dense(2, activation='softmax')(dense_1)max_pooling = GlobalMaxPooling1D()(dense_2)model = Model(sequence_input, dense_2)
可以看到,输入层是sequence_input,输入到隐层就是一个全连接层Dense层,隐层到输出也是一个全连接层Dense层。然后我们看看具体Dense层是怎么实现的:
class Dense(Layer): def call(self, x, mask=None): output = K.dot(x, self.W) if self.bias: output += self.b return self.activation(output)
可以看到Dense层就是对输入x做了f(W1X + B1)变换,W1代表权重,B1代表偏置,函数f是激活函数。
举个例子来说,如果输入张量x(TensorFlow和Keras中都是对张量进行运行)的shape为[n_samples,100],在keras中,W的shape为[100,50],B的shape为[50],则Dense层的输出为[n_samples,50]。
可以从Keras中Dense层的build函数看到W和B的初始化(其中,input_dim是x的shape最后一维,即100,output_dim是Dense层设定的输出维度,即50,所以W的shape为[100,50],B的shape为[50],通过f(W1X + B1)变换即可得到Dense层的输出[n_samples,50],这里的n_samples是设定的batch_size,即一次取多少个样本进行更新):
def build(self, input_shape): assert len(input_shape) >= 2 input_dim = input_shape[-1] self.input_dim = input_dim self.input_spec = [InputSpec(dtype=K.floatx(), ndim='2+')] self.W = self.add_weight((input_dim, self.output_dim), initializer=self.init, name='{}_W'.format(self.name), regularizer=self.W_regularizer, constraint=self.W_constraint) if self.bias: self.b = self.add_weight((self.output_dim,), initializer='zero', name='{}_b'.format(self.name), regularizer=self.b_regularizer, constraint=self.b_constraint) else: self.b = None if self.initial_weights is not None: self.set_weights(self.initial_weights) del self.initial_weights self.built = True
如果用MLP对文本进行分类,分类数为2,则输入张量x的shape为[n_samples,Sentence_length,100],,W的shape为[100,2],B的shape为[2],Dense层的输出为[n_samples,Sentence_length,2],W和B是共享的。这个时候需要注意了,由于Dense层的输出为3维,不能直接进行分类,这时普遍的做法是在Dense层的上方添加一个Pooling层,常用的有MaxPooling、MeanPooling,Pooling层将Dense层的输出[n_samples,Sentence_length,2]转换为[n_samples,2]。
怎么样,是不是非常简单。那就赶快用起来吧,虽然由于MLP过于简单,大家一般不会单独拿来用,但是对于deep learning新手来说,还是可是拿来先试一下手的。
参考:
http://blog.csdn.net/u012162613/article/details/43221829
https://zh.wikipedia.org/wiki/%E5%A4%9A%E5%B1%82%E6%84%9F%E7%9F%A5%E5%99%A8
http://keras-cn.readthedocs.io/en/latest/
- 从MLP到神经网络
- 深度学习基础(二)—— 从多层感知机(MLP)到卷积神经网络(CNN)
- MLP(多层神经网络)介绍
- c++实现mlp神经网络
- MLP(多层神经网络)介绍
- MLP(多层神经网络)介绍
- MLP(多层神经网络)介绍
- MLP(多层神经网络)与人工神经网络
- 从自联想神经网络到深度神经网络
- 从自联想神经网络到深度神经网络
- 从自联想神经网络到深度神经网络
- 从自联想神经网络到深度神经网络
- 从自联想神经网络到深度神经网络
- 从自联想神经网络到深度神经网络
- 从神经网络到卷积神经网络数学推导
- 从神经网络到卷积神经网络的了解
- 从自联想神经网络到深度神经网络
- 从神经网络到深度学习
- 工作十年,我是如何达到年薪40W以上
- 星星之火,可以燎原
- Android Notification通知栏的创建
- Android按键事件处理流程
- pcl里面的法线估计
- 从MLP到神经网络
- Android 秘钥库简介
- microsoft sql server 错误18456
- PHP Log时时查看小工具
- Mysql解压版安装
- rocket chat部署
- 按月统计上报情况
- apache学习之旅(一)—— 123123
- [.NET MVC4 入门系列04]Controller和View间交互原理