tensorflow2.0(一)tf.keras

本文深入探讨TensorFlow 2.0及其与Keras的关系,讲解tf.keras的使用方法,包括Sequential模型、函数API和Subclassing API的构建方式,以及模型训练与评估的具体步骤。

tensorflow 2.0

tensorflow和keras及tf.keras的区别

API:API,全称Application Programming Interface,即应用程序编程接口。API是一些预定义函数,目的是用来提供应用程序与开发人员基于某软件或者硬件得以访问一组例程的能力,并且无需访问源码或无需理解内部工作机制细节。

tensorflow是Google开源的基于数据流图的机器学习框架;Keras是基于TensorFlow和Theano(由加拿大蒙特利尔大学开发的机器学习框架)的深度学习库,是由纯python编写而成的高层神经网络API,是为了支持快速实践而对tensorflow或者Theano的再次封装

区别:keras本身并不具备底层运算的能力,所以它需要和一个具备这种底层运算能力的backend(后端)协同工作。即keras为前端,tensorflow为keras常用的后端

tf.keras是一个不强调后端可互换性、和tensorflow更紧密整合、得到tensorflow其他组建更好支持、且符合keras标准的高层次API。如今tf.keras版本和keras进行了同步,tf.keras作为官方的tensorflow的高级API。

更加详细的区别见:

https://blog.youkuaiyun.com/u011119817/article/details/102793949

https://blog.youkuaiyun.com/u011119817/article/details/102793949

tf.keras的用法

推荐查看官方文档来进行学习
官方文档:

https://tensorflow.google.cn/guide/keras/overview

https://tensorflow.google.cn/versions

tf.keras中模型定义由简到繁:

Sequential -> Functional API -> Functional API + Custom_define -> Subclassing API

模型训练由简到繁:

model.fit -> model.fit + callbacks -> call train_on_batch with GradientTape -> GradientTape with all new algorithm

1.Sequential模型

搭建tf.keras.models.Sequential()模型

tf.keras.Sequential 模型是层的简单堆叠,且输入输出都只能有一个,无法表示任意模型。

查看tensorflow版本

import tensorflow as tf
print(tf.__version__)
from tensorflow import keras
#1.构造网络模型
model = keras.models.Sequential([ 
    keras.layers.Flatten(input_shape=(28, 28)), 
    #全连接层Dense输入需展平
    #此部分采用的特征数据shape为(5000, 28, 28)所以在Dense之前添加一个Flatten展平
    keras.layers.Dense(128, activation='relu'), 
    keras.layers.Dropout(0.2),  #为前一层添加dropout
    keras.layers.Dense(10, activation='softmax')])
#2.选择优化方式和损失函数
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
#3.训练并验证模型
model.fit(x_train, y_train, epochs=5,batch_size=32,validation_data=(x_valid, y_valid))
model.evaluate(x_test, y_test,batch_size=32)

  • 当输入的数据不需要展平时,构建网络模型时如下,直接在第一中间层添加input_shape。
model = keras.models.Sequential([
    keras.layers.Dense(30, activation='relu',
                       input_shape=x_train.shape[1:]),
    keras.layers.Dense(1),
])
  • 损失函数:
categorical_crossentropy多分类对数损失 #多分类常用
binary_crossentropy对数损失#二分类
mean_squared_error平均方差损失
mean_absolute_error平均绝对值损失

​ categorical_crossentropy要求target为one-hot编码,sparse_categorical_crossentropy要求target为非one-hot编码,函数内部进行one-hot编码实现。如果你的 targets 是one-hot 编码,categorical_crossentropy,如果你的 tagets是数字编码 ,用 sparse_categorical_crossentropy。

  • 优化器:SGD随机梯度下降, RMSProp,Adam等。

Sequential模型扩展

构建卷积神经网络

from tensorflow import keras
model=keras.models.Sequential([
    keras.layers.Conv2D(filters=32,kernel_size=3,padding='same',
                       activation='relu',input_shape=[width,height,channel]),
    keras.layers.Conv2D(filters=32,kernel_size=3,padding='same',
                       activation='relu'),
    keras.layers.MaxPool2D(pool_size=2),
    keras.layers.Flatten(),
    keras.layers.Dense(128,activation='relu'),
    keras.layers.Dense(num_classes,activaton='softmax')
])
model. compile(loss='categorical_crossentropy',
              optimizer='adam',metrics=['accuracy'])
model.summary()

Conv2D层的参数

  • filters:卷积核个数
  • kernel_size:卷积核大小,可以为一个单个的整数,表示长宽相同;也可以表示为(height,weight)。
  • strides:步长,可以用一个单数,也可以用元组表示沿高度和宽度方向的步长;默认为(1,1)。
  • padding:有“same”和“valid”两种填充方式,padding=‘valid’表示不进行填充,默认为‘valid’。
  • data_format:有“channels_first”和“channels_last”分别表示输入(batch, channels, height, width)和(batch, height, width, channels),默认的data_format=‘None’,一般无需指定。
  • activation
  • kernel_initializer:卷积核中权重矩阵的初始化方式。默认kernel_initializer=‘glorot_uniform’,即Xavier初始化方式。更多初始化方式见tf.keras.initializers。
  • bias_initializer:卷积核偏差初始化方式。默认bias_initializer=‘zeros’。
  • kernel_regularizer:卷积核权重矩阵的正则化方式。默认为kernel_regularizer=None,可设定列如:kernel_regularizer=tf.keras.regularizers.l2(l=0.01),其中l即为L2正则项系数,详见keras.regularizers。
  • bias_regularizer
  • activity_regularizer:对于该层输出进行正则化的方式。

batch norm(批归一化)

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
#对激活函数后的a进行批归一化
for _ in range(20):
    model.add(keras.layers.Dense(100, activation="relu"))
    model.add(keras.layers.BatchNormalization())
#对Z进行归一化后再激活
for _ in range(20):
    model.add(keras.layers.Dense(100,))
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Activation('relu'))

BatchNormalization层的参数:

  • axis:要进行归一化的轴,如Conv2D中的data_format="channels_first"时,数据为(batch, channels, height, width),此时用axis=1表示在通道方向;当data_format="channels_last"时,设置axis=3或者axis=-1;axis默认为-1。
  • trainable:trainable是layers的层属性,在tensorflow2.0中BN的trainable和其他层的trainable有所不同:对于layers,trainable属性为可变动的bool值,决定layer是否可以训练,设置layer.trainable=False的意思是冻结该层(Frozen state),即其内部状态在训练期间不会改变:其可训练权重在fit()或train_on_batch()期间不会更新,其状态更新也不会运行。但是,在BatchNormalization层的情况下,在该层上设置trainable=False意味着该层随后将以测试模式(inference mode)运行(意味着它将使用移动平均值和移动方差来规范当前批,而不是使用当前批的平均值和方差)。此行为仅在TensorFlow 2.0之后发生。在1.*中,设置layer.trainable=False将冻结层,但不会将其切换到inference mode。

BatchNormalization层的调用参数(call arguments):

  • trainingBN在training和inference时使用的方法是不一样的

    当training =True时,表示此时归一化用于训练,此时均值和方差就是计算出当前minibatch的均值方差;

    当training=False时,表示用于测试、预测(inference mode),此时再逐个计算当前的均值和方差是非常耗时的,此时会调用训练结束时保存的running_mean、running_var,在test时直接使用训练得到的running mean/var标准化数据。

    训练时保存的running_mean、running_var(称为moving average)方式如下:

    running_mean = momentum * running_mean + (1 - momentum) * sample_mean
    running_var = momentum * running_var + (1 - momentum) * sample_var
    #可以理解为每次更新running mean相当于把之前的值衰减一些(* momentum),然后把当前的minibatch sample mean加进去一部分(* (1-momentum))。其实也就是一阶指数平滑平均。
    

    注:其中momentum为设定值,和优化方法中的momentum没什么关系。

  • momentum:tensorflow中默认设定为0.99

注:

对于一些预定义的经典模型,其中的某些层(例如 BatchNormalization )在训练和测试时的行为是不同的(可以参考 这篇文章 )。因此,在训练模型时,需要手动设置训练状态,告诉模型 “我现在是处于训练模型的阶段”。可以通过

tf.keras.backend.set_learning_phase(True)

进行设置,也可以在调用模型时通过将 training 参数设为 True 来设置。

Droupout

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
model.add(keras.layers.Dense(100, activation="rel
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值