[Tensorflow2.0]Kreas高层接口--简介及常用功能模块介绍

Keras高层接口

​ Keras 是一个主要由 Python 语言开发的开源神经网络计算库,它被设计为高度模块化和易扩展的高层神经网络接口,使得用户可以不需要过多的 专业知识就可以简洁、快速地完成模型的搭建与训练。

​ Keras 库分为前端和后端,其中后端可以基于现有的深度学习框架实现,如 Theano,CNTK,TensorFlow,前端接口即Keras 抽象过的统一接口API。用户通过Keras 编写的代码可以轻松的切换不同的后端运行,灵活性较大。

​ 在TensorFlow2.X版本中,Keras被正式确定为TensorFlow的高层API唯一接口,取代了TensorFlow1.X版本中自带的tf.layers等高层接口。也就是说,现在只能使用Keras的接口来完成TensorFlow层方式的模型搭建与训练。 在 TensorFlow中,Keras被实现在 tf.keras子模块中

那么Keras 与 tf.keras 有什么区别与联系呢?其实Keras 可以理解为一套搭建与训练神经网络的高层API协议,Keras本身已经实现了此协议,可以方便的调用TensorFlow,CNTK等后端完成加速计算;在TensorFlow中,也实现了一套Keras 协议,即 tf.keras,但只能基于 TensorFlow后端计算,并对TensorFlow的支持更好。对于使用 TensorFlow的开发者来说,tf.keras 可以理解为一个普通的子模块,与其他子模块,如 tf.math,tf.data 等并没有什么差别。

常见功能模块

​ Keras 提供了一系列高层的神经网络类和函数,如常见数据集加载函数,网络层类,模型容器,损失函数类,优化器类,经典模型类等等。对于常见数据集,通过一行代码即可下载、管理、加载功能函数,这些数据集包括 Boston 房价预测数据集,CIFAR图片数据 集,MNIST/FashionMNIST 手写数字图片数据集,IMDB文本数据集等。

1 常见网络层类

​ 对于常见的神经网络层,可以使用张量方式的底层接口函数来实现,这些接口函数一般在 tf.nn 模块中。更常用地,对于常见的网络层,我们一般直接使用层方式来完成模型的搭建,在 tf.keras.layers 命名空间(下文使用 layers 指代 tf.keras.layers)中提供了大量常见网络层的类接口,如全连接层,激活含水层,池化层,卷积层,循环神经网络层等等。对于这些网络层类,只需要在创建时指定网络层的相关参数,并调用__call__方法即可完成前向计算。在调用__call__方法时,Keras会自动调用每个层的前向传播逻辑,这些逻辑一般实现 在类的 call 函数中。

以 Softmax 层为例,它既可以使用 tf.nn.softmax 函数在前向传播逻辑中完成Softmax 运算,也可以通layers.Softmax(axis)类搭建 Softmax 网络层,其中 axis 参数指定 进行 softmax 运算的维度。

import tensorflow as tf # 导入 keras 模型,不能使用 
import keras,它导入的是标准的 Keras 库 
from tensorflow import keras 
from tensorflow.keras import layers # 导入常见网络层类

x = tf.constant([2.,1.,0.1]) 
layer = layers.Softmax(axis=-1) # 创建 Softmax 层 
layer(x) # 调用 softmax 前向计算

2 网络容器

通过Keras 提供的网络容器 Sequential 将多个网络层封装成一个大网络模型,只需要调用网络模型的实例一次即可完成数据从第一层到最末层的顺序运算。

# 导入 Sequential 容器 
from tensorflow.keras import layers, Sequential 

network = Sequential([ # 封装为一个网络 
layers.Dense(3, activation=None), # 全连接层 
layers.ReLU(),#激活函数层 
layers.Dense(2, activation=None), # 全连接层 
layers.ReLU() #激活函数层
])
x = tf.random.normal([4,3]) network(x) # 输入从第一层开始,逐层传播至最末层

Sequential 容器也可以通过 add()方法继续追加新的网络层,实现动态创建网络的功能:

layers_num = 2 # 堆叠 2 次 
network = Sequential([]) # 先创建空的网络
for _ in range(layers_num):
	network.add(layers.Dense(3)) # 添加全连接层 
	network.add(layers.ReLU())# 添加激活函数层 
network.build(input_shape=(None, 4)) # 创建网络参数 
network.summary()

上述代码通过指定任意的 layers_num参数即可创建对应层数的网络结构,在完成网络创建时,很多类并没有创建内部权值张量等成员变量,此时通过调用类的 build 方法并指定输入大小,即可自动创建所有层的内部张量。通过 summary()函数可以方便打印出网络结构和参数量:

在这里插入图片描述
可以看到 Layer 列为每层的名字,这个名字由 TensorFlow内部维护,与 Python 的对象名不 一样,Param#列为层的参数个数,Total params 统计出了总的参数量,Trainable params 为 待优化的参数量,Non-trainable params 为不需要优化的参数量。

当我们通过 Sequential 容量封装多层网络层时,所有层的参数列表将会自动并入
Sequential 容器的参数列表中,不需要人为合并网络参数列表。Sequential 对象的 trainable_variables 和 variables 包含了所有层的待优化张量列表和全部张量列表:

In [3]: # 打印网络的待优化参数名与 
shape for p in network.trainable_variables: 
	print(p.name, p.shape)
Out[3]:
dense_2/kernel:0 (4, 3) 
dense_2/bias:0 (3,) 
dense_3/kernel:0 (3, 3) 
dense_3/bias:0 (3,)

参考自:tensorflow2.0中文教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值