在 TensorFlow Functional API 中保存和加载具有相同图形的多个模型
Saving and loading multiple models with the same graph in TensorFlow Functional API
在 TensorFlow Functional API 指南中,有一个示例显示了使用相同层图创建多个模型的情况。 (https://www.tensorflow.org/beta/guide/keras/functional#using_the_same_graph_of_layers_to_define_multiple_models)
encoder_input = keras.Input(shape=(28, 28, 1), name='img')
x = layers.Conv2D(16, 3, activation='relu')(encoder_input)
x = layers.Conv2D(32, 3, activation='relu')(x)
x = layers.MaxPooling2D(3)(x)
x = layers.Conv2D(32, 3, activation='relu')(x)
x = layers.Conv2D(16, 3, activation='relu')(x)
encoder_output = layers.GlobalMaxPooling2D()(x)
encoder = keras.Model(encoder_input, encoder_output, name='encoder')
encoder.summary()
x = layers.Reshape((4, 4, 1))(encoder_output)
x = layers.Conv2DTranspose(16, 3, activation='relu')(x)
x = layers.Conv2DTranspose(32, 3, activation='relu')(x)
x = layers.UpSampling2D(3)(x)
x = layers.Conv2DTranspose(16, 3, activation='relu')(x)
decoder_output = layers.Conv2DTranspose(1, 3, activation='relu')(x)
autoencoder = keras.Model(encoder_input, decoder_output, name='autoencoder')
autoencoder.summary()
是否可以在共享同一个图表的同时保存和加载这两个模型?如果我按以下方式保存和加载它们:
# Save
encoder.save('encoder.h5')
autoencoder.save('autoencoder.h5')
# Load
new_encoder = keras.models.load_model('encoder.h5')
new_autoencoder = keras.models.load_model('autoencoder.h5')
新的编码器和自动编码器将不再共享同一个图,因此不再一起训练。
这是个很酷的问题。编码器和自动编码器不再共享同一个图,因为它们被保存为不相交的模型。事实上,encoder
被保存了两次,因为它也嵌入了 autoencoder
.
要在恢复两个模型的同时仍然共享同一个图表,我建议采用以下方法:
命名encoder
的输出层。例如:
encoder_output = layers.GlobalMaxPooling2D(name='encoder_output')(x)
只保存autoencoder
:
autoencoder.save('autoencoder.h5')
还原 autoencoder
:
new_autoencoder = keras.models.load_model('autoencoder.h5')
从恢复的 autoencoder
重建 encoder
的图,以便它们共享公共层:
encoder_input = new_autoencoder.get_layer('img').input
encoder_output = new_autoencoder.get_layer('encoder_output').output
new_encoder = keras.Model(encoder_input, encoder_output)
或者,您也可以 save/load 权重并手动重建图表。
在 TensorFlow Functional API 指南中,有一个示例显示了使用相同层图创建多个模型的情况。 (https://www.tensorflow.org/beta/guide/keras/functional#using_the_same_graph_of_layers_to_define_multiple_models)
encoder_input = keras.Input(shape=(28, 28, 1), name='img')
x = layers.Conv2D(16, 3, activation='relu')(encoder_input)
x = layers.Conv2D(32, 3, activation='relu')(x)
x = layers.MaxPooling2D(3)(x)
x = layers.Conv2D(32, 3, activation='relu')(x)
x = layers.Conv2D(16, 3, activation='relu')(x)
encoder_output = layers.GlobalMaxPooling2D()(x)
encoder = keras.Model(encoder_input, encoder_output, name='encoder')
encoder.summary()
x = layers.Reshape((4, 4, 1))(encoder_output)
x = layers.Conv2DTranspose(16, 3, activation='relu')(x)
x = layers.Conv2DTranspose(32, 3, activation='relu')(x)
x = layers.UpSampling2D(3)(x)
x = layers.Conv2DTranspose(16, 3, activation='relu')(x)
decoder_output = layers.Conv2DTranspose(1, 3, activation='relu')(x)
autoencoder = keras.Model(encoder_input, decoder_output, name='autoencoder')
autoencoder.summary()
是否可以在共享同一个图表的同时保存和加载这两个模型?如果我按以下方式保存和加载它们:
# Save
encoder.save('encoder.h5')
autoencoder.save('autoencoder.h5')
# Load
new_encoder = keras.models.load_model('encoder.h5')
new_autoencoder = keras.models.load_model('autoencoder.h5')
新的编码器和自动编码器将不再共享同一个图,因此不再一起训练。
这是个很酷的问题。编码器和自动编码器不再共享同一个图,因为它们被保存为不相交的模型。事实上,encoder
被保存了两次,因为它也嵌入了 autoencoder
.
要在恢复两个模型的同时仍然共享同一个图表,我建议采用以下方法:
命名
encoder
的输出层。例如:encoder_output = layers.GlobalMaxPooling2D(name='encoder_output')(x)
只保存
autoencoder
:autoencoder.save('autoencoder.h5')
还原
autoencoder
:new_autoencoder = keras.models.load_model('autoencoder.h5')
从恢复的
autoencoder
重建encoder
的图,以便它们共享公共层:encoder_input = new_autoencoder.get_layer('img').input encoder_output = new_autoencoder.get_layer('encoder_output').output new_encoder = keras.Model(encoder_input, encoder_output)
或者,您也可以 save/load 权重并手动重建图表。