以下是使用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}")