tensorflow框架加载训练好的模型,冻结最后一层网络,继续添加新的卷积神经网络

发布于:2025-06-30 ⋅ 阅读:(23) ⋅ 点赞:(0)

以下是使用TensorFlow加载预训练模型、冻结最后一层并添加新卷积层的完整代码示例:


import tensorflow as tf
from tensorflow.keras import layers, models

# 1. 加载预训练模型(以ResNet50为例)
base_model = tf.keras.applications.ResNet50(
    weights='imagenet',
    include_top=False,
    input_shape=(224, 224, 3)
)

# 2. 冻结基础模型的所有层
base_model.trainable = False

# 3. 添加新的网络结构
inputs = tf.keras.Input(shape=(224, 224, 3))
x = base_model(inputs, training=False)  # 确保基础模型在推理模式
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(256, activation='relu')(x)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(10, activation='softmax')(x)  # 假设新任务有10类

# 4. 构建完整模型
model = tf.keras.Model(inputs, outputs)

# 5. 编译模型
model.compile(
    optimizer=tf.keras.optimizers.Adam(0.001),
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

# 打印模型结构
model.summary()

这段代码展示了如何加载ResNet50预训练模型,冻结其所有权重,然后添加新的全局池化层、全连接层和输出层。最后编译模型准备进行新任务的训练。

要加载自己训练的CNN模型替代ResNet50,你需要使用tf.keras.models.load_model()加载保存的.h5或SavedModel格式模型。以下是修改后的完整代码:


import tensorflow as tf
from tensorflow.keras import layers, models

# 1. 加载自定义训练好的模型
custom_model = tf.keras.models.load_model('path/to/your_model.h5')  # 替换为你的模型路径

# 2. 移除原模型的最后一层(假设最后一层是分类层)
custom_model = tf.keras.Model(
    inputs=custom_model.input,
    outputs=custom_model.layers[-2].output  # 取倒数第二层作为新输出
)

# 3. 冻结基础模型的所有层
custom_model.trainable = False

# 4. 添加新的网络结构
inputs = tf.keras.Input(shape=custom_model.input_shape[1:])  # 自动匹配输入尺寸
x = custom_model(inputs, training=False)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(256, activation='relu')(x)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(10, activation='softmax')(x)  # 新任务输出层

# 5. 构建完整模型
model = tf.keras.Model(inputs, outputs)

# 6. 编译模型
model.compile(
    optimizer=tf.keras.optimizers.Adam(0.001),
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

model.summary()

上述代码会加载你的自定义模型,冻结其权重,移除原输出层后添加新的分类层。注意替换模型路径和调整输入/输出尺寸。

以下是加载预训练模型、冻结最后一层并进行预测的完整代码实现:


import tensorflow as tf
import numpy as np

# 1. 加载预训练模型
model = tf.keras.models.load_model('path/to/your_model.h5')

# 2. 冻结最后一层
last_layer = model.layers[-1]
last_layer.trainable = False

# 3. 准备测试数据(示例数据,需替换为实际数据)
test_data = np.random.rand(10, *model.input_shape[1:])  # 10个样本

# 4. 进行预测
predictions = model.predict(test_data)

# 5. 输出预测结果
print("预测结果:")
for i, pred in enumerate(predictions):
    print(f"样本{i}: 预测类别={np.argmax(pred)}, 各类别概率={pred}")


网站公告

今日签到

点亮在社区的每一天
去签到