1 模型构建-Model与Layer
在 TensorFlow 中,推荐使用 Keras( tf.keras)构建模型。Keras 是一个广为流行的高级神经网络 API,简单、快速而不失灵活性,现已得到 TensorFlow 的官方内置和全面支持。
Keras 有两个重要的概念: 模型(Model) 和 层(Layer) 。
- 层将各种计算流程和变量进行了封装(例如基本的全连接层,CNN 的卷积层、池化层等)
- Keras 在tf.keras.layers下内置了深度学习中大量常用的的预定义层,同时也允许我们自定义层。
- 模型则将各种层进行组织和连接,并封装成一个整体,描述了如何将输入数据通过各种层以及运算而得到输出。在需要模型调用的时候,使用y_pred = model(X)的形式即可。
Keras 模型以类的形式呈现,我们可以通过继承 tf.keras.Model这个 Python 类来定义自己的模型。在继承类中,我们需要重写 __init__()(构造函数,初始化)和 call(input) (模型调用)两个方法,同时也可以根据需要增加自定义的方法。
class MyModel(tf.keras.Model):
def __init__(self):
super().__init__()
# 此处添加初始化代码(包含 call 方法中会用到的层),例如
# layer1 = tf.keras.layers.BuiltInLayer(...)
# layer2 = MyCustomLayer(...)
def call(self, input):
# 此处添加模型调用的代码(处理输入并返回输出),例如
# x = layer1(input)
# output = layer2(x)
return output
# 还可以添加自定义的方法
继承 tf.keras.Model 后,我们同时可以使用父类的若干方法和属性,例如在实例化类 model = Model()后,可以通过 model.variables 这一属性直接获得模型中的所有变量,免去我们一个个显式指定变量的麻烦。
对于上面的 y_pred = w * X + b ,我们可以通过模型类的方式编写如下:
import tensorflow as tf
X = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
y = tf.constant([[10.0], [20.0]])
# 1、构建线性模型
class Linear(tf.keras.Model):
def __init__(self):
super().__init__()
self.dense = tf.keras.layers.Dense(
units=1,
activation=None,
kernel_initializer=tf.zeros_initializer(),
bias_initializer=tf.zeros_initializer()
)
def call(self, input):
output = self.dense(input)
return output
# 以下代码结构与前节类似
model = Linear()
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
for i in range(100):
with tf.GradientTape() as tape:
y_pred = model(X)
loss = 0.5 * tf.reduce_mean(tf.square(y_pred - y))
# 使用 model.variables 这一属性直接获得模型中的所有变量
grads = tape.gradient(loss, model.variables)
optimizer.apply_gradients(grads_and_vars=zip(grads, model.variables))
print(model.variables)
这里,我们没有显式地声明a 和 b 两个变量并写出 y_pred = w x X + b 这一线性变换,而是建立了一个继承了 tf.keras.Model 的模型类 Linear 。这个类在初始化部分实例化了一个 全连接层 ( tf.keras.layers.Dense ),并在 call 方法中对这个层进行调用,实现了线性变换的计算。
1.2 Keras 当中的layer(层)接口在 Keras 中,您可以通过组合层来构建模型。模型(通常)是由层构成的图。最常见的模型类型是层的堆叠,keras.layers中就有很多模型
from tensorflow.python.keras.layers import Dense from tensorflow.python.keras.layers import DepthwiseConv2D from tensorflow.python.keras.layers import Dot from tensorflow.python.keras.layers import Dropout from tensorflow.python.keras.layers import ELU from tensorflow.python.keras.layers import Embedding from tensorflow.python.keras.layers import Flatten from tensorflow.python.keras.layers import GRU from tensorflow.python.keras.layers import GRUCell from tensorflow.python.keras.layers import LSTMCell
Dense:添加一层神经元
Dense(units,activation=None,**kwargs)
- units:神经元个数
- activation:激活函数,参考tf.nn.relu,tf.nn.softmax,tf.nn.sigmoid,tf.nn.tanh
- **kwargs:输入上层输入的形状,input_shape=()
Model(inputs=a, outputs=b)
- inputs:定义模型的输入,Input类型
- outpts:定义模型的输出
- def call(self, inputs):接收来自上层的输入
Models属性
- model.layers:获取模型结构列表
print(model.layers) [, , , ]
model.inputs: 模型的输入张量列表
print(model.inputs) []
- model.outputs 模型的输出张量列表
print(model.outputs) []
- model.summary():打印模型的摘要表示
Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 _________________________________________________________________ dense (Dense) (None, 64) 50240 _________________________________________________________________ dense_1 (Dense) (None, 128) 8320 _________________________________________________________________ dense_2 (Dense) (None, 10) 1290 ================================================================= Total params: 59,850 Trainable params: 59,850 Non-trainable params: 02 案例:多层感知机(MLP)识别Mnist手写数字
一个最简单的多层感知机(Multilayer Perceptron, MLP),或者说 “多层全连接神经网络” 开始,介绍 TensorFlow 的模型编写方式。
目的:我们使用多层感知机完成 MNIST 手写体数字图片数据集的分类任务
步骤:
- 1、使用 tf.keras.datasets 获得数据集并预处理
- 2、使用 tf.keras.Model 和 tf.keras.layers 构建模型
- 3、构建模型训练流程,使用 tf.keras.losses 计算损失函数,并使用 tf.keras.optimizer 优化模型
- 4、构建模型评估流程,使用 tf.keras.metrics 计算评估指标



