最近再用迁移学习做一些东西,但是发现Transfer Learning有好几种写法,且不同的写法,再最后deploy (部署)的时候,会出现不同的问题。,本文先介绍云端部署方式
云端部署推理(inference)
这种方式自由度应该是最高的,所以写法比较自由,可以相对简单。用model.summary()的时候,看不到被迁移的模型的细节,只有一个keras_layer 如果用resnet50 作为迁移方,那么这个位置就是resnet50,并没有resnet50里面的具体细节。
代码如下:
import tensorflow as tf
import tensorflow_hub
import numpy as np
######################载入数据######################
Image_size = 224
Batch_size = 64
datagen = tf.keras.preprocessing.image.ImageDataGenerator(
rescale=1. / 255,
validation_split=0.2
)
train_data = datagen.flow_from_directory(
'flower_photos/',
target_size=(Image_size, Image_size),
batch_size=Batch_size,
subset='training'
)
test_data = datagen.flow_from_directory(
'flower_photos/',
target_size=(Image_size, Image_size),
batch_size=Batch_size,
subset='validation'
)
######################载入模型&re-train模型######################
model_url = 'D:\Resource\Learning_Tensorflow\learning_savedmodel\efficientnet_b0_feature-vector_1'
feature_extractor_layer = tensorflow_hub.KerasLayer(
model_url,
input_shape=(Image_size, Image_size, 3)
)
feature_extractor_layer.trainable = False
model = tf.keras.models.Sequential([feature_extractor_layer,
tf.keras.layers.Dense(train_data.num_classes,
activation='softmax')])
model.summary()
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['acc'])
steps_per_epoch = np.ceil(train_data.samples / train_data.batch_size)
print(steps_per_epoch)
history = model.fit(train_data, epochs=5, steps_per_epoch=steps_per_epoch)
######################预测并且评估结果######################
class_names = sorted(test_data.class_indices.items(),
key=lambda pair: pair[1])
print(class_names)
class_names = np.array([key.title() for key, value in class_names])
print(class_names)
# for image_batch, label_batch in test_data:
# predicted_batch = model.predict(image_batch)
# predicted_id = np.argmax(predicted_batch, axis=-1)
# predicted_label_batch = class_names[predicted_id]
loss, accuracy = model.evaluate(test_data)
tf.keras.models.save_model(model, 'flower_model/')
print(loss, accuracy)
上述生成的模型也可以转成tflite
######################输出成TFlite######################
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
with open('flower.tflite', 'wb') as f:
f.write(tflite_model)
注意这里面训练数据文件夹是这样的flower_photo ,每个种类的数据放在一个文件夹下。