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_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), or- model(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等
 
         
                   
                   
                   
           
              