TensorFlow2学习 - 0.Overall & 1.Model
Q1:学习目标?
A1:了解新版TensorFlow的主要模块,能够完成数据预处理、模型搭建、模型训练、监控等功能的实现;感受一个机器学习框架的设计结构
Q2:怎么学?
A2:此前按照一些网课粗略地学习了一些,当前阶段计划从TF官网的API文档和Keras的API文档中学习
Q3:学习重点?
A3:主要是tf.keras部分的使用
Q4:如何介绍一个class?
A4:
- Describe a class with a few words
- list key methods(usage、parameters、return)
- list key attributes
- how to subclass it?
modules list
- Tensor & opr
- tf.keras
- tf.data
- TensorBoard
tf.keras
Content
- Models
- Layers
- Activations
- Callback Funcs
- Data preprocessing
- Optimizers
- Metrics
- Losses
- Datasets
- Backbones
Models
主要内容
- how to subclass a Model class?
- Sequential
- how to train a model?
- save & load a model
tf.keras.Model
Description
通常将一个网络模型用Model封装
如果比较简单可以用Sequential或Model方法描述输入输出流程
如果模型比较复杂会实现一个继承子类
Method
Model(inputs,outputs,name)
tf.keras.Model()
是Model类的构造函数,如果直接用这个构造函数来建立模型,一般需定义tf.keras.Input
作为inputs,再实现计算过程,将out作为Model的outputs
import tensorflow as tf
inputs = tf.keras.Input(shape=(3,))
x = tf.keras.layers.Dense(4, activation=tf.nn.relu)(inputs)
outputs = tf.keras.layers.Dense(5, activation=tf.nn.softmax)(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
model.summary()
输出网络结构(主要是各层的name以及维度),可以选择
print_fn
model.get_layer(name = None, index = None)
用name或index获取某一层
Attribute
model.weight
列出模型中所有权值(可训练的+不可训练的)
Subclass
继承Model需要实现__init__
方法和call
方法
其中__init__
主要是定义一些layer或者其他设置,并且要显示调用父类的初始化函数super(MyModel, self).__init__()
call有两个形参:inputs和training(boolean),此处实现用inputs计算outputs的过程,返回outputs
import tensorflow as tf
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu)
self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax)
def call(self, inputs):
x = self.dense1(inputs)
return self.dense2(x)
model = MyModel()
tf.keras.Sequential
Description
用来封装线性堆叠层的模型,应该继承自Model
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(8, input_shape=(16,)))
model.add(tf.keras.layers.Dense(4))
Method
Sequential.add(layer)
Sequential.pop()
弹出最后一层
Sequential.build()
可能add时没有指定输入数据的维度,需要build显示指定一下
Training APIs
Description
compile
fit
evluate
predict
train_on_batch
test_on_batch
predict_on_batch
Method
compile
配置训练过程,此处需要指定:优化器、损失、metric等
Model.compile( optimizer="rmsprop", loss=None, metrics=None, loss_weights=None, weighted_metrics=None, run_eagerly=None, **kwargs )
fit
进行模型训练,此处需要指定:数据、标注、batch_size、epoch、callback等
Model.fit( x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None, validation_batch_size=None, validation_freq=1, max_queue_size=10, workers=1, use_multiprocessing=False, )
- x:numpy tensor tf.data generator keras.utils.Sequence
- y:当x中有标注时y可以不用指定
- shuffle
- initial_epoch:integer
- workers:多worker供数据,需要数据是generator或keras.utils.Sequence类型
- use_multiprocessing:多进程供数据
- Return:返回History 主要记录每一次epoch训练的结果,结果包含loss以及acc的值
evluate
通常在fit后做evluate,拿到一些结果指标,默认返回loss和metric组成的list,也可以设置返回dict
Model.evaluate( x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False, return_dict=False, )
predict
如果数据量比较小,可以直接用
model(x)
, ormodel(x, training=False)
Model.predict( x, batch_size=None, verbose=0, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False, )
train_on_batch
test_on_batch
predict_on_batch
train or test or predict a single batch
Model.train_on_batch( x, y=None, sample_weight=None, class_weight=None, reset_metrics=True, return_dict=False, ) Model.test_on_batch( x, y=None, sample_weight=None, reset_metrics=True, return_dict=False ) Model.predict_on_batch(x)
Save & Load
主要介绍模型的加载与保存
TensorFlow保存格式为hdf5或tf,一般1.x版默认保存格式为h5,2.x版本默认保存为tf,时间+epoch+loss为文件名
Mothods
Model.save
保存网络的拓扑逻辑、参数、优化状态
Model.save( filepath, overwrite=True, include_optimizer=True, save_format=None, # 'tf' or 'h5' signatures=None, options=None, )
tf.keras.models.load_model
tf.keras.models.load_model(filepath, custom_objects=None, compile=True)
clone_model
拷贝一个网络
tf.keras.models.clone_model(model, input_tensors=None, clone_function=None)
others
如果有需求比如只初始化网络头部,可以尝试
get_weights
、set_weights
、load_weights
等