赞
踩
多层感知机MLP(Multilayer Perceptron),也是人工神经网络(ANN,Artificial Neural Network),是一种全连接(全连接:MLP由多个神经元按照层次结构组成,每个神经元都与上一层的所有神经元相连)的前馈神经网络模型
输入层—>隐藏层—>输出层
神经元:包含一个带有权重和偏置的线性变换,以及一个激活函数(通常,输入层不使用激活函数,隐藏层和输出层使用激活函数)用来引入非线性,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以利用到更多的非线性模型中
隐藏层神经元:假设输入层用向量X表示,则隐藏层的输出就是f(w1*X+b1),函数f可以是sigmoid函数或者tanh函数,w1是权重(连接系数),b1是偏置
输出层的输出:softmax(w2*X1+b2),X1是隐藏层的输出
MLP训练过程:数据从输入层经过多个隐藏层的非线性变换,最后到达输出层进行分类或回归操作。通常使用反向传播算法,该算法通过计算损失函数对网络参数的梯度,并根据梯度更新参数,以最小化损失函数。常见的优化算法:随机梯度下降(SGD)、动量法、Adam等
输入层—>隐藏层
- class HiddenLayer(object):
- def __init__(self, rng, input, n_in, n_out, W=None, b=None,
- activation=T.tanh):
- """
- 注释:
- 这是定义隐藏层的类,首先明确:隐藏层的输入即input,输出即隐藏层的神经元个数。输入层与隐藏层是全连接的。
- 假设输入是n_in维的向量(也可以说时n_in个神经元),隐藏层有n_out个神经元,则因为是全连接,
- 一共有n_in*n_out个权重,故W大小时(n_in,n_out),n_in行n_out列,每一列对应隐藏层的每一个神经元的连接权重。
- b是偏置,隐藏层有n_out个神经元,故b时n_out维向量。
- rng即随机数生成器,numpy.random.RandomState,用于初始化W。
- input训练模型所用到的所有输入,并不是MLP的输入层,MLP的输入层的神经元个数时n_in,而这里的参数input大小是(n_example,n_in),每一行一个样本,即每一行作为MLP的输入层。
- activation:激活函数,这里定义为函数tanh
- """
-
- self.input = input #类HiddenLayer的input即所传递进来的input
-
- """
- 注释:
- 代码要兼容GPU,则W、b必须使用 dtype=theano.config.floatX,并且定义为theano.shared
- 另外,W的初始化有个规则:如果使用tanh函数,则在-sqrt(6./(n_in+n_hidden))到sqrt(6./(n_in+n_hidden))之间均匀
- 抽取数值来初始化W,若时sigmoid函数,则以上再乘4倍。
- """
- #如果W未初始化,则根据上述方法初始化。
- #加入这个判断的原因是:有时候我们可以用训练好的参数来初始化W
- if W is None:
- W_values = numpy.asarray(
- rng.uniform(
- low=-numpy.sqrt(6. / (n_in + n_out)),
- high=numpy.sqrt(6. / (n_in + n_out)),
- size=(n_in, n_out)
- ),
- dtype=theano.config.floatX
- )
- if activation == theano.tensor.nnet.sigmoid:
- W_values *= 4
- W = theano.shared(value=W_values, name='W', borrow=True)
-
- if b is None:
- b_values = numpy.zeros((n_out,), dtype=theano.config.floatX)
- b = theano.shared(value=b_values, name='b', borrow=True)
-
- #用上面定义的W、b来初始化类HiddenLayer的W、b
- self.W = W
- self.b = b
-
- #隐含层的输出
- lin_output = T.dot(input, self.W) + self.b
- self.output = (
- lin_output if activation is None
- else activation(lin_output)
- )
-
- #隐含层的参数
- self.params = [self.W, self.b]
隐藏层—>输出层:分类器softmax回归
- """
- 定义分类层,Softmax回归
- 在deeplearning tutorial中,直接将LogisticRegression视为Softmax,
- 而我们所认识的二类别的逻辑回归就是当n_out=2时的LogisticRegression
- """
- #参数说明:
- #input,大小就是(n_example,n_in),其中n_example是一个batch的大小,
- #因为我们训练时用的是Minibatch SGD,因此input这样定义
- #n_in,即上一层(隐含层)的输出
- #n_out,输出的类别数
- class LogisticRegression(object):
- def __init__(self, input, n_in, n_out):
-
- #W大小是n_in行n_out列,b为n_out维向量。即:每个输出对应W的一列以及b的一个元素。
- self.W = theano.shared(
- value=numpy.zeros(
- (n_in, n_out),
- dtype=theano.config.floatX
- ),
- name='W',
- borrow=True
- )
-
- self.b = theano.shared(
- value=numpy.zeros(
- (n_out,),
- dtype=theano.config.floatX
- ),
- name='b',
- borrow=True
- )
-
- #input是(n_example,n_in),W是(n_in,n_out),点乘得到(n_example,n_out),加上偏置b,
- #再作为T.nnet.softmax的输入,得到p_y_given_x
- #故p_y_given_x每一行代表每一个样本被估计为各类别的概率
- #PS:b是n_out维向量,与(n_example,n_out)矩阵相加,内部其实是先复制n_example个b,
- #然后(n_example,n_out)矩阵的每一行都加b
- self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b)
-
- #argmax返回最大值下标,因为本例数据集是MNIST,下标刚好就是类别。axis=1表示按行操作。
- self.y_pred = T.argmax(self.p_y_given_x, axis=1)
-
- #params,LogisticRegression的参数
- self.params = [self.W, self.b]
- class MLP(object):
- def __init__(self, rng, input, n_in, n_hidden, n_out):
-
- self.hiddenLayer = HiddenLayer(
- rng=rng,
- input=input,
- n_in=n_in,
- n_out=n_hidden,
- activation=T.tanh
- )
-
- #将隐含层hiddenLayer的输出作为分类层logRegressionLayer的输入,这样就把它们连接了
- self.logRegressionLayer = LogisticRegression(
- input=self.hiddenLayer.output,
- n_in=n_hidden,
- n_out=n_out
- )
-
-
- #以上已经定义好MLP的基本结构,下面是MLP模型的其他参数或者函数
-
- #规则化项:常见的L1、L2_sqr
- self.L1 = (
- abs(self.hiddenLayer.W).sum()
- + abs(self.logRegressionLayer.W).sum()
- )
-
- self.L2_sqr = (
- (self.hiddenLayer.W ** 2).sum()
- + (self.logRegressionLayer.W ** 2).sum()
- )
-
-
- #损失函数Nll(也叫代价函数)
- self.negative_log_likelihood = (
- self.logRegressionLayer.negative_log_likelihood
- )
-
- #误差
- self.errors = self.logRegressionLayer.errors
-
- #MLP的参数
- self.params = self.hiddenLayer.params + self.logRegressionLayer.params
- # end-snippet-3
应用:各种机器学习任务,例如图像分类、语音识别、自然语言处理等
优点:非线性映射能力和适应性,使其能处理各种复杂的模式识别问题
参考链接:多层感知机(MLP)简介-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。