目录
1.Keras简介
Keras是一个主要由 Python语言开发的开源神经网络计算库,最初由 François Chollet
编写,它被设计为高度模块化和易扩展的高层神经网络接口,使得用户可以不需要过多的专业知识就可以简洁、快速地完成模型的搭建与训练。Keras库分为前端和后端,其中后端一般是调用现有的深度学习框架实现底层运算,如 Theano、CNTK、TensorFlow等,前端接口是 Keras抽象过的一组统一接口函数。用户通过 Keras编写的代码可以轻松的切换不同的后端运行,灵活性较大。
Keras与 tf.keras有什么区别与联系呢?
其实 Keras可以理解为一套搭建与训练神经网络的高层 API协议,Keras本身已经实现了此协议,安装标准的 Keras库就可以方便地调用TensorFlow、CNTK等后端完成加速计算;
在 TensorFlow中,也实现了一套 Keras协议,即 tf.keras,它与 TensorFlow深度融合,且只能基于 TensorFlow后端运算,并对TensorFlow的支持更完美。对于使用 TensorFlow的开发者来说,tf.keras可以理解为一个普通的子模块,与其他子模块,如 tf.math,tf.data等并没有什么差别。
2.常见功能模块
Keras提供了一系列高层的神经网络相关类和函数,如经典数据集加载函数、网络层
类、模型容器、损失函数类、优化器类、经典模型类等。
2.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 from tensorflow import keras from tensorflow.keras import layers #创建Softmax层,并调用__call__方法实现前向传播 x = tf.constant([2.,1.,0.1]) #创建输入张量 layer = layers.Softmax(axis=-1) #创建Softmax层 out = layer(x) #调用softmax前向计算,输出为out print(out) #直接使用函数 out_func = tf.nn.softmax(x) print(out_func) #打印out tf.Tensor([0.6590011 0.24243298 0.09856588], shape=(3,), dtype=float32) tf.Tensor([0.6590011 0.24243298 0.09856588], shape=(3,), dtype=float32)
2.2 网络容器
对于常见的网络,需要手动调用每一层的类实例完成前向传播运算,当网络层数变得较深时,这一部分代码显得非常臃肿。
可以通过 Keras提供的网络容器 Sequential将多个网络层封装成一个大网络模型,只需要调用网络模型的实例一次即可完成数据从第一层到最末层的顺序传播运算。如:
#导入Sequential容器 import tensorflow as tf from tensorflow import keras 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]) #输出,输入从第一层开始,逐层传播至输出层,并返回输出层的输出 out = network(x) # print(out) #Sequential容器也可以通过add()方法追加新的网络层 #堆叠两次 layers_num = 2 #先创建空的网络容器 network = Sequential([]) for i in range(layers_num): network.add(layers.Dense(3)) #添加全连接层 network.add(layers.ReLU()) #添加激活函数 network.build(input_shape=(4,4)) #创建网络参数 network.summary() #通过 summary()函数可以方便打印出网络结构和参数量 #输出: Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_2 (Dense) (4, 3) 15 re_lu_2 (ReLU) (4, 3) 0 dense_3 (Dense) (4, 3) 12 re_lu_3 (ReLU) (4, 3) 0 ================================================================= Total params: 27 Trainable params: 27 Non-trainable params: 0 _________________________________________________________________
Layer列为每层的名字,这个名字由 TensorFlow内部维护,与 Python的对象名并不一样。
Param#列为层的参数个数,
Total params项统计出了总的参数量,
Trainable params为总的待优化参数量,
Non-trainable params为总的不需要优化的参数量。
当我们通过 Sequential容量封装多个网络层时,每层的参数列表将会自动并入Sequential容器的参数列表中,不需要