如何为TensorFlow 2.0中Keras Sequential模型的层添加自定义名称
在TensorFlow Keras Sequential模型中设置并保留自定义层名称
看起来你遇到的问题是明明给Flatten层指定了自定义名称bla,但在另一个文件加载模型后,层名却变成了默认的flatten。这大概率是因为你在另一个文件中调用的create_model()函数里,没有给Flatten层设置相同的name参数——当你用save_weights_only=True保存权重时,权重文件只存储权重数值,不会记录模型结构和层名称,所以加载权重时完全依赖你重新创建的模型结构,层名称会以新创建的模型为准。
下面是具体的解决方法:
统一所有场景下的模型层名称
不管是训练模型的文件,还是加载模型的文件,你的create_model()函数里的对应层必须明确设置相同的name参数。比如你的Flatten层必须保留name="bla":def create_model(): model = keras.Sequential([ # 务必保留自定义name参数 keras.layers.Flatten(input_shape=(28,28), name="bla"), keras.layers.Dense(128, kernel_regularizer=keras.regularizers.l2(REGULARIZE), activation="relu"), keras.layers.Dropout(DROPOUT_RATE), keras.layers.Dense(128, kernel_regularizer=keras.regularizers.l2(REGULARIZE), activation="relu"), keras.layers.Dropout(DROPOUT_RATE), keras.layers.Dense(10, activation="softmax") ]) model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"]) return model这样,无论在哪个文件调用
create_model()生成模型,Flatten层的名称都会是bla,加载权重后提取层名就能得到你预期的结果。验证层名称是否生效
你可以在创建模型后立刻打印层名,确认自定义名称是否正确设置:model = create_model() print([layer.name for layer in model.layers]) # 预期输出: ['bla', 'dense', 'dropout', 'dense_1', 'dropout_1', 'dense_2']如果输出里没有
bla,说明你的create_model()函数里确实遗漏了name参数,补加上即可。可选:保存完整模型来避免结构不一致问题
如果你不想手动维护多个文件中的模型结构一致,可以选择保存完整模型(而非仅权重),这样加载时不需要重新定义create_model(),直接加载就能保留所有层的自定义名称:# 训练时保存完整模型 model.save("my_mnist_model.h5") # 加载时直接读取完整模型 from tensorflow import keras model = keras.models.load_model("my_mnist_model.h5") print([layer.name for layer in model.layers]) # 会包含你设置的'bla'这种方式更省心,适合需要保留完整模型配置的场景。
内容的提问来源于stack exchange,提问作者Gilfoyle
相关产品推荐
相关产品推荐

