首先给出官方解释:Keras官方文档-关于模型
在原本的Keras版本中,模型其实有两种,一种叫Sequential,称为序贯模型,也就是单输入单输出,一条路通到底,层与层之间只有相邻关系,跨层连接统统没有。这种模型编译速度快,操作上也比较简单。
第二种模型称为Graph,即图模型,这个模型支持多输入多输出,层与层之间想怎么连怎么连,但是编译速度慢。可以看到,Sequential其实是Graph的一个特殊情况。
在现在这版Keras中,图模型被移除,而增加了了“functional model API”,这个东西,更加强调了Sequential是特殊情况这一点。一般的模型就称为Model,然后如果你要用简单的Sequential,OK,那还有一个快捷方式Sequential。
由于functional model API表达的是“一般的模型”这个概念,我们这里将其译为泛型模型,即只要这个东西接收一个或一些张量作为输入,然后输出的也是一个或一些张量,那不管它是什么鬼,统统都称作“模型”。如果你有更贴切的译法,也欢迎联系我修改。
Keras有两种类型的模型,顺序模型(Sequential)和泛型模型(Model),两类模型中相同的方法有:
model.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_weights()
返回模型权重张量的列表,类型为numpy arraymodel.set_weights()
从numpy array里将权重载入给模型,要求数组具有与model.get_weights()相同的形状model.to_json
返回代表模型的JSON字符串,仅包含网络结构,不包含权值。可以从JSON字符串中重构原模型model.save_weights(filepath)
将模型权重保存到指定路径,文件类型是HDF5(后缀是.h5),注意,该函数只保存模型的权重,不保存网络结构、损失函数或优化器model.load_weights(filepath, by_name=False)
从HDF5文件中加载权重到当前模型中, 默认情况下模型的结构将保持不变。如果想将权重载入不同的模型(有些层相同)中,则设置by_name=True,只有名字匹配的层才会载入权重,与model.save_weights配合使用
Keras的泛型模型Model
Model是 Keras的泛型模型,即广义的拥有输入和输出的模型,比如:
from keras.models import Model
from keras.layers import Input, Dense
a = Input(shape=(32,))
b = Dense(32)(a)
model = Model(input=a, output=b)
如果具有多个输入或多个输出:
model = Model(input=[a1, a2], output=[b1, b3, b3])
Model的常用属性
model.layers
组成模型图的各个层model.inputs
模型的输入张量列表model.outputs
模型的输出张量列表
Model的常用方法
compile(self, optimizer, loss, metrics=[], loss_weights=None, sample_weight_mode=None)
功能:编译模型以供训练
optimizer:优化器
loss:损失
metrics:列表,包含用于评估模型的性能指标,如metrics=['accuracy']
如果要在多输出模型中为不同的输出指定不同的指标,可像该参数传递一个字典,例如metrics={'ouput_a': 'accuracy'}
需要注意的是:compile主要为训练服务,用于定义损失函数、优化器、评价指标等。如果只对模型进行预测,不需compile,可直接使用predict
fit(self, x, y, batch_size=32, nb_epoch=10, verbose=1, callbacks=[], validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None)
功能:训练模型
x:输入数据。如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array。如果模型的每个输入都有名字,则可以传入一个字典,将输入名与其输入数据对应起来
y:标签,numpy array。如果模型有多个输出,可以传入一个numpy array的list。如果模型的输出拥有名字,则可以传入一个字典,将输出名与其标签对应起来
batch_size:整数
nb_epoch:整数,训练的轮数,训练数据将会被遍历nb_epoch次(新版本中,该参数名改为epochs,默认为1)
verbose:日志显示模式,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录
callbacks:列表,其中的元素是keras.callbacks.Callback的对象
validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集,验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等
validation_data:形式为(X,y)或(X,y,sample_weights)的tuple,是指定的验证集,此参数将覆盖validation_spilt(实际应用中,发现使用列表也可以,即[X, y])
shuffle:布尔值,表示是否在训练过程中每个epoch前随机打乱输入样本的顺序
-
evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)
按batch计算在输入数据上模型的误差,返回模型评价指标如loss,accuracy,返回的指标由compile中的metrics参数指定
x:输入数据
y:标签
batch_size:整数
verbose:日志显示模型,只能取0或1 -
predict(self, x, batch_size=32, verbose=0)
本函数按batch获得输入数据对应的输出 -
train_on_batch(self, x, y, class_weight=None, sample_weight=None)
本函数在一个batch的数据上进行一次参数更新,函数返回训练误差的标量值或标量值的list,与evaluate的情形相同。 -
test_on_batch(self, x, y, sample_weight=None)
本函数在一个batch的样本上对模型进行评估,函数的返回与evaluate的情形相同 -
predict_on_batch(self, x)
本函数在一个batch的样本上对模型进行测试,函数返回模型在一个batch上的预测结果 -
fit_generator(self, generator, samples_per_epoch, nb_epoch, verbose=1, callbacks=[], validation_data=None, nb_val_samples=None, class_weight={}, max_q_size=10)
利用Python的生成器,逐个生成数据的batch并进行训练。生成器与模型将并行执行以提高效率。例如,该函数允许我们在CPU上进行实时的数据提升,同时在GPU上进行模型训练 -
evaluate_generator(self, generator, val_samples, max_q_size=10)
本函数使用一个生成器作为数据源,来评估模型,生成器应返回与test_on_batch的输入数据相同类型的数据。 -
predict_generator(self, generator, val_samples, max_q_size=10, nb_worker=1, pickle_safe=False)
从一个生成器上获取数据并进行预测,生成器应返回与predict_on_batch输入类似的数据 -
get_layer(self, name=None, index=None)
本函数依据模型中层的下标或名字获得层对象,泛型模型中层的下标依据自底向上,水平遍历的顺序。
name:字符串,层的名字
index: 整数,层的下标 -
save(self, filepath, overwrite=True, include_optimizer=True)
保存网络结构及参数
The savefile includes:
- The model architecture, allowing to re-instantiate the model.
- The model weights.
- The state of the optimizer, allowing to resume training
exactly where you left off.
This allows you to save the entirety of the state of a model in a single file.
Saved models can be reinstantiated via
keras.models.load_model
.
The model returned byload_model
is a compiled model ready to be used (unless the saved model
was never compiled in the first place).
即model.save与keras.models.load_model配合使用
save_weights(self, filepath, overwrite=True)
The weight file has:
-layer_names
(attribute), a list of strings
(ordered names of model layers).
- For every layer, agroup
namedlayer.name
- For every such layer group, a group attributeweight_names
,
a list of strings
(ordered names of weights tensor of the layer).
- For every weight in the layer, a dataset
storing the weight value, named after the weight tensor.
一个小例子:使用model.predict获取中间层输出
from keras.applications.vgg16 import VGG16
from keras.models import Model
from keras.layers import Input
from cv2 import imread, resize
# 读入一张图像
img = imread(filename='Black_Footed_Albatross_0001_796111.jpg', flags=1)
img = resize(img, dsize=(224, 224))
img = img.reshape((1, 224, 224, 3))
# 定义网络
inputs = Input(shape=(224, 224, 3))
base_model = VGG16(include_top=False, weights='imagenet', input_tensor=inputs)
model = Model(inputs=inputs, outputs=base_model.get_layer('block5_conv1').output) # 使用get_layer按照名称索引,得到想要的输出层,即VGG16的conv5_1层输出
# 利用model.predict获取conv5_1输出
feat = model.predict(x=img, batch_size=1)
# 打印feat的形状
print(feat)
print(feat.shape)
最终输出:
(1, 14, 14, 512)
即输入1张224×224×3的图像,在conv5_1可得到1个14×14×512大小的feature map