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_fnmodel.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_batchtest_on_batchpredict_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_batchtest_on_batchpredict_on_batchtrain 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_modeltf.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等