Tensorflow学习笔记:模型建立与训练篇
一. Python 函数装饰器
装饰器:修改其他函数的功能的函数
def hello(a_func()):
def first():
print("hello,")
a_func()
print("my friend!")
return first
def name():
print("Penny,")
name = hello(name)
可以创建嵌套的函数
在将函数作为参数返回的时候:
- 若把一对小括号放在函数名后面,这个函数就会执行
- 若不放括号在函数名后面,那它函数名可以被到处传递,并且可以赋值给别的变量而不去执行函数
@:一个简短的方式来生成一个被装饰的函数[1]
@hello
def name():
print("Penny,")
二. 模型(Model)与层(Layer)
在 TensorFlow 中,推荐使用 Keras(tf.keras
)构建模型
Keras 是一个广为流行的高级神经网络 API,简单、快速而不失灵活性,现已得到 TensorFlow 的官方内置和全面支持。[2]
模型和层是Keras里两个重要的概念:
- 层:封装各种计算流程和变量
- 模型:将各种层进行组织和连接,并封装成一个整体
使用 y_pred = model(x) 的形式进行模型调用,tf.keras.layers 内置了深度学习中大量常用的的预定义层
Keras 模型以类的形式呈现,通过继承 tf.keras.Model 这个类来定义模型;继承类的时候,需要重写_init_() 和 call(input) 两个方法,也可自己添加方法[2]
class MyModel(tf.keras.Model):
def __init__(self):
super().__init__() # Python 2 下使用 super(MyModel, self).__init__()
# 此处添加初始化代码(包含 call 方法中会用到的层),例如
# layer1 = tf.keras.layers.BuiltInLayer(...)
# layer2 = MyCustomLayer(...)
def call(self, input):
# 此处添加模型调用的代码(处理输入并返回输出),例如
# x = layer1(input)
# output = layer2(x)
return output
# 还可以添加自定义的方法

Keras 模型类定义示意图 - https://tf.wiki/zh_hans/basic/models.html
继承tf.keras.Model后,可以调用父类的方法和属性,通过 model.variables 可直接获得模型中的所有变量
class Linear(tf.keras.Model): # 建立了一个继承了 tf.keras.Model 的模型类 Linear
def __init__(self):
super().__init__()
self.dense = tf.keras.layers.Dense( # 实例化了一个 全连接层
units=1, # 输出张量的维度
activation=None, # 激活函数,默认为无激活函数 a(x) = x
kernel_initializer=tf.zeros_initializer(), # 权重矩阵kernel的初始化器,默认为tf.glorot_uniform_initializer
bias_initializer=tf.zeros_initializer() # 偏置向量bias的初始化器,默认为tf.glorot_uniform_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) # 调用模型 y_pred = model(X) 而不是显式写出 y_pred = a * X + b
loss = tf.reduce_mean(tf.square(y_pred - y))
grads = tape.gradient(loss, model.variables) # 使用 model.variables 这一属性直接获得模型中的所有变量
optimizer.apply_gradients(grads_and_vars=zip(grads, model.variables))
print(model.variables)
可以看出,并不需要显式地声明a和b,也不需要声明线性变换 y_pred=a*X+b
全连接层 tf.keras.layers.Dense :对输入矩阵进行线性变换 + 激活函数操作
- 给定输入张量 input=[batch_size,input_dim] ,先进行 tf.matmul(input,kernel)+bias 的线性变换,再将线性变换后张量的每个元素通过激活函数 activation,得到二维张量[batch_size,units]
- 常用的激活函数包括 tf.nn.relu 、 tf.nn.tanh 和 tf.nn.sigmoid
- 如果不指定激活函数,即是纯粹的线性变换
- use_bias:是否加入偏置向量,默认为True
- tf.zeros_initializer 表示将变量初始化为全 0
- kernel=[input_dim,units] 和 bias=[units] 为两个可训练变量
三. 示例:多层感知机(MLP)
1. 使用
tf.keras.datasets
获得数据集并预处理
2. 使用tf.keras.Model
和tf.keras.layers
构建模型
3. 构建模型训练流程,使用tf.keras.losses
计算损失函数,并使用tf.keras.optimizer
优化模型
4. 构建模型评估流程,使用tf.keras.metrics
计算评估指标[2]
(未完待续)
参考
- ^Python 函数装饰器 https://www.runoob.com/w3cnote/python-func-decorators.html
- ^abcTensorFlow 模型建立与训练 https://tf.wiki/zh_hans/basic/models.html
参考
- ^Python 函数装饰器 https://www.runoob.com/w3cnote/python-func-decorators.html
- ^abcTensorFlow 模型建立与训练 https://tf.wiki/zh_hans/basic/models.html
THE END