在Github上已经针对图像、NLP等不同任务训练了许多模型。我如何导入这些模型的权重,并在它们之上构建自定义模型?我应该从头开始为他们建立一个模型,并匹配每一层的数量和形状吗?或者我应该如何进行?
例如,假设我在下面训练了CNN模型,那么如何转移它,并在以后与其他自定义层(例如,不同的输入形状(一起使用它?
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt
(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()
# Normalize pixel values to be between 0 and 1
train_images, test_images = train_images / 255.0, test_images / 255.0
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
history = model.fit(train_images, train_labels, epochs=10,
validation_data=(test_images, test_labels))
您应该能够保存这样的模型:model.save('my_model.h5')
和类似的负载模型:new_model = tf.keras.models.load_model('my_model.h5')
所以求和可以得到一个*.h5格式的github模型,只需加载它,然后用new_model.summary()
就可以看到模型。在进行迁移学习时,你通常想冻结第一层,只训练最后几层,你可以这样做:new_model.trainable = False
冻结整个模型并:
for layer in new_model.layers[-3:]:
layer.trainable = True
解冻最后三层