tensorflow模型建立
一、一般模型搭建
1、使用sequential建立模型
data_augmentation = keras.Sequential([ layers.experimental.preprocessing.RandomFlip("horizontal", input_shape=(img_height, img_width,3)), layers.experimental.preprocessing.RandomRotation(0.1), layers.experimental.preprocessing.RandomZoom(0.1), ]) #数据增强
model = Sequential([
data_augmentation,
layers.experimental.preprocessing.Rescaling(1./255),
layers.Conv2D(16, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Conv2D(32, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Conv2D(64, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Dropout(0.2), #正则化dropout
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dense(num_classes)
])
二、预训练模型+top层添加分类层
1、获取keras模型
IMG_SIZE = (160, 160) IMG_SHAPE = IMG_SIZE + (3,) base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE, include_top=False, weights='imagenet')
2、通过Keras Functional API来构建模型
inputs = tf.keras.Input(shape=(160, 160, 3)) x = data_augmentation(inputs) #数据增强 x = preprocess_input(x) #重新缩放,模型要求数据范围在[-1, 1] x = base_model(x, training=False) #因为我们的模型包含一个 BatchNormalization 层,所以training=False x = global_average_layer(x) #base_model层 x = tf.keras.layers.Dropout(0.2)(x) # outputs = prediction_layer(x) #特征提取层 model = tf.keras.Model(inputs, outputs) #
3、training=False设置(必须先训练模型,后微调)
1)训练
(1)预训练网络的权重在训练期间没有更新
(2)
将预训练模型部分设置train=false
x = base_model(x, training=False)
2)微调
(1)进一步提高性能的一种方法是微调预训练模型顶层的权重以及您添加的分类器的训练
(2)只有在已经训练过顶层分类器(即将预训练模型设置为不可训练的训练),才可以进行微调,要不然梯度幅度将太大
(3)尝试微调少量顶层,而不是整个预训练模型(MobileNet模型等)。前几层学习非常简单和通用的特征;层越高,越专业。
base_model.trainable = True print("Number of layers in the base model: ", len(base_model.layers)) fine_tune_at = 100 for layer in base_model.layers[:fine_tune_at]: #从第100层开始训练 layer.trainable = False
三、用tensorflow hub进行迁移学习
1、分类器:直接预测
IMAGE_SHAPE = (224, 224) classifier = tf.keras.Sequential([ hub.KerasLayer(classifier_model, input_shape=IMAGE_SHAPE+(3,)) #classifier_model是模型TensorFlow Hub的模型路径,如下图 ])
2、the headless model:可训练
feature_extractor_layer = hub.KerasLayer( feature_extractor_model, input_shape=(224, 224, 3), trainable=False) #迁移学习,这里冻结特征提取层参数,训练仅仅修改分类层参数 num_classes = len(class_names) model = tf.keras.Sequential([ feature_extractor_layer, #添加特征提取层 tf.keras.layers.Dense(num_classes) #添加分类层 ])