• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

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

Keras admin 4个月前 (08-10) 362次浏览 0个评论 扫描二维码

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

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

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

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

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 中会经常使用这里描述的代码。


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Keras 从零学习-模型定义(序列模型)-0x03
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!