前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >keras doc 4 使用陷阱与模型

keras doc 4 使用陷阱与模型

作者头像
CreateAMind
发布2018-07-20 16:44:30
1.2K0
发布2018-07-20 16:44:30
举报
文章被收录于专栏:CreateAMindCreateAMind

本文摘自http://keras-cn.readthedocs.io/en/latest/

Keras使用陷阱

这里归纳了Keras使用过程中的一些常见陷阱和解决方法,如果你的模型怎么调都搞不对,或许你有必要看看是不是掉进了哪个猎人的陷阱,成为了一只嗷嗷待宰(?)的猎物

Keras陷阱不多,我们保持更新,希望能做一个陷阱大全

内有恶犬,小心哟

TF卷积核与TH卷积核

Keras提供了两套后端,Theano和Tensorflow,这是一件幸福的事,就像手中拿着馒头,想蘸红糖蘸红糖,想蘸白糖蘸白糖

如果你从无到有搭建自己的一套网络,则大可放心。但如果你想使用一个已有网络,或把一个用th/tf 训练的网络以另一种后端应用,在载入的时候你就应该特别小心了。

卷积核与所使用的后端不匹配,不会报任何错误,因为它们的shape是完全一致的,没有方法能够检测出这种错误。

在使用预训练模型时,一个建议是首先找一些测试样本,看看模型的表现是否与预计的一致。

如需对卷积核进行转换,可以使用utils.np_utils.kernel_convert,或使用utils.layer_utils.convert_all_kernels_in_model来对模型的所有卷积核进行转换

向BN层中载入权重

如果你不知道从哪里淘来一个预训练好的BN层,想把它的权重载入到Keras中,要小心参数的载入顺序。

一个典型的例子是,将caffe的BN层参数载入Keras中,caffe的BN由两部分构成,bn层的参数是mean,std,scale层的参数是gamma,beta

按照BN的文章顺序,似乎载入Keras BN层的参数应该是[mean, std, gamma, beta]

然而不是的,Keras的BN层参数顺序应该是[gamma, beta, mean, std],这是因为gamma和beta是可训练的参数,而mean和std不是

Keras的可训练参数在前,不可训练参数在后

错误的权重顺序不会引起任何报错,因为它们的shape完全相同

shuffle和validation_split的顺序

模型的fit函数有两个参数,shuffle用于将数据打乱,validation_split用于在没有提供验证集的时候,按一定比例从训练集中取出一部分作为验证集

这里有个陷阱是,程序是先执行validation_split,再执行shuffle的,所以会出现这种情况:

假如你的训练集是有序的,比方说正样本在前负样本在后,又设置了validation_split,那么你的验证集中很可能将全部是负样本

同样的,这个东西不会有任何错误报出来,因为Keras不可能知道你的数据有没有经过shuffle,保险起见如果你的数据是没shuffle过的,最好手动shuffle一下

未完待续

如果你在使用Keras中遇到难以察觉的陷阱,请发信到moyan_work@foxmail.com说明~赠人玫瑰,手有余香,前人踩坑,后人沾光,有道是我不入地狱谁入地狱,愿各位Keras使用者积极贡献Keras陷阱。老规矩,陷阱贡献者将被列入致谢一栏

关于Keras模型

Keras有两种类型的模型,顺序模型(Sequential)泛型模型(Model)

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

  • model.summary():打印出模型概况
  • model.get_config():返回包含模型配置信息的Python字典。模型也可以从它的config信息中重构回去
代码语言:javascript
复制
config = model.get_config()
model = Model.from_config(config)# or, for Sequentialmodel = Sequential.from_config(config)
  • model.get_weights():返回模型权重张量的列表,类型为numpy array
  • model.set_weights():从numpy array里将权重载入给模型,要求数组具有与model.get_weights()相同的形状。
  • model.to_json:返回代表模型的JSON字符串,仅包含网络结构,不包含权值。可以从JSON字符串中重构原模型:
代码语言:javascript
复制
from models import model_from_json

json_string = model.to_json()
model = model_from_json(json_string)
  • model.to_yaml:与model.to_json类似,同样可以从产生的YAML字符串中重构模型
代码语言:javascript
复制
from models import model_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模型

Sequential模型接口

如果刚开始学习Sequential模型,请首先移步这里阅读文档

常用Sequential属性

  • model.layers是添加到模型上的层的list

Sequential模型方法

compile

代码语言:javascript
复制
compile(self, optimizer, loss, metrics=[], sample_weight_mode=None)

编译用来配置模型的学习过程,其参数有

  • optimizer:字符串(预定义优化器名)或优化器对象,参考优化器
  • loss:字符串(预定义损失函数名)或目标函数,参考目标函数
  • metrics:列表,包含评估模型在训练和测试时的网络性能的指标,典型用法是metrics=['accuracy']
  • sample_weight_mode:如果你需要按时间步为样本赋权(2D权矩阵),将该值设为“temporal”。默认为“None”,代表按样本赋权(1D权)。在下面fit函数的解释中有相关的参考内容。
  • kwargs:使用TensorFlow作为后端请忽略该参数,若使用Theano作为后端,kwargs的值将会传递给 K.function
代码语言:javascript
复制
model = Sequential()
model.add(Dense(32, input_shape=(500,)))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
      loss='categorical_crossentropy',
      metrics=['accuracy'])

fit

代码语言:javascript
复制
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)

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

  • x:输入数据。如果模型只有一个输入,那么x的类型是numpy array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array
  • y:标签,numpy array
  • batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。
  • nb_epoch:整数,训练的轮数,训练数据将会被遍历nb_epoch次。Keras中nb开头的变量均为"number of"的意思
  • verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录
  • callbacks:list,其中的元素是keras.callbacks.Callback的对象。这个list中的回调函数将会在训练过程中的适当时机被调用,参考回调函数
  • validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等。
  • 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'

fit函数返回一个History的对象,其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况


evaluate

代码语言:javascript
复制
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


predict

代码语言:javascript
复制
predict(self, x, batch_size=32, verbose=0)

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

函数的返回值是预测值的numpy array


predict_classes

代码语言:javascript
复制
predict_classes(self, x, batch_size=32, verbose=1)

本函数按batch产生输入数据的类别预测结果

函数的返回值是类别预测结果的numpy array或numpy


predict_proba

代码语言:javascript
复制
predict_proba(self, x, batch_size=32, verbose=1)

本函数按batch产生输入数据属于各个类别的概率

函数的返回值是类别概率的numpy array


train_on_batch

代码语言:javascript
复制
train_on_batch(self, x, y, class_weight=None, sample_weight=None)

本函数在一个batch的数据上进行一次参数更新

函数返回训练误差的标量值或标量值的list,与evaluate的情形相同。


test_on_batch

代码语言:javascript
复制
test_on_batch(self, x, y, sample_weight=None)

本函数在一个batch的样本上对模型进行评估

函数的返回与evaluate的情形相同


predict_on_batch

代码语言:javascript
复制
predict_on_batch(self, x)

本函数在一个batch的样本上对模型进行测试

函数返回模型在一个batch上的预测结果


fit_generator

代码语言:javascript
复制
fit_generator(self, generator, samples_per_epoch, nb_epoch, verbose=1, callbacks=[], validation_data=None, nb_val_samples=None, class_weight=None, max_q_size=10)

利用Python的生成器,逐个生成数据的batch并进行训练。生成器与模型将并行执行以提高效率。例如,该函数允许我们在CPU上进行实时的数据提升,同时在GPU上进行模型训练

函数的参数是:

  • generator:生成器函数,生成器的输出应该为:
    • 一个形如(inputs,targets)的tuple
    • 一个形如(inputs, targets,sample_weight)的tuple。所有的返回值都应该包含相同数目的样本。生成器将无限在数据集上循环。每个epoch以经过模型的样本数达到samples_per_epoch时,记一个epoch结束
  • samples_per_epoch:整数,当模型处理的样本达到此数目时计一个epoch结束,执行下一个epoch
  • verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录
  • validation_data:具有以下三种形式之一
    • 生成验证集的生成器
    • 一个形如(inputs,targets)的tuple
    • 一个形如(inputs,targets,sample_weights)的tuple
  • nb_val_samples:仅当validation_data是生成器时使用,用以限制在每个epoch结束时用来验证模型的验证集样本数,功能类似于samples_per_epoch
  • max_q_size:生成器队列的最大容量

函数返回一个History对象

例子:

代码语言:javascript
复制
def generate_arrays_from_file(path):
    while 1:
    f = open(path)        for line in f:            # create numpy arrays of input data
            # and labels, from each line in the file
            x, y = process_line(line)            yield (x, y)
    f.close()

model.fit_generator(generate_arrays_from_file('/my_file.txt'),
        samples_per_epoch=10000, nb_epoch=10)

evaluate_generator

代码语言:javascript
复制
evaluate_generator(self, generator, val_samples, max_q_size=10)

本函数使用一个生成器作为数据源评估模型,生成器应返回与test_on_batch的输入数据相同类型的数据。该函数的参数与fit_generator同名参数含义相同

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-10-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CreateAMind 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文摘自http://keras-cn.readthedocs.io/en/latest/
  • Keras使用陷阱
    • TF卷积核与TH卷积核
      • 向BN层中载入权重
        • shuffle和validation_split的顺序
          • 未完待续
          • 关于Keras模型
          • Sequential模型接口
            • 常用Sequential属性
              • Sequential模型方法
                • compile
                • fit
                • evaluate
                • predict
                • predict_classes
                • predict_proba
                • train_on_batch
                • test_on_batch
                • predict_on_batch
                • fit_generator
                • evaluate_generator
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档