Keras从零学习-模型定义(序列模型)-0x03

2,495次阅读
没有评论

共计 4634 个字符,预计需要花费 12 分钟才能阅读完成。

之前的文章是使用感知机作为引导,文章中也涉及到一点点的keras代码示例,从这篇开始主要以讲解keras代码为主,暂时主要讲解api的使用,如果涉及到很低层的原理相关,我自己理解多少会写多少,水平有限。

回到正题,这一节主要是讲一下Keras定义模型的第一种方法:序列模型定义

你可以把它当做一个流水线

Keras从零学习-模型定义(序列模型)-0x03

你定义的模型就是按照流水线的方式,一个接着一个衔接在一起,然后完成定义。

from keras.models import Sequential

上面的代码就是引入了序列模型的类,它的初始化函数如下所示

def __init__(self, layers=None, name=None):
        super(Sequential, self).__init__(name=name)
        self._build_input_shape = None

        # Add to the model any layers passed to the constructor.
        if layers:
            for layer in layers:
                self.add(layer)

从上面可以看出layers这个参数你传入一系列的网络层,它会自动的将这些网络层加入到网络中,即使你没有传入由于add函数的存在,后续你也可以手动一步一步将这些网络层添加到网络中去。
So 到了这里关于序列网络初始化的方式就有两种了,举例如下

from keras.layers import Dense, Activation

model = Sequential([
    Dense(32, input_shape=(784,)),
    Activation('relu'),
    Dense(10),
    Activation('softmax'),
])

上面这个例子就是直接传入一个网络层的列表,Sequential的对象初始化的时候会迭代这个列表将其加入到网络中去。
那么下面这种定义的方式也是正确的

model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))

上面你就是定义了一个简单的神经网络模型了,注意输入数据大的大小在input_dim那里指定了,这个784是特征的维度,与你进行模型训练时候输入的样本数量没有多大关系,只与你输入的样本的特征维度相关,如果你输入的是图像三维信息,那么得用多维去表示,那么就不是784一维数据了 。
这上面只是定义了一个空架子,你还要知道怎么去运行,神经网络做这些分类或者回归任务也是要有优化目标的,而且模型是要在真实的样本数据上跑起来,那么跟着下面一起来继续学习吧。

首先讲解写模型编译,它主要解决的问题是配置网络运行的各种参数

# 二分类问题
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

关于compile 可以简单的看下函数定义

compile(optimizer, loss=None, metrics=None, loss_weights=None,
 sample_weight_mode=None, weighted_metrics=None, target_tensors=None)

参数的说明

  • optimizer: String (优化器名称) ,这就是常见的机器学习优化器,常见的像sgd,adam之类的,adam应该是普及用的最多的
  • loss: String (name of objective function) ,损失函数,对于二分类任务就是交叉熵,回归任务就是mse之类的。
  • metrics: 在模型训练和验证的时候都需要一个指标来反映模型的好坏,这样你可以之道模型有没有学偏了,这个参数就指定了在训练过程的监控的指标,比如使用准确率 metrics=['accuracy']
  • loss_weights: 如果的模型有多个任务输出,在优化全局loss的时候,需要给每个输出指定相应的权重信息,在mtl这些应该会有这个指定的必要。

这下面还有很多参数,好像暂时也用不上了,我在研究研究。

  • sample_weight_mode: If you need to do timestep-wise sample weighting (2D weights), set this to "temporal"None defaults to sample-wise weights (1D). If the model has multiple outputs, you can use a different sample_weight_mode on each output by passing a dictionary or a list of modes.
  • weighted_metrics: List of metrics to be evaluated and weighted by sample_weight or class_weight during training and testing.
  • target_tensors: By default, Keras will create placeholders for the model’s target, which will be fed with the target data during training. If instead you would like to use your own target tensors (in turn, Keras will not expect external Numpy data for these targets at training time), you can specify them via the target_tensors argument. It can be a single tensor (for a single-output model), a list of tensors, or a dict mapping output names to target tensors.
  • **kwargs: When using the Theano/CNTK backends, these arguments are passed into K.function. When using the TensorFlow backend, these arguments are passed into tf.Session.run.

所以compile函数就是配置了模型训练的参数,让模型以定义的方式去优化。

模型已经定义好了,并且也配置了相关的参数,所以下一步就是要去拟合数据了

model.fit(data, labels, epochs=10, batch_size=32)

上面列出的方法fit就是去拟合真实的训练数据。

  • data就是你训练样本数据
  • label 就是你训练的样本的标签,对于二分类就是 0 1 假设你要区分猫和不是猫,那么0表示不是猫,1是猫

epochs就是训练的样本集迭代的轮数,比如你的样本集有100个,那么epochs为10,那么意味着100个样本要被训练10次,batch_size是每一个step迭代输入的样本数量

所以这里在啰嗦依据epoch与step之间的关系,多个step构成一个epoch,就是这么简单。

还是在看一下fit的方法定义吧!

fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, 
validation_split=0.0, validation_data=None, shuffle=True, class_weight=None,
 sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)

这里面的参数是真多,套用官网的解释

  • x: 训练数据的 Numpy 数组。 如果模型中的输入层被命名,你也可以传递一个字典,将输入层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,x 可以是 None(默认)。
  • y: 目标(标签)数据的 Numpy 数组。 如果模型中的输出层被命名,你也可以传递一个字典,将输出层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,y 可以是 None(默认)。
  • batch_size: 整数或 None。每次提度更新的样本数。如果未指定,默认为 32.
  • epochs: 整数。训练模型迭代轮次。一个轮次是在整个 x 或 y 上的一轮迭代。请注意,与 initial_epoch 一起,epochs 被理解为 「最终轮次」。模型并不是训练了 epochs 轮,而是到第 epochs 轮停止训练。
  • verbose: 0, 1 或 2。日志显示模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮一行。
  • callbacks: 一系列的 keras.callbacks.Callback 实例。一系列可以在训练时使用的回调函数。详见 callbacks
  • validation_split: 在 0 和 1 之间浮动。用作验证集的训练数据的比例。模型将分出一部分不会被训练的验证数据,并将在每一轮结束时评估这些验证数据的误差和任何其他模型指标。验证数据是混洗之前 x 和y 数据的最后一部分样本中。
  • validation_data: 元组 (x_val,y_val) 或元组 (x_val,y_val,val_sample_weights),用来评估损失,以及在每轮结束时的任何模型度量指标。模型将不会在这个数据上进行训练。这个参数会覆盖 validation_split
  • shuffle: 布尔值(是否在每轮迭代之前混洗数据)或者 字符串 (batch)。batch 是处理 HDF5 数据限制的特殊选项,它对一个 batch 内部的数据进行混洗。当 steps_per_epoch 非 None时,这个参数无效。
  • class_weight: 可选的字典,用来映射类索引(整数)到权重(浮点)值,用于加权损失函数(仅在训练期间)。这可能有助于告诉模型 「更多关注」来自代表性不足的类的样本。
  • sample_weight: 训练样本的可选 Numpy 权重数组,用于对损失函数进行加权(仅在训练期间)。您可以传递与输入样本长度相同的平坦(1D)Numpy 数组(权重和样本之间的 1:1 映射),或者在时序数据的情况下,可以传递尺寸为 (samples, sequence_length) 的 2D 数组,以对每个样本的每个时间步施加不同的权重。在这种情况下,你应该确保在 compile() 中指定 sample_weight_mode="temporal"
  • initial_epoch: 开始训练的轮次(有助于恢复之前的训练)。
  • steps_per_epoch: 在声明一个轮次完成并开始下一个轮次之前的总步数(样品批次)。使用 TensorFlow 数据张量等输入张量进行训练时,默认值 None 等于数据集中样本的数量除以 batch 的大小,如果无法确定,则为 1。
  • validation_steps: 只有在指定了 steps_per_epoch时才有用。停止前要验证的总步数(批次样本)。

以上就是关于序列模型的定义,这只是简单的描述,后续的一些Demo中会经常使用这里描述的代码。

正文完
请博主喝杯咖啡吧!
post-qrcode
 
admin
版权声明:本站原创文章,由 admin 2019-08-10发表,共计4634字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码