首页 » Python » Keras学习笔记四:序贯模型(Sequential)

Keras学习笔记四:序贯模型(Sequential)

原文 http://blog.csdn.net/zhuzuwei/article/details/78991743

2018-01-07 02:00:37阅读(635)

一、Keras有两种类型的模型序贯模型(Sequential)和函数式模型(Model),函数式模型应用更为广泛,

序贯模型是函数式模型的一种特殊情况。

两类模型有一些方法是相同的:

·       model.summary():打印出模型概况,它实际调用的是keras.utils.print_summary

·       model.get_config():返回包含模型配置信息的Python字典。模型也可以从它的config信息中重构回去

config= model.get_config()

model= Model.from_config(config)

# or,for Sequential:

model= Sequential.from_config(config)

·       model.get_layer():依据层名或下标获得层对象

·       model.get_weights():返回模型权重张量的列表,类型为numpy array

·       model.set_weights():从numpy array里将权重载入给模型,要求数组具有与model.get_weights()相同的形状。

·       model.to_json:返回代表模型的JSON字符串,仅包含网络结构,不包含权值。可以从JSON字符串中重构原模型:

from models importmodel_from_json

json_string= model.to_json()

model= model_from_json(json_string)

·       model.to_yaml:与model.to_json类似,同样可以从产生的YAML字符串中重构模型

from models importmodel_from_yaml

yaml_string= model.to_yaml()

model= model_from_yaml(yaml_string)

·       model.save_weights(filepath):将模型权重保存到指定路径,文件类型是HDF5(后缀是.h5)

·       model.load_weights(filepath,by_name=False):从HDF5文件中加载权重到当前模型中, 默认情况下模型的结构将保持不变。

·       如果想将权重载入不同的模型(有些层相同)中,则设置by_name=True,只有名字匹配的层才会载入权重

下面先重点介绍序贯模型

二、序贯模型

序贯模型是多个网络层的线性堆叠,也就是“一条路走到黑”。

可以通过向Sequential模型传递一个layer的list来构造该模型:

from keras.models import Sequential
from keras.layers import Dense, Activation
model= Sequential([
Dense(32, units=784),
Activation('relu'),
Dense(10),
Activation('softmax'),
])

也可以通过.add()方法一个个的将layer加入模型中:

model= Sequential()
model.add(Dense(32, input_shape=(784,)))
model.add(Activation('relu'))

1.指定输入数据的shape

模型需要知道输入数据的shape,因此,Sequential的第一层需要接受一个关于输入数据shape的参数,后面的各个层则可以自动的推导出中间数据的shape,因此不需要为每个层都指定这个参数。有几种方法来为第一层指定输入数据的shape

·       传递一个input_shape的关键字参数给第一层,input_shape是一个tuple类型的数据,其中也可以填入None,如果填入None则表示此位置可能是任何正整数。数据的batch大小不应包含在其中。

·       有些2D层,如Dense,支持通过指定其输入维度input_dim来隐含的指定输入数据shape。一些3D的时域层支持通过参数input_dim和input_length来指定输入shape。

·       如果你需要为输入指定一个固定大小的batch_size(常用于stateful RNN网络),可以传递batch_size参数到一个层中,例如你想指定输入张量的batch大小是32,数据shape是(6,8),则你需要传递batch_size=32和input_shape=(6,8)。

model = Sequential()
model.add(Dense(32, input_dim=784))
model = Sequential()
model.add(Dense(32, input_shape=784))

2.编译

在训练模型之前,我们需要通过compile来对学习过程进行配置。compile接收三个参数:

·       优化器optimizer:该参数可指定为已预定义的优化器名,如rmsprop、adagrad,或一个Optimizer类的对象,详情见optimizers

·       损失函数loss:该参数为模型试图最小化的目标函数,它可为预定义的损失函数名,如categorical_crossentropy、mse,也可以为一个损失函数。详情见losses

·       指标列表metrics:对分类问题,我们一般将该列表设置为metrics=['accuracy']。指标可以是一个预定义指标的名字,也可以是一个用户定制的函数.指标函数应该返回单个张量,或一个完成metric_name- > metric_value映射的字典.

# For a multi-class classification problem
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
# For a binary classification problem
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
              metrics=['accuracy'])
# For a mean squared error regression problem
model.compile(optimizer='rmsprop',
              loss='mse')
# For custom metrics
import keras.backend as K
def mean_pred(y_true, y_pred):
    return K.mean(y_pred)
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy', mean_pred])
3.训练

Keras以Numpy数组作为输入数据和标签的数据类型。训练模型一般使用fit函数

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)

本函数将模型训练nb_epoch轮,其参数有:

·       x:输入数据。如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array

·       y:标签,numpy array

·       batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。

·       epochs:整数,训练终止时的epoch值,训练将在达到该epoch值时停止,当没有设置initial_epoch时,它就是训练的总轮数,否则训练的总轮数为epochs -inital_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变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况

4. evaluate

evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)
本函数按batch计算在某些输入数据上模型的误差,其参数有:
•	x:输入数据,与fit一样,是numpy array或numpy array的list
•	y:标签,numpy array
•	batch_size:整数,含义同fit的同名参数
•	verbose:含义同fit的同名参数,但只能取0或1
•	sample_weight:numpy array,含义同fit的同名参数
本函数返回一个测试误差的标量值(如果模型没有其他评价指标),或一个标量的list(如果模型还有其他的评价指标)。model.metrics_names将给出list中各个值的含义。如果没有特殊说明,以下函数的参数均保持与fit的同名参数相同的含义如果没有特殊说明,以下函数的verbose参数(如果有)均只能取0或1

5.预测predict

predict(self, x, batch_size=32, verbose=0)

本函数按batch获得输入数据对应的输出,其参数有:

函数的返回值是预测值的numpyarray

 

注意:train_on_batch,test_on_batch,predict_on_batch是按batch进行训练,测试和预测,fit_generator,evaluate_generator,predict_generator利用python生成器,逐个生成数据的batch并进行训练,评估和预测。

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹