"""基于MLP的softmax多分类(十分类)"""
import keras
#引入序列模型模型
from keras.models import Sequential
#引入全连接层、
# 随机失活(引入随机失活后,神经网络的每个节点都会贡献内容,不会出现少数高权重节点完全控制输出结果的情况,因此降低了网络的结构风险)
# 激活层(没有直接用到,在全连接层间接用到)
from keras.layers import Dense, Dropout, Activation
#引入SGD优化
from keras.optimizers import SGD
# 生成虚拟数据
import numpy as np
#生成一个1000*20维的向量
x_train = np.random.random((1000, 20))
#生成一个1000*10维的向量
#先通过np生成一个1000*1维的其值为0-9的矩阵,然后再通过 keras.utils.to_categorical 方法获取成一个1000*10维的二元矩阵。
#one hot 对类型标签进行编码
y_train = keras.utils.to_categorical(np.random.randint(10, size=(1000, 1)), num_classes=10)
x_test = np.random.random((100, 20))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
#构建序列模型
model = Sequential()
# Dense(64) 是一个具有 64 个隐藏神经元的全连接层。
# 在第一层必须指定所期望的输入数据尺寸:
# 在这里,是一个 20 维的向量。
model.add(Dense(64, activation='relu', input_dim=20))
#放弃层,将在训练过程中每次更新参数时随机断开一定百分比的输入神经元,防止过拟合
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
#优化算法为SGD
#lr 大于0的浮点数 学习率
#momentum 大于0的浮点数 动量参数
#decay 大于0的浮点数 每次更新后的浮点数衰减值
#nesterov: 布尔值 确定是否使用Nesterov动量
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
#对模型预编译,其损失函数为多类别交叉熵,优化算法为SGD,评估方法为多类别准确度和平均绝对误差
#优化器optimizer: 指定为已预定义的优化器名
#loss:试图最小化的目标函数
# metrisc:分类问题一般设置为metrics=['accuracy']
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
#fit函数返回一个history对象,其中history.history属性记录了损失函数和其他指标的数值随epoch变化的情况
model.fit(x_train, y_train,
epochs=20,
batch_size=128)
#模型评估
score = model.evaluate(x_test, y_test, batch_size=128)
keras.layers.core.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None, **kwargs)
Dense就是常用的全连接层,所实现的运算是output = activation(dot(input, kernel)+bias)。其中activation是逐元素计算的激活函数,kernel是本层的权值矩阵,bias为偏置向量,只有当use_bias=True才会添加。
如果本层的输入数据的维度大于2,则会先被压为与kernel相匹配的大小。
但是我们更关注的是参数的含义:
units:大于0的整数,代表该层的输出维度。
activation:激活函数,为预定义的激活函数名(参考激活函数),或逐元素(element-wise)的Theano函数。如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x)
use_bias: 布尔值,是否使用偏置项
kernel_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
bias_initializer:权值初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。参考initializers
kernel_regularizer:施加在权重上的正则项,为Regularizer对象
bias_regularizer:施加在偏置向量上的正则项,为Regularizer对象
activity_regularizer:施加在输出上的正则项,为Regularizer对象
kernel_constraints:施加在权重上的约束项,为Constraints对象
bias_constraints:施加在偏置上的约束项,为Constraints对象
而这里我们看到了一个不同,那就是输入的单元input_dim没有出现在定义中,其实它藏在了**kwargs中,因为源码中这样写道:
if 'input_shape' not in kwargs and 'input_dim' in kwargs:
kwargs['input_shape'] = (kwargs.pop('input_dim'),)
这里就有出现问题了,什么是
input_dim
和
input_shape
。他们的区别在于,如果是2D张量,则可以使用
input_dim
即可,但是如果是三维的话,可能就需要
input_length
来帮忙了,具体来讲,他们之间的联系是:
input_dim = input_shape(input_dim,)
input_dim, input_length = input_shape(input_length, input_dim,)
#像我们上面例子中的就是一个20维的数据,但是如果是识别手写体的话,你的原始数据是二维的,比如这个是 (28, 28) = 784,这个是mnist的手写数据。2维数据可以看成是1维的,那1维的shape就是(28*28,)了。
常用激活函数:
softmax
这是归一化的多分类,可以把K维实数域压缩到(0,1)的值域中,并且使得K个数值和为1。
sigmoid
这时归一化的二元分类,可以把K维实数域压缩到近似为0,1二值上。
relu
这也是常用的激活函数,它可以把K维实数域映射到[0,inf)区间。
tanh
这时三角双曲正切函数,它可以把K维实数域映射到(-1,1)区间。
Dropout层
它的原型为:
keras.layers.core.Dropout(rate, noise_shape=None, seed=None)
1
正如上面所述,为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时随机断开一定百分比(rate)的输入神经元,Dropout层用于防止过拟合。
其参数含义如下:
rate:0~1的浮点数,控制需要断开的神经元的比例。
noise_shape:整数张量,为将要应用在输入上的二值Dropout mask的shape,例如你的输入为(batch_size, timesteps, features),并且你希望在各个时间步上的Dropout mask都相同,则可传入noise_shape=(batch_size, 1, features)。
seed:整数,使用的随机数种子
优化算法
优化算法最常用的为SGD算法,也就是随机梯度下降算法。这里我们不多讲,因为优化算法我们会单开一章来总结一下所有的优化算法。
这里我们只讲这里用到的SGD,它的原型为:
keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)
- lr:大于0的浮点数,学习率
- momentum:大于0的浮点数,动量参数
- decay:大于0的浮点数,每次更新后的学习率衰减值
- nesterov:布尔值,确定是否使用Nesterov动量
模型的训练
fit(self, x, y, batch_size=32, epochs=10, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0)
x:输入数据。如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array
y:标签,numpy array
batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。
epochs:整数,训练的轮数,每个epoch会把训练集轮一遍。
verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录
callbacks:list,其中的元素是keras.callbacks.Callback的对象。这个list中的回调函数将会在训练过程中的适当时机被调用,参考回调函数
validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等。注意,validation_split的划分在shuffle之前,因此如果你的数据本身是有序的,需要先手工打乱再指定validation_split,否则可能会出现验证集样本不均匀。
validation_data:形式为(X,y)的tuple,是指定的验证集。此参数将覆盖validation_spilt。
shuffle:布尔值或字符串,一般为布尔值,表示是否在训练过程中随机打乱输入样本的顺序。若为字符串“batch”,则是用来处理HDF5数据的特殊情况,它将在batch内部将数据打乱。
class_weight:字典,将不同的类别映射为不同的权值,该参数用来在训练过程中调整损失函数(只能用于训练)
sample_weight:权值的numpy array,用于在训练时调整损失函数(仅用于训练)。可以传递一个1D的与样本等长的向量用于对样本进行1对1的加权,或者在面对时序数据时,传递一个的形式为(samples,sequence_length)的矩阵来为每个时间步上的样本赋不同的权。这种情况下请确定在编译模型时添加了sample_weight_mode=’temporal’。
initial_epoch: 从该参数指定的epoch开始训练,在继续之前的训练时有用。
模型的评估
evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)
x:输入数据,与fit一样,是numpy array或numpy array的list
y:标签,numpy array
batch_size:整数,含义同fit的同名参数
verbose:含义同fit的同名参数,但只能取0或1
sample_weight:numpy array,含义同fit的同名参数
转自:
---------------------
作者:刘炫320
来源:CSDN
原文:https://blog.csdn.net/qq_35082030/article/details/77170284
版权声明:本文为博主原创文章,转载请附上博文链接!