1.使用现有的预训练模型
一种是线下训练,然后保存模型,线上加载运行。就是常规的模型部署。 一种是使用别人训练好共享出来的模型,加载到自己的业务场景中,适应性调整参数。这个过程美其名曰:迁移学习。如VGG16网络等。
from tensorflow.keras.applications import MobileNetV2
#使用Mobile netV2网络,input_shape是单张图片输入尺寸
#classes是分类数量
base=MobileNetV2(include_top=False, pooling='max',weights="imagenet",input_shape=(100,100,3),classes=12)
2.keras.sequential模式
就是将各个层按照特定顺序堆叠起来,灵活性差,它不能表示任意的神经网络结构,无法对中间计算得到的变量进行个性化的操作。
import tensorflow as tf
model = tf.keras.models.Sequential()
#需要加什么层,直接加就行
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(900,activation='relu6'))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Dense(360,activation='relu6',kernel_regularizer=tf.keras.regularizers.l2(0.1)))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Dense(100,activation='relu6',kernel_regularizer=tf.keras.regularizers.l2(0.1)))
model.add(tf.keras.layers.Dense(12, activation='softmax'))
3.FunctionalAPI函数建立模型(最常用,可构建复杂网络)
这种方式就是各个层都是一个函数,有明确的输入和输出,可以对输入和输出进行个性化的操作后,送入下一层,也可以复用。通过函数的叠加就可以实现,一般使用这种方法,将模型封装成一个模型函数
- 定义输入net_input=tf.keras.Input()类,设定输入的shape。
- 用函数式API构建网络结构,如l1=tf.keras.layers.Flatten()(net_input),最后得到输出层net_output
- 创建Model类,并传入输出与输出,如tf.keras.Model(inputs=net_input,outputs=net_output)
4.tf构建模型class
就是自定义层级结构,最灵活,当然灵活的代价是增加了代码量。自定义层级的class,需要继承父类Layers,TensorFlow2 自定义的层级需要实现3个函数init、buil、call。
init :初始化所有参数,根须需要设定层中的参数,比如输出的维度,卷积核数目和大小。
buil:(只有实现了此方法,才能用compile,否则,需要手写Gradentape的繁琐结构),对所有的可变参数进行定义
call:模型的计算过程,全部放这里