下面的这个网址讲的很好,可以用来系统学习。
Keras中文文档
Optimizers
Optimizers包含了一些优化的方法,比如最基本的随机梯度下降SGD,另外还有Adagrad、Adadelta、RMSprop、Adam
Objectives
这是目标函数模块,定义了用什么形式来误差优化,keras提供了mean_squared_error/mse :平均方差
mean_absolute_error /mae :绝对误差
Mean absolute percentage error(MAPE) 平均绝对比例误差
Mean Squared Logarithmic Error(msle) 对数误差
squared_hinge,
hinge,
binary_crossentropy,
categorical_crossentropy
Activations
这是激活函数模块,keras提供了linear、sigmoid、hard_sigmoid、tanh、softplus、relu、 softplus,另外softmax也放在Activations模块里(我觉得放在layers模块里更合理些)。此外,像LeakyReLU和 PReLU这种比较新的激活函数,keras在keras.layers.advanced_activations模块里提供。
Initializations
这是参数初始化模块,在添加layer的时候调用init进行初始化。keras提供了uniform、lecun_uniform、normal、orthogonal、zero、glorot_normal、he_normal这几种。
layers
layers模块包含了core、convolutional、recurrent、advanced_activations、normalization、embeddings这几种layer。
其中core里面包含了flatten(CNN的全连接层之前需要把二维特征图flatten成为一维的)、reshape(CNN输入时将一维的向量弄成二维的)、dense(就是隐藏层,dense是稠密的意思),还有其他的就不介绍了。convolutional层基本就是Theano的 Convolution2D的封装。
Preprocessing
这是预处理模块,包括序列数据的处理,文本数据的处理,图像数据的处理。重点看一下图像数据的处理,keras提供了 ImageDataGenerator函数,实现data augmentation,数据集扩增,对图像做一些弹性变换,比如水平翻转,垂直翻转,旋转等。
Models
这是最主要的模块,模型。上面定义了各种基本组件,model是将它们组合起来,下面通过一个实例来说明。
compile(optimizer, loss, class_mode=”categorical”):
参数:
optimizer: str (优化函数的名称) 或者优化对象.参考 optimizers.
loss: str (目标函数的名称) 或者目标函数. 参考 objectives.
class_mode: 值为”categorical”, “binary”. 用于计算分类正确率或调用 predict_classes方法.
fit(X, y, batch_size=128, nb_epoch=100, verbose=1, validation_split=0., validation_data =None, shuffle=True, show_accuracy=False): 固定的 epochs训练一个模型.
返回值:记录在字典中的训练成功的损失值,也可是验证损失值或精确度(适用的话).
参数:
X: data.
y: labels.
batch_size: int. 每一次迭代的样本数目. 用来随机梯度下降的
nb_epoch: int. 学习次数
verbose: 0 表示不更新日志, 1 更新日志, 2 每个epoch一个进度行.
validation_split: float (0 < x < 1).验证集的一部分.
validation_data: tuple (X, y) 数据作为验证集. 将加载validation_split.
shuffle: boolean. 每个 epoch是否随机抽取样本.
show_accuracy: boolean. 每个epoch是否显示分类正确率.
evaluate(X, y, batch_size=128, show_accuracy=False, verbose=1): 通过验证集的数据显示model的性能.
Return: 返回数据的损失值.
Arguments: 和上面fit函数定义相同. verbose用作二进制标识(进度条或无).
predict(X, batch_size=128, verbose=1):
Return: 测试数据的预测数组.
Arguments: 和fit一样.
predict_classes(X, batch_size=128, verbose=1): 返回test data的类预测数组.
Return: 测试数据的标签数组.
Arguments: 和fit一样.
train(X, y, accuracy=False): 一个batch的梯度更新. if accuracy==False, return tuple (loss_on_batch, accuracy_on_batch). Else, return loss_on_batch.
Return: 损失值, 或者tuple (loss, accuracy) if accuracy=True.
test(X, y, accuracy=False): 一个batch的性能计算. if accuracy==False, return tuple (loss_on_batch, accuracy_on_batch). Else, return loss_on_batch.
Return: 损失值, 或 tuple (loss, accuracy) if accuracy=True.
save_weights(fname):保存所有层的权值到HDF5文件中.
load_weights(fname): 加载保存在save_weights中模型权值. 只能加载相同结构的文件.
keras.layers.core.Dense(input_dim, output_dim, init=’glorot_uniform’, activation=’linear’, weights=None \
W_regularizer=None, b_regularizer=None, W_constraint=None, b_constraint=None)
标准的1D全连接层
Input shape: 2D tensor with shape: (nb_samples, input_dim).
Output shape: 2D tensor with shape: (nb_samples, output_dim).
input_dim: int >= 0.输入维度
output_dim: int >= 0.输出维度
#-*- coding: utf-8 -*-
#使用神经网络算法预测销量高低
import pandas as pd
#参数初始化
inputfile = 'F:/PythonMaterial/chapter5/chapter5/demo/data/sales_data.xls'
data = pd.read_excel(inputfile, index_col = u'序号') #导入数据
#数据是类别标签,要将它转换为数据
#用1来表示“好”、“是”、“高”这三个属性,用0来表示“坏”、“否”、“低”
data[data == u'好'] = 1
data[data == u'是'] = 1
data[data == u'高'] = 1
data[data != 1] = 0
x = data.iloc[:,:3].as_matrix().astype(int)
y = data.iloc[:,3].as_matrix().astype(int)
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
model = Sequential() #初始化一个神经网络,建立模型,Sequential是多个网络层的线性堆叠
model.add(Dense(output_dim=10,input_shape=(3,)))#添加一层神经网,如果是第一层就要指定input_shape,表示输入3个维度,输出10个维度的隐含层
# model.add(Dropout(0.5))#使用Dropout防止过拟合
model.add(Activation('relu')) #用relu函数作为激活函数,能够大幅提供准确度
model.add(Dense(input_dim=10, output_dim=1))#隐含层输入10个维度,跟上面的输出是一样的,结果层是1个维度
model.add(Activation('sigmoid')) #由于是0-1输出,用sigmoid函数作为激活函数
# model.add(Dropout(0.5))#使用Dropout防止过拟合
model.compile(loss = 'binary_crossentropy', optimizer = 'adam',metrics=['accuracy'])
#编译模型。由于我们做的是二元分类,所以我们指定损失函数为binary_crossentropy,
# metrics:列表,包含评估模型在训练和测试时的网络性能的指标,或一个标量的list(如果模型还有其他的评价指标)。
#另外常见的损失函数还有mean_squared_error、categorical_crossentropy等,请阅读帮助文件。
#求解方法我们指定用adam,还有sgd、rmsprop等可选
model.fit(x, y, nb_epoch = 1000, verbose=0,batch_size = 10) #训练模型,学习一千次,训练数据被遍历了1000次;每次迭代10个样本,随机梯度下降每做10个样本就计算损失函数,使目标函数优化一步
yp = model.predict_classes(x).reshape(len(y)) #分类预测,产生输入数据的类别预测结果,reshape改变数组的形状
score =model.evaluate(x, y, batch_size=10)#本函数返回一个测试误差的标量值(如果模型没有其他评价指标)对测试集做评价
print '\n'
print model.metrics_names#将给出list中各个值的含义,loss表示误差值,acc表示准确率
print '\n'
print '\n'
print yp
print '\n'
print score
# from cm_plot import * #导入自行编写的混淆矩阵可视化函数
# cm_plot(y,yp).show() #显示混淆矩阵可视化结果
结果:
verbose=0可以不打印训练的过程,默认是1,就是打印训练的过程。
从结果可以看出,准确率是0.76,主要是因为训练集太少,神经网络需要大量的训练数据,但是其也非常容易过拟合,所以需要使用Dropout来防止过拟合。