TensorFlow—Keras常用API

TensorFlow—Keras常用API

文章目录

  • TensorFlow—Keras常用API
    • 前言
    • 一.模型自定义
      • 1. keras.Sequential
      • 2.keras.layers.Layer
    • 二.模型配置与训练
      • 1.compile
      • 2. fit
    • 三.模型预测
    • 四.模型评价
    • 五.模型保存与加载
    • 六.Keras架构

前言

Keras当中的东西和神经网络的建立息息相关。当我们拿来一个神经网络模型的时候,我们会发现,无论是模型建立,模型的评估。都需要这个Keras。

本来,Keras和TensorFlow并无什么瓜葛,但是在TensorFlow当中,也引入了Keras,这使得TensorFlow几乎可以和Keras无缝衔接。这个就是:tf.Keras。要想在TensorFlow中使用keras,则输入如下代码即可

import tensorflow as tf
from tensorflow.keras import layers # 除了layers,其它相关api也可以导入

下面,我们分为几个大类,来简单介绍一下tf.keras的常用API

一.模型自定义

主要有这么几个方法:keras.Sequential,keras.layers.Layer,keras.Model

1. keras.Sequential

中文译名:序列。它是一种“从头一路走到尾”的模型,而不会像很多复杂的神经网络那样,从一个神经元,传导到多个神经元。因此,序列模型是一种最为基本的模型。

比如说,我们可以建立一个最简单的,从头到尾的,并没有什么实际意义的一个模型:

import tensorflow as tf
from tensorflow.keras import layers

net = tf.keras.Sequential([layers.Dense(256,activation='relu'),\
                           layers.Dense(128,activation='relu'),\
                           layers.Dense(64,activation='relu'),\
                           layers.Dense(32,activation='relu'),\
                           layers.Dense(10)])
net.build(input_shape=(None, 28*28))
net.summary()

最后在编译器当中的输出结果就是:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 256)               200960    
_________________________________________________________________
dense_1 (Dense)              (None, 128)               32896     
_________________________________________________________________
dense_2 (Dense)              (None, 64)                8256      
_________________________________________________________________
dense_3 (Dense)              (None, 32)                2080      
_________________________________________________________________
dense_4 (Dense)              (None, 10)                330       
=================================================================
Total params: 244,522
Trainable params: 244,522
Non-trainable params: 0
_________________________________________________________________

Process finished with exit code 0

其中:对于layers.Dense,译为:全连接层。即:用来创建一个全连接层。它的初始函数如下:

def __init__(
    inputs,
    units,
    activation=None,
    use_bias=True,
    kernel_initializer=None,  ##卷积核的初始化器
    bias_initializer=tf.zeros_initializer(),  ##偏置项的初始化器,默认初始化为0
    kernel_regularizer=None,    ##卷积核的正则化,可选
    bias_regularizer=None,    ##偏置项的正则化,可选
    activity_regularizer=None,   ##输出的正则化函数
    kernel_constraint=None,   
    bias_constraint=None,
    trainable=True,
    name=None,  ##层的名字
    reuse=None  ##是否重复使用参数
)

这当中,常用的参数有:

  • inputs:输入该网络层的数据

  • units:输出的维度大小,改变inputs的最后一维

  • activation:激活函数,即神经网络的非线性变化

  • use_bias:使用bias为True(默认使用),不用bias改成False即可,是否使用偏置项

  • trainable=True:表明该层的参数是否参与训练

关于build函数,按照官方文档的说法就是:

"""
Builds the model based on input shapes received.

This is to be used for subclassed models, which do not know at instantiation
time what their inputs look like.

This method only exists for users who want to call `model.build()` in a
standalone way (as a substitute for calling the model on real data to
build it). It will never be called by the framework (and thus it will
never throw unexpected errors in an unrelated workflow).
"""

而summary函数就是用来打印Dense模型的,如果没有summary,我们在编译器当中就看不到那个输出结果。

2.keras.layers.Layer

在TensorFlow当中,给了用户自由定义模型和层的权力。Layer就是用来让用户自定义层的。你可以写一个类,这个类只要继承这个Layer,就可以实现自定义Layer的功能。

在此当中,最终要的是__init__()函数和call()函数。这两个根据神经网络的需要,自己定义,同时,也可以根据具体需要,添加其他方法。call()函数之所以重要,是因为它是整个自定义Layer的执行者,并且要返回最终的结果。

我们假设有如下的自定义Layer:

from keras import backend as K
from keras.engine.topology import Layer
import numpy as np

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        # Create a trainable weight variable for this layer.
        self.kernel = self.add_weight(name='kernel', 
                                      shape=(input_shape[1], self.output_dim),
                                      initializer='uniform',
                                      trainable=True)
        super(MyLayer, self).build(input_shape)  # Be sure to call this somewhere!

    def call(self, x):
        return K.dot(x, self.kernel)

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)

在这个类当中,build和compute_output_shape是用户在构造函数和call函数之外。自己定义的方法。

二.模型配置与训练

主要是compile方法以及fit方法

1.compile

在训练之前,我们还要配置一下模型,这个时候,就要用到compile。这个方法如下所示:

def compile(self,
              optimizer='rmsprop',
              loss=None,
              metrics=None,
              loss_weights=None,
              weighted_metrics=None,
              run_eagerly=None,
              steps_per_execution=None,
              **kwargs):

其中optimizer代表优化器(梯度下降改进中的那些,都属于optimizer。包括SGD等等也都是),loss代表损失函数,metrics包含评估模型在训练和测试时的性能的指标。

一次全部传入,TensorFlow就会自动运行,无需再用如下形式(这个形式写起来真的很麻烦)

with tf.GradientTape() as tape:
    ……

有了compile,我们大可以这样:

net.compile(optimizer=optimizers.Adam(lr=0.01),\
            loss=tf.losses.CategoricalCrossentropy(from_logits=True),\
           metrics=['accuracy'])

就全都搞定了。

上面这个代码中:tf.losses.CategoricalCrossentropy计算的是交叉熵损失函数。

关于metrics事关模型的评价指标,可以看看第四部分。这个地方其实也支持用户自定义的评价标准

2. fit

真正训练模型的时候,我们就要用这个fit了,fit的参数非常多:

def fit(self,
          x=None,
          y=None,
          batch_size=None,
          epochs=1,
          verbose='auto',
          callbacks=None,
          validation_split=0.,
          validation_data=None,
          shuffle=True,
          class_weight=None,
          sample_weight=None,
          initial_epoch=0,
          steps_per_epoch=None,
          validation_steps=None,
          validation_batch_size=None,
          validation_freq=1,
          max_queue_size=10,
          workers=1,
          use_multiprocessing=False):

x相当于sklearn当中的x_train,y相当于sklearn当中的y_train。batch_size指定训练多少数据,epochs指定训练几轮……

三.模型预测

这个很简单了,有一个专门的方法predict(),用法和sklearn当中的sklearn有几分神似

四.模型评价

主要是Metrics接口。

这个接口当中,提供了非常多的评价指标,包括:

  • binary_accuracy:方法metrics.binary_accuracy(y_true,y_pred)
    对二分类问题,计算在所有预测值上的平均正确率
  • categorical_accuracy
    对多分类问题,计算在所有预测值上的平均正确率
  • mean_square_error
    MSE均方误差
  • mean_absolute_error
    MSE 平均绝对误差
  • mean_absolute_percentage_error
    MAPE 平均绝对百分比误差
  • mean_square_logarithmic_error
    MSLE 均方对数误差
  • hinge
    铰链误差
  • categorical_crossentropy
    多分类交叉熵
  • possion
    泊松损失
  • cosine_proximity
    用预先来判断两个向量的相似度
  • top_k_categorical_accracy
    计算top_k 正确率,当预测值的前K个值存在目标类别即认为预测正确
  • 等等

当我根据上面这些,创建了一个评价指标后,我还可以调用Update_data()来更新数值,比如:

acc_meter = metrics.Accuracy()
loss_meter = metrics.Mean()

loss_meter.update_state(loss)
acc_meter.update_state(y,pred)

五.模型保存与加载

在现实当中,模型保存非常重要。比如说,我已经训练出来了一个模型,我不可能每次用之前,我都要重新训练一次,在大型的工程当中,训练模型用几个星期,几个月都是有可能的。这显然不现实。

同时,我还要应付断电等突发情况,如果我不定时保存模型,万一训练的途中断电了,那之前的模型就白训练了,这显然也是不可以接受的。于是模型保存与加载就非常必要了。

模型加载与保存主要有这么几个方法:

  • save/load weights:保存/加载 模型的权值

  • save/load entire model:保存整个模型

上面这些方法,参数都是保存的路径名

六.Keras架构

TensorFlow—Keras常用API_第1张图片

TensorFlow—Keras常用API_第2张图片

TensorFlow—Keras常用API_第3张图片

你可能感兴趣的:(tensorflow)