Keras学习3:模型Model

本文介绍了Keras的模型类型,包括原有的Sequential和Graph模型,现版本移除Graph增加泛型模型Model。阐述了Sequential和Model两类模型相同方法,详细介绍了Model的常用属性和方法,如编译、训练等,最后给出使用model.predict获取中间层输出的小例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先给出官方解释:Keras官方文档-关于模型

在原本的Keras版本中,模型其实有两种,一种叫Sequential,称为序贯模型,也就是单输入单输出,一条路通到底,层与层之间只有相邻关系,跨层连接统统没有。这种模型编译速度快,操作上也比较简单。

第二种模型称为Graph,即图模型,这个模型支持多输入多输出,层与层之间想怎么连怎么连,但是编译速度慢。可以看到,Sequential其实是Graph的一个特殊情况。

在现在这版Keras中,图模型被移除,而增加了了“functional model API”,这个东西,更加强调了Sequential是特殊情况这一点。一般的模型就称为Model,然后如果你要用简单的Sequential,OK,那还有一个快捷方式Sequential。

由于functional model API表达的是“一般的模型”这个概念,我们这里将其译为泛型模型,即只要这个东西接收一个或一些张量作为输入,然后输出的也是一个或一些张量,那不管它是什么鬼,统统都称作“模型”。如果你有更贴切的译法,也欢迎联系我修改。

Keras有两种类型的模型,顺序模型(Sequential)和泛型模型(Model),两类模型中相同的方法有:

  1. model.summary() 打印模型概况,即给出网络结构
  2. model.get_config() 返回包含模型配置信息的Python字典。模型也可以从它的config信息中重构回去
config = model.get_config()
model = Model.from_config(config)
# or, for Sequential
model = Sequential.from_config(config)
  1. model.get_weights() 返回模型权重张量的列表,类型为numpy array
  2. model.set_weights() 从numpy array里将权重载入给模型,要求数组具有与model.get_weights()相同的形状
  3. model.to_json 返回代表模型的JSON字符串,仅包含网络结构,不包含权值。可以从JSON字符串中重构原模型
  4. model.save_weights(filepath) 将模型权重保存到指定路径,文件类型是HDF5(后缀是.h5),注意,该函数只保存模型的权重,不保存网络结构、损失函数或优化器
  5. 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的常用属性

  1. model.layers 组成模型图的各个层
  2. model.inputs 模型的输入张量列表
  3. model.outputs 模型的输出张量列表

Model的常用方法

  1. compile(self, optimizer, loss, metrics=[], loss_weights=None, sample_weight_mode=None)
    功能:编译模型以供训练
    optimizer:优化器

loss:损失

metrics:列表,包含用于评估模型的性能指标,如metrics=['accuracy'] 如果要在多输出模型中为不同的输出指定不同的指标,可像该参数传递一个字典,例如metrics={'ouput_a': 'accuracy'}

需要注意的是:compile主要为训练服务,用于定义损失函数、优化器、评价指标等。如果只对模型进行预测,不需compile,可直接使用predict

  1. 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前随机打乱输入样本的顺序

  1. evaluate(self, x, y, batch_size=32, verbose=1, sample_weight=None)
    按batch计算在输入数据上模型的误差,返回模型评价指标如loss,accuracy,返回的指标由compile中的metrics参数指定
    x:输入数据
    y:标签
    batch_size:整数
    verbose:日志显示模型,只能取0或1

  2. predict(self, x, batch_size=32, verbose=0)
    本函数按batch获得输入数据对应的输出

  3. train_on_batch(self, x, y, class_weight=None, sample_weight=None)
    本函数在一个batch的数据上进行一次参数更新,函数返回训练误差的标量值或标量值的list,与evaluate的情形相同。

  4. test_on_batch(self, x, y, sample_weight=None)
    本函数在一个batch的样本上对模型进行评估,函数的返回与evaluate的情形相同

  5. predict_on_batch(self, x)
    本函数在一个batch的样本上对模型进行测试,函数返回模型在一个batch上的预测结果

  6. 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上进行模型训练

  7. evaluate_generator(self, generator, val_samples, max_q_size=10)
    本函数使用一个生成器作为数据源,来评估模型,生成器应返回与test_on_batch的输入数据相同类型的数据。

  8. predict_generator(self, generator, val_samples, max_q_size=10, nb_worker=1, pickle_safe=False)
    从一个生成器上获取数据并进行预测,生成器应返回与predict_on_batch输入类似的数据

  9. get_layer(self, name=None, index=None)
    本函数依据模型中层的下标或名字获得层对象,泛型模型中层的下标依据自底向上,水平遍历的顺序。
    name:字符串,层的名字
    index: 整数,层的下标

  10. 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 by load_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配合使用

  1. 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, a group named layer.name
- For every such layer group, a group attribute weight_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值