如何将Keras动漫人脸分类模型权重迁移至PyTorch
问题:Keras动漫人脸分类模型卷积层权重迁移到PyTorch的方法
我正在开发一个动漫人脸相似度检测项目,自行训练模型未取得明显进展,因此决定采用已训练好的模型进行微调。找到一个基于VGG16的Keras模型,下载了其.hdf5权重文件,无法直接转换为.pt格式,因此在PyTorch中构建了对应的VGG16结构。目前已能在Keras中加载权重,但仅了解如何为全连接层赋值Keras权重,不清楚卷积层的权重迁移方法,恳请指导。
Keras原模型结构
N_CATEGORIES = 203 IMAGE_SIZE = 224 input_tensor = Input(shape=(IMAGE_SIZE, IMAGE_SIZE, 3)) base_model = VGG16(weights='imagenet', include_top=False,input_tensor=input_tensor) x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(1024, activation='relu')(x) predictions = Dense(N_CATEGORIES, activation='softmax')(x) model = Model(inputs=base_model.input, outputs=predictions) for layer in base_model.layers[:15]: layer.trainable = False
Keras模型摘要
Model: "model_1" Layer (type) Output Shape Param input_1 (InputLayer) [(None, 224, 224, 3)] 0 block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 global_average_pooling2d_1 (None, 512) 0 (GlobalAveragePooling2D) dense_1 (Dense) (None, 1024) 525312 dense_2 (Dense) (None, 203) 208075 =================================================================
PyTorch构建的对应模型
import torch import torch.nn as nn class CustomModel(nn.Module): def __init__(self): super(CustomModel, self).__init__() self.block1 = nn.Sequential( nn.Conv2d(3, 64, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(64, 64, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) ) self.block2 = nn.Sequential( nn.Conv2d(64, 128, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(128, 128, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) ) self.block3 = nn.Sequential( nn.Conv2d(128, 256, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(256, 256, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(256, 256, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) ) self.block4 = nn.Sequential( nn.Conv2d(256, 512, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) ) self.block5 = nn.Sequential( nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(512, 512, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) ) self.global_avg_pool = nn.AdaptiveAvgPool2d((1, 1)) self.fc1 = nn.Linear(512, 1024) self.fc2 = nn.Linear(1024, 203) def forward(self, x): x = self.block1(x) x = self.block2(x) x = self.block3(x) x = self.block4(x) x = self.block5(x) x = self.global_avg_pool(x) x = torch.flatten(x, 1) x = self.fc1(x) x = self.fc2(x) return x pytorch_model = CustomModel()
已完成的Keras权重加载代码
from keras.models import load_model model = load_model('animeface_vgg16.hdf5') weights=model.get_weights()
核心需求
目前仅掌握全连接层的Keras权重赋值方法,需要指导如何将Keras模型中的卷积层权重迁移到PyTorch的对应模型中。
内容的提问来源于stack exchange,提问作者Maximax67
相关产品推荐
相关产品推荐

