【Keras】MLP多层感知机

在进行神经网络模型的构建时,有优化模型训练速度的技巧,以下从两个方面进行分析。并在接下来实现MLP的模型中应用。

1、优化梯度下降

之前使用的梯度下降训练模型,优化模型的参数,但是每次更新梯度时需要把数据集中的每个样本都重新计算一边,在海量计算的深度学习中,这个计算量非常的大。

因此引入随机梯度的思想,随机抽取一批数据进行计算(数据量参数是:batch_size),这样计算量会大大减少,但是并不能保证计算出来的梯度方向正确。对于弯路问题,可以增加迭代次数补偿(iteration),因为只要迭代次数足够多,那么梯度下降最终也会朝着正确的方向优化参数。这种方法就是SGD算法(随机梯度下降)。

在SGD的基础上,梯度下降的过程中还有两个地方可以优化:
a>通过动量(参数:momentum),优化“弯路”轨迹。比如缓存一个之前的梯度的平均值,每次梯度更新时都和之前的平均梯度想加。
b>优化梯度下降时每一步的步长,或者受学习速率(learning rate,参数lr),一种思路是将lr**指数衰减,内在思想是当参数越接近理想点时学习的过程应该越谨慎。还有一个思路就是将学习速率的大小和损失函数输出值挂钩。大体上所有的学习速率优化的方式都是学习速率随着学习的过程不断减小**。

随机批量数据(batch)、梯度动量(momentum)和学习速率参数(learning rate)是优化梯度下降的三个重要部分。,常见的RMSprop、Adagrad都是在这三个地方对原始的梯度下降算法动手术,区别只是具体的实现方式不同。

梯度下降的内容总结:
a.梯度下降需要输入在同一尺度上可比较。处理手段:对数据集去均值和归一化,使其满足0均值,等方差
b.随机初始化参数权重,初始化的数值满足0均值,等方差
c.批量训练数据(batch)
d.动量(momentum)
e.学习速率(learning rate)

2、处理过度拟合(Dropout)

在浅层模型中,处理过拟合的常用手段是减少特征、增加数据集或者调整模型的L2正则化参数。在深层模型中,可以继续调节L2正则化参数或者采用(Dropout)。

Dropout的参数设置为0.25,在激活层之后,Dropout层会随机抽出1/4的数据集的激活值更改为0,同时将剩余神经元的**输出值等比放大**4/3,使得输出整体维持量级恒定。相当于使剩余的神经元负责被扔掉部分神经元的工作,学习了冗余的表达式。

3、MLP模型实践

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#from _future_ import print_function
import numpy as np
#from keras.dataseets import mnist
from keras.models import Sequential
from keras.layers.core import Dense,Activation,Dropout
from keras.optimizers import SGD,Adam,RMSprop
from keras.utils import np_utils

'''
一次epoch是指训练集整体被遍历一次,根据batch_sized大小决定包含多少个iteration;一次iteration对应的是一个batch数据,这时梯度参数更新一次。也就是说,使用SGD训练深度学习模型时,训练集可以被训练很多次。
'''
batch_size = 128 #梯度下降一个批(batch)的数据量,训练时拿一个batch的样本计算一次梯度下降,更新一次梯度。
nb_classes =10 #类别
nb_epoch =10 #梯度下降epoch循环训练次数,每次循环包含全部的样本,也就是模型的训练数据集全部被训练的次数
image_size = 28*28 #输入图片的大小,由于是灰度图片,因此只有一个颜色通道
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
#加载数据
x_train,y_train= mnist.train.images, mnist.train.labels
print(y_train)
#print(x_train.shape,y_train.shape) #(55000, 784) (55000, 10)
x_test,y_test= mnist.test.images, mnist.test.labels
#print(x_test.shape,y_test.shape) #(10000, 784) (10000, 10)
#创建模型,逻辑分类相当于一层全链接的神经网络(Dense是Keras中定义的DNN模型)
#model = Sequential([Dense(10,input_shape=(image_size,),activation= 'softmax')])
#创建模型,增加一层包含128个神经网络的隐层,Dense默认activation为linear线性
model = Sequential([Dense(512,input_shape=(image_size,)),
                    Activation('relu'),
                    Dropout(0.2),
                    Dense(512,input_shape = (512,)),
                    Activation('relu'),
                    Dropout(0.2),
                    Dense(10,input_shape = (512,),activation = 'softmax')])

"""编译的选项参数中,“优化器”是指训练模型时使用哪种方式优化模型参数,这些优化算法基本
上都是各种变种的梯度下降算法,这里选择SGD(随机梯度下降)。“loss”是指选择那种损失函数,这里选择多类别交叉熵。"""
model.compile(optimizer = 'rmsprop',loss = 'categorical_crossentropy',metrics= ['accuracy'])
#模型的训练函数:fit函数通过sample_per_epoch 和 nb_epoch 两个参数来确定什么时候训练终止,这两个参数指定了每个epoch包含多少个样本以及要训练多少个epoch。
model.fit(x_train,y_train,batch_size = batch_size,nb_epoch = nb_epoch,verbose = 1,validation_data = (x_test,y_test))
#模型评估
score = model.evaluate(x_test,y_test,verbose = 0)
#score分数包含两部分,一部分是val_loss,一部分是val_acc。取score[1]来进行模型的得分评价
print('Accuracy:{}'.format(score[1]))
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值