官方教程:
https://keras.io/
1.快速开始:30s上手Keras
Keras的核心数据结构是“模型”,模型是一种组织网络层的方式。Keras中主要的模型是Sequential模型,Sequential是一系列网络层按顺序构成的栈。你也可以查看函数式模型来学习建立更复杂的模型
#Sequential模型如下
from keras.models import Sequential
model = Sequential()
#将一些网络层通过.add()堆叠起来,就构成了一个模型:
from keras.layers import Dense, Activation
model.add(Dense(units=64, input_dim=100))
model.add(Activation("relu"))
model.add(Dense(units=10))
model.add(Activation("softmax"))
#完成模型的搭建后,我们需要使用.compile()方法来编译模型:
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
#编译模型时必须指明损失函数和优化器,如果你需要的话,也可以自己定制损失函数。
#Keras的一个核心理念就是简明易用同时,保证用户对Keras的绝对控制力度,
#用户可以根据自己的需要定制自己的模型、网络层,甚至修改源代码。
#from keras.optimizers import SGD
#model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01, momentum=0.9, nesterov=True))
#完成模型编译后,我们在训练数据上按batch进行一定次数的迭代来训练网络
model.fit(x_train, y_train, epochs=5, batch_size=32)
#当然,我们也可以手动将一个个batch的数据送入网络中训练,这时候需要使用:
#model.train_on_batch(x_batch, y_batch)
#随后,我们可以使用一行代码对我们的模型进行评估,看看模型的指标是否满足我们的要求:
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)
#或者,我们可以使用我们的模型,对新的数据进行预测:
classes = model.predict(x_test, batch_size=128)
模型通过添加各个网络层来构建
网络层: 神经网络就是通过一层一层的网络构建,每一层包含n个神经元,每个神经元接收上一层的m个输入信息,计算m个信息后,将输出传到下一层的k个神经元.如下图是一个5层神经网络(包括一个输入层,一个输出层,3个隐藏层),对应的应该有5个网络层:
keras实现了很多常用的网络层,官方已经详细介绍:
http://keras-cn.readthedocs.io/en/latest/layers/core_layer/
编译模型
在训练模型之前,我们需要通过compile来对学习过程进行配置。compile接收三个参数:
- 优化器optimizer:该参数可指定为已预定义的优化器名,如rmsprop、adagrad,或一个Optimizer类的对象
- 损失函数loss:该参数为模型试图最小化的目标函数,它可为预定义的损失函数名,如categorical_crossentropy、mse,也可以为一个损失函数。
- 指标列表metrics:对分类问题,我们一般将该列表设置为metrics=[‘accuracy’]。指标可以是一个预定义指标的名字,也可以是一个用户定制的函数.指标函数应该返回单个张量,或一个完成metric_name - > metric_value映射的字典.
个人理解:
优化器: 就是对神经网络优化,置于怎么优化,得看你传入什么参数,此处,我们就不深入研究.
损失函数: 可以理解为格式化数据,一般将数据变为0-1之间,具体的可以参考: http://blog.csdn.net/google19890102/article/details/50522945
指标列表metrics: 性能评估的方式
训练网络
- x:输入数据。如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array
- y:标签,numpy array
- batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。(关于梯度下降: http://m.blog.csdn.net/yhao2014/article/details/51554910)
- 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开始训练,在继续之前的训练时有用。
fit函数返回一个History的对象,其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况