【tensorflow学习】tensorflow搭建模型常用函数以及使用方式

1 import

import tensorflow as tf

2 使用Sequential建立模型

在tf.keras.models.Sequential中添加模型:

官方文档对 Sequential 的描述是:Sequential groups a linear stack of layers into a tf.keras.Model

使用示例如:

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

# or
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(128, activation=;'relu')
model.add(tf.keras.layers.Dense(10, activation=;'softmax')

上一段函数建立了一个两层的全连接层。

2.1 全连接层

tf.keras.layers.Flatten()是一个用来将多维张量拉长变为一维张量的函数,如[[1, 2], [3, 4]]变为[1, 2, 3, 4]。tf.keras.layers.Dense()表示添加全连接函数,其中的参数activation表示添加的激活函数,分别为ReLU和softmax函数。其中的具体参数如下所示:

tf.keras.layers.Dense(
    units, activation=None, use_bias=True, kernel_initializer='glorot_uniform',
    bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None,
    activity_regularizer=None, kernel_constraint=None, bias_constraint=None,
    **kwargs
)
参数参数的赋值、具体含义
units正整数,表示输出空间的维数
activation字符串,表示激活函数,有’relu’、’‘softmax’、‘sigmod’、'tanh’等
use_bias布尔值,表示该曾是否使用偏置
kernel_initializer表示权重的初始化程序
bias_initializer表示偏置的初始化程序
kernel_regularizer表示权重的正则化方式,有l1、l2等
bias_regularizer表示偏置的正则化方式
activity_regularizer表示激活的正则化方式
kernel_constraint表示权重的约束函数
bias_constraint表示偏置的约束函数

2.2 卷积层

如果要添加卷积层,使用tf.keras.layers.Conv2D

tf.keras.layers.Conv2D(
    filters, kernel_size, strides=(1, 1), padding='valid', data_format=None,
    dilation_rate=(1, 1), groups=1, activation=None, use_bias=True,
    kernel_initializer='glorot_uniform', bias_initializer='zeros',
    kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,
    kernel_constraint=None, bias_constraint=None, **kwargs
)

该类许多参数与上面的Dense相似,在此只列举使用方式不同的参数:

参数参数的赋值、具体含义
filters整数,输出空间的维数(卷积核个数)
kernel_size一个整数或者两个整数的元组或列表,表示卷积核的h和w
strides一个整数或者两个整数的元组或列表,表示步长
padding字符串,表示填充方式,可选"same"或者"valid"
data_format字符串,可选channels_last(默认)或channels_first,表示输入数据的顺序,如果选择channels_last,顺序为(batch_size, height, width, channels) ,选择channels_first顺序为(batch_size, channels,height, width)
dilation_rate一个整数或者两个整数的元组或列表,表示指定用于卷积膨胀的膨胀率
groups一个正整数,指定输入沿通道轴划分的组数。

2.3 BN层

如果要添加BN层,使用tf.keras.layers.BatchNormalization

tf.keras.layers.BatchNormalization(
    axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True,
    beta_initializer='zeros', gamma_initializer='ones',
    ......, **kwargs
)

其中较为常见的有momentum动量等,此外需要注意的是,在训练过程中,如果使用了fit函数或 调用层或模型的时候使用training=True,BN 操作采用当前 batch 的均值和标准差当training = False 时,BN 操作采用滑动平均(running)的均值和标准差。在 Tensorflow 中,通常会指定training = False,可以更好地反映模型在测试集上的真实效果。滑动平均(running)的解释:滑动平均,即通过一个个 batch 历史的叠加,最终趋向数据集整体分布的过程,在测试集上进行推理时,滑动平均的参数也就是最终保存的参数。

2.4 池化层

如果要添加池化层,使用:

tf.keras.layers.AveragePooling2D

tf.keras.layers.AveragePooling2D(
    pool_size=(2, 2), strides=None, padding='valid', data_format=None,
    **kwargs
)

tf.keras.layers.MaxPool2D

tf.keras.layers.MaxPool2D(
    pool_size=(2, 2), strides=None, padding='valid', data_format=None,
    **kwargs
)

此外ReLU等层也可以通过tf.keras.layers进行添加。

3 模型配置及训练过程设置

3.1 compile配置

模型搭建好之后,训练的相关优化配置可以通过compile函数进行配置。

def compile(self,
            optimizer='rmsprop',
            loss=None,
            metrics=None,
            loss_weights=None,
            weighted_metrics=None,
            run_eagerly=None,
            **kwargs):
# Configures the model for training.

# how to use
model = tf.keras.models.Sequential()
model.compile(optimizer=,
              loss=,
              metrics=,
              ......)

其中:

optimizer(优化器)可以赋值为字符串或者具体的函数(具体的class见tf.keras.optimizers)。

  • ‘sgd’ or tf.keras.optimizers.SGD(lr=学习率,decay=学习率衰减率,momentum=动量参数)
  • ‘adagrad’ or tf.keras.optimizers.Adagrad(lr=学习率,decay=学习率衰减率)
  • ‘adadelta’ or tf.keras.optimizers.Adadelta(lr=学习率,decay=学习率衰减率)
  • ‘adam’ or tf.keras.optimizers.Adam (lr=学习率,decay=学习率衰减率)

loss(损失函数)可以赋值为字符串或者具体的函数(具体class见tf.keras.losses)。

  • ‘mse’ or tf.keras.losses.MeanSquaredError()均方误差
  • ‘sparse_categorical_crossentropy or tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
    交叉熵误差,from_logits表示损失函数是否需要转换为概率的形式。此外,如果是one-hot编码,则使用‘categorical_crossentropy or tf.keras.losses.CategoricalCrossentropy()

Metrics 可以输出网络评测的指标,以下为其中的三个主要参数(具体class见tf.keras.metrics.Metric)。

  • accuracy:pred和true都是数值。
  • categorical_accuracy:pred和true都是以独热码和概率分布表示。
  • sparse_ categorical_accuracy:pred是以数值形式给出,true 是以独热码形式给出。

3.2 过程设置

模型的训练过程可以通过fit函数进行设置:

def fit(self,
        x=None,
        y=None,
        batch_size=None,
        epochs=1,
        verbose=1,
        callbacks=None,
        validation_split=0.,
        validation_data=None,
        ......):
# how to use
model = tf.keras.models.Sequential()
model.fit(x=None,
          y=None,
          batch_size=None,
          epochs=1,
          ......)

x一般为输入数据,y为数据的标签,还可以设置batchsize、epoch、validation_data(验证数据)。

4 统计与评估

4.1 统计

最后可以使用summary函数打印出网络结构和参数统计:

model = tf.keras.models.Sequential()
model.summary()

# example of output
Model: "mnist_model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten (Flatten)            multiple                  0         
_________________________________________________________________
dense (Dense)                multiple                  100480    
_________________________________________________________________
dense_1 (Dense)              multiple                  1290      
=================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
_________________________________________________________________

4.2 评估

也可以用tf.keras.Model.evaluate函数来进行评估训练效果:

evaluate(
    x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None,
    callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False,
    return_dict=False
)

# how to use
model = tf.keras.models.Sequential()
model.evaluate(x=None, y=None)

x,y分别是测试数据以及标签。

5 自定义

5.1 自定义模型

不使用tf.keras.models.Sequential建立模型,可以通过继承父类tf.keras.Model来编写属于自己的模型,主要通过重写__init__()和call()来实现。

class MyModel(tf.keras.Model):
    def __init__(self):
        super().__init__()
        # 初始化代码,包括call()方法中会用到的层
        self.layer = tf.keras.layers.Conv2D()
        ......
        
    def call(self, input):
        # 建立模型的具体过程
        x = self.layer(inptu)
        ......
        output = tf.nn.softmax(x)
        return output

值得注意的是,在此处是重写的call()方法而不是_call_()方法,是因为在tf.keras.Model中_call_()被Keras使用了并且有一定用处,所以专门有一个用来重载的call()方法。

5.2 自定义层、损失函数、评估指标

自定义层通过继承tf.keras.layers.Layer类,重写__init__()、build()、call()三个方法实现。

class MyLayer(tf.keras.layers.Layer):
    def _init_(self):
        super().__init__()
        # 初始化代码
        
    def build(self, input_shape):
        # 在第一次使用该层时调用该部分代码
        # 在这里创建变量可以使变量的形状自适应输入的形状而不需要额外指定变量
        # 如果已经可以完全确定变量的形状,也可以在__init__部分创建变量
        self.variable = self.add_weight()
        
    def call(self, input):
        ......
        return output

自定义损失函数需要继承tf.keras.losses.Loss类,并重写call方法。

自定义评估指标需要继承tf.keras.metrics.Metric类,并重写__init__、update_state、result三个方法。

参考:
tf官方文档
tf相关慕课
简明的TensorFlow2 李锡涵等著

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值