一、什么是keras
Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。
Keras的神经网络API是在封装后与使用者直接进行交互的API组件,在使用时可以调用Keras的其它组件。除数据预处理外,使用者可以通过神经网络API实现机器学习任务中的常见操作,包括人工神经网络的构建、编译、学习、评估、测试等。
英文文档;百度百科;中文文档。
二、基于keras的MLP模型实现(序贯模型Sequential)
序贯模型是多个网络层的线性堆叠,也就是“一条路走到黑”。
1、搭建模型
1.1、序列化模型:
Keras的序列化模型是由其API中网络层对象堆叠得到的神经网络模型 。
序列化模型有两种创建方式:
(1)将网络层实例的列表传递给 Sequential 的构造器,来创建一个 Sequential 模型。
(2)对Sequential类使用model.add()添加层对象。
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential([
Dense(32, input_shape=(784,)),
Activation('relu'),
Dense(10),
Activation('softmax'),])
或
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
1.2、核心网络层:Core Layers,英文链接;中文链接
Dense(全连接层):多层感知器的各个层都是全连接层。
Dense 实现以下操作: 输出output = activation(dot(input, kernel) + bias) 其中 activation 是按逐个元素计算的激活函数,kernel 是由网络层创建的权值矩阵,以及 bias 是其创建的偏置向量 (只在 use_bias 为 True 时才有用)。
Dense类:
keras.layers.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)
参数说明:
参数名称 | 解释 |
---|---|
units | 代表该层的输出维度 |
activation | 激活函数 ,默认None,为线性 |
use_bias | 是否使用偏置b,默认None |
kernel_initializer | 权重初始化方法,默认均匀分布初始化 |
bias_initializer | 偏置初始化方法,默认为0 |
kernel_regularizer | 施加在权重上的正则项,默认None |
bias_regularizer | 运用到偏置向的的正则化函数,默认None |
activity_regularizer | 运用到层的输出的正则化函数,默认为None |
kernel_constraint | 运用到权值矩阵的约束函数 ,默认为None |
bias_constraint | 运用到偏置向量的约束函数,默认为None |
若想指定输入输出尺寸shape:
输入尺寸:inputshape,最常见的是 (batch_size, input_dim) 的2维输入。
输出尺寸:output shape,nD , 对于尺寸为 (batch_size, input_dim) 的 2维 输入, 输出的尺寸为 (batch_size, units)。
注意:batch_size是当样本数很大时, 有时需要将样本分为N个batch, 这个N就是nb_batch(batch数量), 此时一个batch中包含的样本数量即是batch_size。
使用方法:模型需要知道输入数据的shape,因此,Sequential的第一层需要接受一个关于输入数据shape的参数,有几种方法来为第一层指定输入数据的shape:
(1)使用input_shape:传递一个input_shape的关键字参数给第一层,input_shape是一个tuple类型的数据,其中也可以填入None,如果填入None则表示此位置可能是任何正整数。数据的batch大小不应包含在其中。
(2)input_dim等:使用有些2维层,如Dense,支持通过指定其输入维度input_dim来隐含的指定输入数据shape,是一个Int类型的数据。一些3维的时域层,支持通过参数input_dim和input_length来指定输入shape。
(3)batch_size使用:如果你需要为输入指定一个固定大小的batch_size(常用于RNN网络),可以传递batch_size参数到一个层中,例如你想指定输入张量的batch大小是32,数据shape是(6,8),则你需要传递batch_size=32和input_shape=(6,8)
model = Sequential()
model.add(Dense(32, input_shape=(16,)))
或
model.add(Dense(units=32, input_dim=16))
或
model.add(Dense(32, input_shape=(5000,16)))
2、模型编译
在训练模型之前,您需要配置学习过程,这是通过 compile 方法完成的。它接收三个参数:
(1)优化器 optimizer:它可以是现有优化器的字符串标识符,如 rmsprop 或 adagrad,也可以是 Optimizer 类的实例。详见:optimizers中的各个优化器实例。
(2)损失函数 loss:模型试图最小化的目标函数。它可以是现有损失函数的字符串标识符,如 categorical_crossentropy 或 mse,也可以是一个目标函数。详见:losses的损失函数实例化。
(3)评估标准 metrics:对于任何分类问题,你都希望将其设置为 metrics = [‘accuracy’]。评估标准可以是现有的标准的字符串标识符,也可以是自定义的评估标准函数。
3、模型训练
Keras 模型在输入数据和标签的 Numpy 矩阵上进行训练。为了训练一个模型,你通常会使用 fit 函数。参数为样本特征和标签,以及迭代次数和批大小,如:
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout
# 生成虚拟数据
x_train = np.random.random((1000, 20))
y_train = np.random.randint(2, size=(1000, 1))
x_test = np.random.random((100, 20))
y_test = np.random.randint(2, size=(100, 1))
model = Sequential()
model.add(Dense(64, input_dim=20, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
model.fit(x_train, y_train,
epochs=20,
batch_size=128)
score = model.evaluate(x_test, y_test, batch_size=128)
4、利用tensorflow的keras实现
实际过程和直接利用keras基本一致:
tensorflow中文文档
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)